Repository: calcite-avatica Updated Branches: refs/heads/master 3f0e5afe2 -> 310f6a640
[CALCITE-2676] Add release script and docker-compose.yml to support building a release using docker Project: http://git-wip-us.apache.org/repos/asf/calcite-avatica/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite-avatica/commit/310f6a64 Tree: http://git-wip-us.apache.org/repos/asf/calcite-avatica/tree/310f6a64 Diff: http://git-wip-us.apache.org/repos/asf/calcite-avatica/diff/310f6a64 Branch: refs/heads/master Commit: 310f6a64076850362b2e2e2b31e8af79d2bc92d5 Parents: 3f0e5af Author: Francis Chuang <[email protected]> Authored: Fri Nov 16 10:05:45 2018 +1100 Committer: Francis Chuang <[email protected]> Committed: Fri Nov 16 13:56:02 2018 +1100 ---------------------------------------------------------------------- docker-compose.yml | 44 ++++++++++ release.sh | 222 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 266 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/310f6a64/docker-compose.yml ---------------------------------------------------------------------- diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..a2d9fd4 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,44 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +version: '3' +services: + dry-run: + image: maven:alpine + working_dir: /src + command: sh -c "./release.sh dry-run" + volumes: + - .:/src + - maven-repo:/root/.m2 + + release: + image: maven:alpine + working_dir: /src + command: sh -c "./release.sh release" + volumes: + - .:/src + - maven-repo:/root/.m2 + + clean: + image: maven:alpine + working_dir: /src + command: sh -c "./release.sh clean" + volumes: + - .:/src + - maven-repo:/root/.m2 +volumes: + maven-repo: + +# End docker-compose.yml http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/310f6a64/release.sh ---------------------------------------------------------------------- diff --git a/release.sh b/release.sh new file mode 100644 index 0000000..47c8b4f --- /dev/null +++ b/release.sh @@ -0,0 +1,222 @@ +#!/bin/bash + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +function terminate() { + printf "\n\nUser terminated build. Exiting...\n" + exit 1 +} + +trap terminate SIGINT + +KEYS=() + +init(){ + apk --no-cache add ca-certificates wget git gnupg + wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub + wget -q -O /tmp/glibc.apk https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk + apk add /tmp/glibc.apk +} + +GPG_COMMAND="gpg2" + +get_gpg_keys(){ + GPG_KEYS=$($GPG_COMMAND --list-keys --with-colons --keyid-format LONG) + + KEY_NUM=1 + + KEY_DETAILS="" + + while read -r line; do + + IFS=':' read -ra PART <<< "$line" + + if [ ${PART[0]} == "pub" ]; then + + if [ -n "$KEY_DETAILS" ]; then + KEYS[$KEY_NUM]=$KEY_DETAILS + KEY_DETAILS="" + ((KEY_NUM++)) + + fi + + KEY_DETAILS=${PART[4]} + fi + + if [ ${PART[0]} == "uid" ]; then + KEY_DETAILS="$KEY_DETAILS - ${PART[9]}" + fi + + done <<< "$GPG_KEYS" + + if [ -n "$KEY_DETAILS" ]; then + KEYS[$KEY_NUM]=$KEY_DETAILS + fi +} + +mount_gpg_keys(){ + mkdir -p /.gnupg + + if [ -z "$(ls -A /.gnupg)" ]; then + echo "Please mount the contents of your .gnupg folder into /.gnupg. Exiting..." + exit 1 + fi + + mkdir -p /root/.gnupg + + cp -r /.gnupg/ /root/ + + chmod -R 700 /root/.gnupg/ + + rm -rf /root/.gnupg/*.lock +} + +SELECTED_GPG_KEY="" + +select_gpg_key(){ + + get_gpg_keys + + export GPG_TTY=/dev/console + + touch /root/.gnupg/gpg-agent.conf + echo 'default-cache-ttl 10000' >> /root/.gnupg/gpg-agent.conf + echo 'max-cache-ttl 10000' >> /root/.gnupg/gpg-agent.conf + + echo "Starting GPG agent..." + gpg-agent --daemon + + while $INVALID_KEY_SELECTED; do + + if [ "${#KEYS[@]}" -le 0 ]; then + echo "You do not have any GPG keys available. Exiting..." + exit 1 + fi + + echo "You have the following GPG keys:" + + for i in "${!KEYS[@]}"; do + echo "$i) ${KEYS[$i]}" + done + + read -p "Select your GPG key for signing: " KEY_INDEX + + SELECTED_GPG_KEY=$(sed 's/ -.*//' <<< ${KEYS[$KEY_INDEX]}) + + if [ -z $SELECTED_GPG_KEY ]; then + echo "Selected key is invalid, please try again." + continue + fi + + echo "Authenticating your GPG key..." + + echo "test" | $GPG_COMMAND --local-user $SELECTED_GPG_KEY --output /dev/null --sign - + + if [ $? != 0 ]; then + echo "Invalid GPG passphrase or GPG error. Please try again." + continue + fi + + echo "You have selected the following GPG key to sign the release:" + echo "${KEYS[$KEY_INDEX]}" + + INVALID_CONFIRMATION=true + + while $INVALID_CONFIRMATION; do + read -p "Is this correct? (y/n) " CONFIRM + + if [[ ($CONFIRM == "Y") || ($CONFIRM == "y") ]]; then + INVALID_KEY_SELECTED=false + INVALID_CONFIRMATION=false + elif [[ ($CONFIRM == "N") || ($CONFIRM == "n") ]]; then + INVALID_CONFIRMATION=false + fi + done + done +} + +RELEASE_VERSION="" +RC_NUMBER="" +DEV_VERSION="" +ASF_USERNAME="" + +get_build_configuration(){ + + while $NOT_CONFIRMED; do + read -p "Enter the version number to be released (example: 1.12.0): " RELEASE_VERSION + read -p "Enter the release candidate number (example: if you are releasing rc0, enter 0): " RC_NUMBER + read -p "Enter the development version number (example: if your release version is 1.12.0, enter 1.13.0): " DEV_VERSION + read -p "Enter your ASF username: " ASF_USERNAME + echo "Build configured as follows:" + echo "Release: $RELEASE_VERSION-rc$RC_NUMBER" + echo "Next development version: $DEV_VERSION-SNAPSHOT" + echo "ASF Username: $ASF_USERNAME" + + INVALID_CONFIRMATION=true + + while $INVALID_CONFIRMATION; do + read -p "Is this correct? (y/n) " CONFIRM + + if [[ ($CONFIRM == "Y") || ($CONFIRM == "y") ]]; then + NOT_CONFIRMED=false + INVALID_CONFIRMATION=false + elif [[ ($CONFIRM == "N") || ($CONFIRM == "n") ]]; then + INVALID_CONFIRMATION=false + fi + done + done +} + +set_git_credentials(){ + read -s -p "Enter your ASF git password: " ASF_GIT_PASSWORD + + printf "\n" + + echo https://$ASF_USERNAME:[email protected] > /root/.git-credentials + git config --global credential.helper 'store --file=/root/.git-credentials' +} + +case $1 in + dry-run) + init + mount_gpg_keys + select_gpg_key + get_build_configuration + + mvn -Dmaven.artifact.threads=20 -DdryRun=true -DreleaseVersion=$RELEASE_VERSION -DdevelopmentVersion=$DEV_VERSION-SNAPSHOT -Dtag="avatica-$RELEASE_VERSION-rc$RC_NUMBER" -Papache-release -Duser.name=$ASF_USERNAME release:prepare -Darguments="-DskipDockerCheck -Dgpg.keyname=$SELECTED_GPG_KEY" + ;; + + release) + init + mount_gpg_keys + select_gpg_key + get_build_configuration + set_git_credentials + + mvn -Dmaven.artifact.threads=20 -DreleaseVersion=$RELEASE_VERSION -DdevelopmentVersion=$DEV_VERSION-SNAPSHOT -Dtag="avatica-$RELEASE_VERSION-rc$RC_NUMBER" -Papache-release -Duser.name=$ASF_USERNAME release:prepare -Darguments=-Dgpg.keyname=$SELECTED_GPG_KEY + mvn -Dmaven.artifact.threads=20 -Papache-release -Duser.name=$ASF_USERNAME release:perform -Darguments="-DskipTests" + ;; + + clean) + init + mvn release:clean + ;; + + *) + echo $"Usage: $0 {dry-run|release|clean}" + ;; + +esac \ No newline at end of file
