| #!/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=() |
| |
| GPG_COMMAND="gpg" |
| |
| 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="" |
| NAME="" |
| |
| 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 |
| read -p "Enter your name (this will be used for git commits): " NAME |
| echo "Build configured as follows:" |
| echo "Release: $RELEASE_VERSION-rc$RC_NUMBER" |
| echo "Next development version: $DEV_VERSION-SNAPSHOT" |
| echo "ASF Username: $ASF_USERNAME" |
| echo "Name: $NAME" |
| |
| 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 |
| } |
| |
| ASF_PASSWORD="" |
| |
| set_git_credentials(){ |
| read -s -p "Enter your ASF password: " ASF_PASSWORD |
| |
| printf "\n" |
| |
| echo https://$ASF_USERNAME:$ASF_PASSWORD@gitbox.apache.org >> /root/.git-credentials |
| git config --global credential.helper 'store --file=/root/.git-credentials' |
| |
| git config --global user.name "$NAME" |
| } |
| |
| set_maven_credentials(){ |
| mkdir -p /root/.m2 |
| rm -f /root/.m2/settings.xml |
| rm -f /root/.m2/settings-security.xml |
| |
| ENCRYPTED_MAVEN_PASSWORD="$(mvn --encrypt-master-password $ASF_PASSWORD)" |
| |
| cat <<EOF >> /root/.m2/settings-security.xml |
| <settingsSecurity> |
| <master>$ENCRYPTED_MAVEN_PASSWORD</master> |
| </settingsSecurity> |
| EOF |
| |
| ENCRYPTED_ASF_PASSWORD="$(mvn --encrypt-password $ASF_PASSWORD)" |
| |
| cat <<EOF >> /root/.m2/settings.xml |
| <settings> |
| <servers> |
| <server> |
| <id>apache.snapshots.https</id> |
| <username>${ASF_USERNAME}</username> |
| <password>${ENCRYPTED_ASF_PASSWORD}</password> |
| </server> |
| <server> |
| <id>apache.releases.https</id> |
| <username>${ASF_USERNAME}</username> |
| <password>${ENCRYPTED_ASF_PASSWORD}</password> |
| </server> |
| </servers> |
| </settings> |
| EOF |
| } |
| |
| case $1 in |
| dry-run) |
| 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=-Dgpg.keyname=$SELECTED_GPG_KEY |
| ;; |
| |
| release) |
| mount_gpg_keys |
| select_gpg_key |
| get_build_configuration |
| set_git_credentials |
| set_maven_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 -Dgpg.keyname=$SELECTED_GPG_KEY" |
| ;; |
| |
| clean) |
| mvn release:clean |
| ;; |
| |
| test) |
| mvn clean verify -Dcheckstyle.skip |
| ;; |
| |
| *) |
| echo $"Usage: $0 {dry-run|release|clean|test}" |
| ;; |
| |
| esac |