From 8303eb30377a41879c982b62b53cc549c60b74c0 Mon Sep 17 00:00:00 2001 From: Chris Evich Date: Tue, 22 Oct 2019 12:31:30 -0400 Subject: Cirrus: Only upload tagged releases Prior to this commit, every push to master had it's builds packaged and uploaded to google storage. This is a waste, since potential users are only ever concerned about tagged releases. Unfortunately because the release process involves humans with potentially multiple human and automation steps happening in parallel, it's easy for automation to not detect a tagged release, or trigger on development|pre-release tags. Fix this in `upload_release_archive.sh` using a new unit-tested function `is_release()`. This acts as the definitive authority on whether or not a specific commit rage or `$CIRRUS_TAG` value constitutes something worthy of upload. Signed-off-by: Chris Evich --- contrib/cirrus/lib.sh | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) (limited to 'contrib/cirrus/lib.sh') diff --git a/contrib/cirrus/lib.sh b/contrib/cirrus/lib.sh index 8a7d3c1a3..051157702 100644 --- a/contrib/cirrus/lib.sh +++ b/contrib/cirrus/lib.sh @@ -43,7 +43,7 @@ if type -P git &> /dev/null && [[ -d "$GOSRC/.git" ]] then CIRRUS_CHANGE_IN_REPO=${CIRRUS_CHANGE_IN_REPO:-$(git show-ref --hash=8 HEAD || date +%s)} else # pick something unique and obviously not from Cirrus - CIRRUS_CHANGE_IN_REPO=${CIRRUS_CHANGE_IN_REPO:-no_git_$(date +%s)} + CIRRUS_CHANGE_IN_REPO=${CIRRUS_CHANGE_IN_REPO:-unknown_$(date +%s)} fi # Defaults when not running under CI @@ -233,6 +233,42 @@ ircmsg() { set -e } +# This covers all possible human & CI workflow parallel & serial combinations +# where at least one caller must definitively discover if within a commit range +# there is at least one release tag not having any '-' characters (return 0) +# or otherwise (return non-0). +is_release() { + req_env_var CIRRUS_BASE_SHA CIRRUS_CHANGE_IN_REPO + local range="${CIRRUS_BASE_SHA}..${CIRRUS_CHANGE_IN_REPO}" + # Easy check first, default non-useful values + if echo "${range}$CIRRUS_TAG" | grep -iq 'unknown'; then + die 11 "is_release() unusable range ${range} or tag $CIRRUS_TAG" + fi + # Next easy check, is CIRRUS_TAG set + unset RELVER + if [[ -n "$CIRRUS_TAG" ]]; then + RELVER="$CIRRUS_TAG" + else # Lastly, look through the range for tags + git fetch --all --tags &> /dev/null|| \ + die 12 "is_release() failed to fetch tags" + RELVER=$(git log --pretty='format:%d' $range | \ + grep '(tag:' | sed -r -e 's/\s+[(]tag:\s+(v[0-9].*)[)]/\1/' | \ + sort -uV | tail -1) + [[ "$?" -eq "0" ]] || \ + die 13 "is_release() failed to parse tags" + fi + echo "Found \$RELVER $RELVER" + if [[ -n "$RELVER" ]]; then + if echo "$RELVER" | grep -q '-'; then + return 2 + else + return 0 + fi + else + return 1 + fi +} + setup_rootless() { req_env_var ROOTLESS_USER GOSRC SECRET_ENV_RE ROOTLESS_ENV_RE -- cgit v1.2.3-54-g00ecf