spiegel-keyman/resources/build/increment-version.sh
Marc Durdin b888a6075b fix(common): improve increment-version robustness
Fixes #4061.

Four things:

1. Reorder the script steps so that builds are triggered before the PR
   is created. This should not really be necessary, but I am seeing some
   evidence that TeamCity is not respecting the commit sha we request to
   build. (This arose with 14.0.194 where a build agent became
   unavailable during a build and TC cancelled and restarted the build,
   but from a later revision... which this particular fix may not help,
   I guess...)
2. Add debug logging so we can see exactly which commit sha that we
   send to TeamCity
3. Handle errors in version increment by aborting the script with an
   error.
4. Add a -f force mode which we can use to trigger a build even if no
   changes are detected. This will need a corresponding patch in TC.
2020-12-03 10:24:19 +11:00

179 lines
4.7 KiB
Bash
Executable file

#!/bin/bash
set -e
set -u
#
# Usage: increment-version.sh [-f] [commit base]
#
# Increments the patch version on VERSION.md
#
# If -f is specified, triggers a build even with
# no detected changes.
#
# If commit is specified, pushes the new version
# to the repository. base snould be either
# master or beta.
#
## START STANDARD BUILD SCRIPT INCLUDE
# adjust relative paths as necessary
THIS_SCRIPT="$(greadlink -f "${BASH_SOURCE[0]}" 2>/dev/null || readlink -f "${BASH_SOURCE[0]}")"
. "$(dirname "$THIS_SCRIPT")/build-utils.sh"
## END STANDARD BUILD SCRIPT INCLUDE
. "$(dirname "$THIS_SCRIPT")/trigger-definitions.inc.sh"
. "$(dirname "$THIS_SCRIPT")/trigger-builds.inc.sh"
. "$(dirname "$THIS_SCRIPT")/sentry-control.inc.sh"
gitbranch=`git branch --show-current`
FORCE=0
if [[ "$1" == "-f" ]]; then
FORCE=1
shift
fi
if [[ $# -gt 0 ]]; then
# We want the action to specify the branch as a consistency check
# for now at least.
action=$1
if [[ $# -gt 1 ]]; then
base=$2
else
action=help
fi
if [[ $action == commit ]]; then
if [ "$base" != "master" ] && [ "$base" != "beta" ]; then
echo "Invalid branch $base specified: must be master or beta."
exit 1
fi
if [ "$base" != "$gitbranch" ]; then
echo "Branch doesn't match currently checked out branch."
exit 2
fi
fi
else
action="increment"
base="$gitbranch"
fi
if [[ $action == help ]]; then
echo "Usage: increment-version.sh [-f] [commit base]"
echo " -f forces a build even with no changes"
echo " base must be either master or beta."
echo " base must be equal to currently checked-out"
echo " branch (this may not be required in future)"
exit 1
fi
# Let's ensure our base is up to date with GitHub to
# avoid transient errors
git pull origin $base
#
# Run the increment + history refresh
#
pushd "$KEYMAN_ROOT/resources/build/version" > /dev/null
npm install
npm run build:ts
popd > /dev/null
pushd "$KEYMAN_ROOT" > /dev/null
ABORT=0
node resources/build/version/lib/index.js history version -t "$GITHUB_TOKEN" -b "$base" || ABORT=$?
if [[ $ABORT = 1 ]]; then
if [[ $FORCE = 0 ]]; then
echo "Skipping version increment from $VERSION: no recently merged pull requests were found"
if [ ! -z "${TEAMCITY_VERSION-}" ]; then
# Send TeamCity a build status
echo "##teamcity[buildStatus status='SUCCESS' text='Skipping version increment from $VERSION: no recently merged pull requests were found']"
fi
exit 0
else
echo "Force specified; building even though no changes were detected"
fi
elif [[ $ABORT != 0 ]]; then
echo "Failed to complete version history check"
exit $ABORT
fi
popd > /dev/null
#
# Push the result
#
if [ "$action" == "commit" ]; then
VERSION_MD="$KEYMAN_ROOT/VERSION.md"
NEWVERSION=`cat $VERSION_MD | tr -d "[:space:]"`
pushd "$KEYMAN_ROOT" > /dev/null
message="auto: increment $base version to $NEWVERSION"
branch="auto/version-$base-$NEWVERSION"
git tag -a "release-$VERSION_WITH_TAG" -m "Keyman release $VERSION_WITH_TAG"
git checkout -b "$branch"
git add VERSION.md HISTORY.md
# Also updates package versions, committing those changes
# Uses the 'version' run script defined in the base package.json.
npm install
npm run version -- "$NEWVERSION"
# Version info will be updated in lerna.json and all the lerna-managed package.json files.
git add lerna.json
# Iterates through all lerna-managed packages in serial mode (--concurrency 1),
# git-adding only the updated package.json and package-lock.json files.
npm run lerna -- exec --concurrency 1 -- git add package.json package-lock.json
# Now that all version-related changes are ready and git-added, it's time to commit.
git commit -m "$message"
git push --tags origin "$branch"
git checkout $base
#
# Tell Sentry about this (previous version)
#
makeSentryRelease
popd > /dev/null
#
# Trigger builds for the previous version on TeamCity and Jenkins
#
triggerBuilds
#
# Now, create the PR on GitHub which will be merged when ready
#
cd "$KEYMAN_ROOT"
git checkout "$branch"
hub pull-request -f --no-edit -b $base -l auto
#
# Done
#
echo "Version was incremented and pull request was created, and builds were triggered"
if [ ! -z "${TEAMCITY_VERSION-}" ]; then
# Send TeamCity a build status
echo "##teamcity[buildStatus status='SUCCESS' text='Version was incremented from $VERSION to $NEWVERSION and pull request was created']"
fi
#
# After this script finishes in CI, we will be pushing the new history to
# downloads.keyman.com, so we need to finish with the branch here that has the
# latest history in it. We don't need to cleanup the branch because the CI will
# do that for us.
#
fi
exit 0