This is an automated email from the ASF dual-hosted git repository. ctubbsii pushed a commit to branch 1.10.3-rc0 in repository https://gitbox.apache.org/repos/asf/accumulo.git
commit fb09e7e2594c451317ce6294b9dd27bd0c5e6c05 Author: Christopher Tubbs <[email protected]> AuthorDate: Wed Apr 5 15:40:30 2023 -0400 Backport release candidate script Backport current version of release candidate script from the main branch --- assemble/build.sh | 213 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 131 insertions(+), 82 deletions(-) diff --git a/assemble/build.sh b/assemble/build.sh index 5bbca61372..38321484d6 100755 --- a/assemble/build.sh +++ b/assemble/build.sh @@ -8,7 +8,7 @@ # "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 +# https://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 @@ -30,21 +30,36 @@ export tagPrefix="rel/" # check if running in a color terminal terminalSupportsColor() { - local c; c=$(tput colors 2>/dev/null) || c=-1 + local c + c=$(tput colors 2>/dev/null) || c=-1 [[ -t 1 ]] && [[ $c -ge 8 ]] } terminalSupportsColor && doColor=1 || doColor=0 -color() { local c; c=$1; shift; [[ $doColor -eq 1 ]] && echo -e "\\e[0;${c}m${*}\\e[0m" || echo "$@"; } +color() { + local c + c=$1 + shift + [[ $doColor -eq 1 ]] && echo -e "\\e[0;${c}m${*}\\e[0m" || echo "$@" +} red() { color 31 "$@"; } green() { color 32 "$@"; } yellow() { color 33 "$@"; } -fail() { echo -e ' ' "$@"; exit 1; } -runLog() { local o; o=$1 && shift && echo "$(green Running) $(yellow "$@" '>>' "$o")" && echo Running "$@" >> "$o" && eval "$@" >> "$o"; } -run() { echo "$(green Running) $(yellow "$@")" && eval "$@"; } +fail() { + echo -e ' ' "$@" + exit 1 +} +runLog() { + local o + o=$1 && shift && echo "$(green Running) $(yellow "$@" '>>' "$o")" && echo Running "$*" >>"$o" && "$@" >>"$o" +} +run() { echo "$(green Running) $(yellow "$@")" && "$@"; } -currentBranch() { local b; b=$(git symbolic-ref -q HEAD) && echo "${b##refs/heads/}"; } +currentBranch() { + local b + b=$(git symbolic-ref -q HEAD) && echo "${b##refs/heads/}" +} cacheGPG() { # make sure gpg agent has key cached @@ -54,7 +69,8 @@ cacheGPG() { until selectFingerprint; do red 'ERROR - Invalid selection' done - local TESTFILE; TESTFILE=$(mktemp --tmpdir "${USER}-gpgTestFile-XXXXXXXX.txt") + local TESTFILE + TESTFILE=$(mktemp --tmpdir "${USER}-gpgTestFile-XXXXXXXX.txt") [[ -r $TESTFILE ]] && gpg --local-user "$SELECTED_FINGERPRINT" --sign "$TESTFILE" && rm -f "$TESTFILE" "$TESTFILE.gpg" } @@ -69,9 +85,14 @@ prompter() { echo "$x" } -pretty() { local f; f=$1; shift; git log "--pretty=tformat:$f" "$@"; } +pretty() { + local f + f=$1 + shift + git log "--pretty=tformat:$f" "$@" +} gitCommits() { pretty %H "$@"; } -gitCommit() { gitCommits -n1 "$@"; } +gitCommit() { gitCommits -n1 "$@"; } gitSubject() { pretty %s "$@"; } selectFingerprint() { @@ -100,42 +121,50 @@ selectFingerprint() { createEmail() { echo - yellow "IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!!" + yellow "IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!!" echo - echo " Release candidate will be staged at:" - echo " $(yellow 'https://repository.apache.org/#stagingRepositories')" + echo " Release candidate will be staged at:" + echo " $(yellow 'https://repository.apache.org/#stagingRepositories')" echo - echo " $(green 'DO') click $(green 'Close') to complete the staging process!" - echo " $(red 'DO *NOT*') click $(red 'Release') until after the vote has been approved!" + echo " $(green 'DO') click $(green 'Close') to complete the staging process!" + echo " $(red 'DO *NOT*') click $(red 'Release') until after the vote has been approved!" echo - yellow "IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!!" + yellow "IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!!" echo # $1 version (optional); $2 rc sequence num (optional); $3 staging repo num (optional) - local ver; [[ -n "$1" ]] && ver=$1 || ver=$(prompter 'version to be released (eg. x.y.z)' '[0-9]+[.][0-9]+[.][0-9]+') - local rc; [[ -n "$2" ]] && rc=$2 || rc=$(prompter 'release candidate sequence number (eg. 1, 2, etc.)' '[0-9]+') - local stagingrepo; [[ -n "$3" ]] && stagingrepo=$3 || stagingrepo=$(prompter 'staging repository number from https://repository.apache.org/#stagingRepositories' '[0-9]+') - local srcSha; [[ -n "$4" ]] && srcSha=$4 || srcSha=$(prompter 'SHA512 for source tarball' '[0-9a-f]{128}') - local binSha; [[ -n "$5" ]] && binSha=$5 || binSha=$(prompter 'SHA512 for binary tarball' '[0-9a-f]{128}') - - local branch; branch=$ver-rc$rc - local commit; commit=$(gitCommit "$branch") || exit 1 - local tag; tag=$tagPrefix$ver + local ver + [[ -n $1 ]] && ver=$1 || ver=$(prompter 'version to be released (eg. x.y.z)' '[0-9]+[.][0-9]+[.][0-9]+') + local rc + [[ -n $2 ]] && rc=$2 || rc=$(prompter 'release candidate sequence number (eg. 1, 2, etc.)' '[0-9]+') + local stagingrepo + [[ -n $3 ]] && stagingrepo=$3 || stagingrepo=$(prompter 'staging repository number from https://repository.apache.org/#stagingRepositories' '[0-9]+') + local srcSha + [[ -n $4 ]] && srcSha=$4 || srcSha=$(prompter 'SHA512 for source tarball' '[0-9a-f]{128}') + local binSha + [[ -n $5 ]] && binSha=$5 || binSha=$(prompter 'SHA512 for binary tarball' '[0-9a-f]{128}') + + local branch + branch=$ver-rc$rc + local commit + commit=$(gitCommit "$branch") || exit 1 + local tag + tag=$tagPrefix$ver echo - yellow "IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!!" + yellow "IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!!" echo - echo " Don't forget to make the staged branch available for review by" - echo " pushing a branch named $(yellow "$branch") with its head at" - echo " $(yellow "$commit"):" + echo " Don't forget to make the staged branch available for review by" + echo " pushing a branch named $(yellow "$branch") with its head at" + echo " $(yellow "$commit"):" echo - echo " # replace $(yellow "\$origin") with your upstream remote name " - echo " $(green "git push") $(yellow "\$origin") $(green "$commit:refs/heads/$branch")" + echo " # replace $(yellow 'ORIGIN') with your upstream remote name " + echo " $(green "git push") $(yellow 'ORIGIN') $(green "$commit:refs/heads/$branch")" echo - echo " Remember, $(red DO NOT PUSH) the $(red "$tag") tag until after the vote" - echo " passes and the tag is re-made with a gpg signature using:" - echo " $(red "git tag -f -s -m '$projNameLong $ver' $tag") \\" - echo " $(red "$commit")" + echo " Remember, $(red DO NOT PUSH) the $(red "$tag") tag until after the vote" + echo " passes and the tag is re-made with a gpg signature using:" + echo " $(red "git tag -f -s -m '$projNameLong $ver' $tag") \\" + echo " $(red "$commit")" echo - yellow "IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!!" + yellow "IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!! IMPORTANT!!" echo read -r -s -p 'Press Enter to generate the [VOTE] email...' echo 1>&2 @@ -146,14 +175,18 @@ createEmail() { done # compute the date with a buffer of 30 minutes - local votedate; votedate=$(date -d "+3 days 30 minutes" "+%s") + local votedate + votedate=$(date -d "+3 days 30 minutes" "+%s") # round back to the previous half-hour - local halfhour; halfhour=$((votedate - (votedate % 1800))) + local halfhour + halfhour=$((votedate - (votedate % 1800))) votedate=$(date -u -d"1970-01-01 $halfhour seconds UTC") export TZ="America/New_York" - local edtvotedate; edtvotedate=$(date -d"1970-01-01 $halfhour seconds UTC") + local edtvotedate + edtvotedate=$(date -d"1970-01-01 $halfhour seconds UTC") export TZ="America/Los_Angeles" - local pdtvotedate; pdtvotedate=$(date -d"1970-01-01 $halfhour seconds UTC") + local pdtvotedate + pdtvotedate=$(date -d"1970-01-01 $halfhour seconds UTC") cat <<EOF $(yellow '============================================================') @@ -224,9 +257,12 @@ cleanUpAndFail() { run git checkout "$3" # pre-populate branches with expected next branch; de-duplicate later - local branches; branches=("$4") - local tags; tags=() - local x; local y + local branches + branches=("$4") + local tags + tags=() + local x + local y for x in $(gitCommits "${cBranch}..${nBranch}"); do for y in $(git branch --contains "$x" | cut -c3-); do branches=("${branches[@]}" "$y") @@ -238,7 +274,8 @@ cleanUpAndFail() { # de-duplicate branches local a - local tmpArray; tmpArray=("${branches[@]}") + local tmpArray + tmpArray=("${branches[@]}") IFS=$'\n' read -d '' -r -a branches < <(printf '%s\n' "${tmpArray[@]}" | sort -u) for x in "${branches[@]}"; do echo "Do you wish to clean up (delete) the branch $(yellow "$x")?" @@ -277,21 +314,21 @@ selectRemote() { createReleaseCandidate() { echo - yellow "WARNING!! WARNING!! WARNING!! WARNING!! WARNING!! WARNING!!" + yellow "WARNING!! WARNING!! WARNING!! WARNING!! WARNING!! WARNING!!" echo - echo " Don't forget to $(yellow 'Set up your development environment')!" - echo " For details, see the section by that name at:" - echo " $(green 'https://infra.apache.org/publishing-maven-artifacts.html')" + echo " Don't forget to $(yellow 'Set up your development environment')!" + echo " For details, see the section by that name at:" + echo " $(green 'https://infra.apache.org/publishing-maven-artifacts.html')" echo - echo " This will modify your local git repository by creating" - echo " branches and tags. Afterwards, you may need to perform" - echo " some manual steps to complete the release or to rollback" - echo " in the case of failure." + echo " This will modify your local git repository by creating" + echo " branches and tags. Afterwards, you may need to perform" + echo " some manual steps to complete the release or to rollback" + echo " in the case of failure." echo - echo " Release candidate will be staged at:" - echo " $(yellow 'https://repository.apache.org/#stagingRepositories')" + echo " Release candidate will be staged at:" + echo " $(yellow 'https://repository.apache.org/#stagingRepositories')" echo - yellow "WARNING!! WARNING!! WARNING!! WARNING!! WARNING!! WARNING!!" + yellow "WARNING!! WARNING!! WARNING!! WARNING!! WARNING!! WARNING!!" echo if [[ ${#@} -ne 0 ]]; then @@ -303,30 +340,38 @@ createReleaseCandidate() { ver=$(xmllint --shell pom.xml <<<'xpath /*[local-name()="project"]/*[local-name()="version"]/text()' | grep content= | cut -f2 -d=) ver=${ver%%-SNAPSHOT} echo "Building release candidate for version: $(green "$ver")" - local tag; tag=$tagPrefix$ver - - local cBranch; cBranch=$(currentBranch) || fail "$(red Failure)" to get current branch from git - local rc; rc=$(prompter 'release candidate sequence number (eg. 1, 2, etc.)' '[0-9]+') - local tmpNextVer; tmpNextVer="${ver%.*}.$((${ver##*.}+1))" - local nextVer; nextVer=$(prompter "next snapshot version to be released [$tmpNextVer]" '([0-9]+[.][0-9]+[.][0-9]+)?') + local tag + tag=$tagPrefix$ver + + local cBranch + cBranch=$(currentBranch) || fail "$(red Failure)" to get current branch from git + local rc + rc=$(prompter 'release candidate sequence number (eg. 1, 2, etc.)' '[0-9]+') + local tmpNextVer + tmpNextVer="${ver%.*}.$((${ver##*.} + 1))" + local nextVer + nextVer=$(prompter "next snapshot version to be released [$tmpNextVer]" '([0-9]+[.][0-9]+[.][0-9]+)?') [[ -n $nextVer ]] || nextVer=$tmpNextVer - local rcBranch; rcBranch=$ver-rc$rc - local nBranch; nBranch=$rcBranch-next + local rcBranch + rcBranch=$ver-rc$rc + local nBranch + nBranch=$rcBranch-next cacheGPG || fail "Unable to cache GPG credentials into gpg-agent" # create working branch - run git checkout -b "$nBranch" "$cBranch" || \ + run git checkout -b "$nBranch" "$cBranch" || fail "Unable to create working branch $(red "$nBranch") from $(red "$cBranch")!" # create a release candidate from a branch - local oFile; oFile=$(mktemp --tmpdir "$projName-build-$rcBranch-XXXXXXXX.log") + local oFile + oFile=$(mktemp --tmpdir "$projName-build-$rcBranch-XXXXXXXX.log") { [[ -w $oFile ]] && runLog "$oFile" mvn clean release:clean } || cleanUpAndFail 'mvn clean release:clean' "$oFile" "$cBranch" "$nBranch" - runLog "$oFile" mvn -B release:prepare -DdevelopmentVersion="${nextVer}-SNAPSHOT" "-Dgpg.keyname=$SELECTED_FINGERPRINT" || \ + runLog "$oFile" mvn -B release:prepare -DdevelopmentVersion="${nextVer}-SNAPSHOT" "-Dgpg.keyname=$SELECTED_FINGERPRINT" || cleanUpAndFail "mvn -B release:prepare -DdevelopmentVersion=${nextVer}-SNAPSHOT" "$oFile" "$cBranch" "$nBranch" - runLog "$oFile" mvn release:perform "-Dgpg.keyname=$SELECTED_FINGERPRINT" || \ + runLog "$oFile" mvn release:perform "-Dgpg.keyname=$SELECTED_FINGERPRINT" || cleanUpAndFail "mvn release:perform" "$oFile" "$cBranch" "$nBranch" # switch back to original branch @@ -334,22 +379,22 @@ createReleaseCandidate() { # verify the next branch contains both expected log messages and no more { - [[ $(gitCommits "${cBranch}..${nBranch}" | wc -l) -eq 2 ]] && \ - [[ $(gitCommit "${nBranch}~2") == $(gitCommit "${cBranch}") ]] && \ - [[ $(gitSubject "${nBranch}") =~ ^\[maven-release-plugin\]\ prepare\ for\ next ]] && \ + [[ $(gitCommits "${cBranch}..${nBranch}" | wc -l) -eq 2 ]] && + [[ $(gitCommit "${nBranch}~2") == $(gitCommit "${cBranch}") ]] && + [[ $(gitSubject "${nBranch}") =~ ^\[maven-release-plugin\]\ prepare\ for\ next ]] && [[ $(gitSubject "${nBranch}~1") =~ ^\[maven-release-plugin\]\ prepare\ release\ rel[/] ]] } || cleanUpAndFail "verifying that $nBranch contains only logs from release plugin" # verify the tag is one behind $nBranch and one ahead of $cBranch - [[ $(gitCommit "${nBranch}~1") == $(gitCommit "refs/tags/$tag") ]] || \ + [[ $(gitCommit "${nBranch}~1") == $(gitCommit "refs/tags/$tag") ]] || cleanUpAndFail "verifying that ${nBranch}~1 == refs/tags/$tag" # remove tag which was created - run git tag -d "$tag" || \ + run git tag -d "$tag" || cleanUpAndFail "removing unused git tag $tag" # create release candidate branch to vote on - run git branch "$rcBranch" "${nBranch}~1" || \ + run git branch "$rcBranch" "${nBranch}~1" || cleanUpAndFail "creating branch $rcBranch" # determine remote to use @@ -364,20 +409,25 @@ createReleaseCandidate() { echo "Do you wish to push the following branches to $SELECTED_REMOTE ($(green "$SELECTED_REMOTE_URL"))?" echo " $(yellow "$rcBranch") (for others to examine for the vote)" echo " $(yellow "$nBranch") (for merging into $cBranch if vote passes)" - local a; a=$(prompter "letter 'y' or 'n'" '[yn]') + local a + a=$(prompter "letter 'y' or 'n'" '[yn]') { - [[ $a == 'y' ]] && \ + [[ $a == 'y' ]] && run git push -u "$SELECTED_REMOTE" "refs/heads/$nBranch" "refs/heads/$rcBranch" } || red "Did not push branches; you'll need to perform this step manually." fi - local numSrc; numSrc=$(find target/checkout/ -type f -name "$projName-$ver-source-release.tar.gz" | wc -l) - local numBin; numBin=$(find target/checkout/ -type f -name "$projName-$ver-bin.tar.gz" | wc -l) + local numSrc + numSrc=$(find target/checkout/ -type f -name "$projName-$ver-source-release.tar.gz" | wc -l) + local numBin + numBin=$(find target/checkout/ -type f -name "$projName-$ver-bin.tar.gz" | wc -l) shopt -s globstar - local srcSha; srcSha="" - local binSha; binSha="" - [[ $numSrc = "1" ]] && srcSha=$(sha512sum target/checkout/**/"$projName-$ver-source-release.tar.gz" | cut -f1 -d" ") - [[ $numBin = "1" ]] && binSha=$(sha512sum target/checkout/**/"$projName-$ver-bin.tar.gz" | cut -f1 -d" ") + local srcSha + srcSha="" + local binSha + binSha="" + [[ $numSrc == "1" ]] && srcSha=$(sha512sum target/checkout/**/"$projName-$ver-source-release.tar.gz" | cut -f1 -d" ") + [[ $numBin == "1" ]] && binSha=$(sha512sum target/checkout/**/"$projName-$ver-bin.tar.gz" | cut -f1 -d" ") # continue to creating email notification echo "$(red Running)" "$(yellow "$scriptname" --create-email "$ver" "$rc")" @@ -394,4 +444,3 @@ elif [[ $1 == '--create-email' ]]; then else fail "Missing one of: $(red --create-release-candidate), $(red --create-email)" fi -
