mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-06 17:05:34 +00:00
220 lines
6.3 KiB
Bash
Executable file
220 lines
6.3 KiB
Bash
Executable file
#!/usr/bin/env 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="$(readlink -f "${BASH_SOURCE[0]}")"
|
|
. "${THIS_SCRIPT%/*}/../../resources/build/build-utils.sh"
|
|
## END STANDARD BUILD SCRIPT INCLUDE
|
|
|
|
. "${THIS_SCRIPT%/*}/trigger-definitions.inc.sh"
|
|
. "${THIS_SCRIPT%/*}/trigger-builds.inc.sh"
|
|
. "${THIS_SCRIPT%/*}/sentry-control.inc.sh"
|
|
|
|
gitbranch=`git branch --show-current`
|
|
|
|
FORCE=0
|
|
HISTORY_FORCE=
|
|
fromversion=
|
|
toversion=
|
|
|
|
if [[ $# -gt 0 ]]; then
|
|
if [[ "$1" == "-f" ]]; then
|
|
FORCE=1
|
|
HISTORY_FORCE=--force
|
|
shift
|
|
fi
|
|
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
|
|
shift
|
|
else
|
|
action=help
|
|
fi
|
|
shift
|
|
|
|
if [[ $action == commit ]]; then
|
|
if [ "$base" != "master" ] && [ "$base" != "beta" ] && [[ ! "$base" =~ ^stable-[0-9]+\.[0-9]+$ ]]; then
|
|
echo "Invalid branch $base specified: must be master, beta, or stable-x.y."
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$base" != "$gitbranch" ]; then
|
|
echo "Branch doesn't match currently checked out branch."
|
|
exit 2
|
|
fi
|
|
|
|
# commit action parameters
|
|
if [[ $# -gt 0 ]]; then
|
|
# next two parameters are --from and --to
|
|
fromversion="$1"
|
|
toversion="$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, beta or stable-x.y."
|
|
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
|
|
echo "increment-version.sh: updating branch $base from GitHub"
|
|
git pull origin $base
|
|
|
|
#
|
|
# Run the increment + history refresh
|
|
#
|
|
|
|
echo "increment-version.sh: building resources/build/version"
|
|
pushd "$KEYMAN_ROOT"
|
|
npm ci
|
|
|
|
"$KEYMAN_ROOT/resources/build/version/build.sh"
|
|
|
|
echo "increment-version.sh: running resources/build/version"
|
|
pushd "$KEYMAN_ROOT"
|
|
ABORT=0
|
|
if [[ -z "$fromversion" ]]; then
|
|
node resources/build/version/build/src/index.js history version -t "$GITHUB_TOKEN" -b "$base" $HISTORY_FORCE || ABORT=$?
|
|
else
|
|
node resources/build/version/build/src/index.js history version -t "$GITHUB_TOKEN" -b "$base" $HISTORY_FORCE --from "$fromversion" --to "$toversion" || ABORT=$?
|
|
fi
|
|
|
|
if [[ $ABORT = 50 ]]; 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 (node version/lib/index.js failed with error $ABORT)"
|
|
exit $ABORT
|
|
fi
|
|
popd > /dev/null
|
|
|
|
#
|
|
# Push the result
|
|
#
|
|
|
|
if [ "$action" == "commit" ]; then
|
|
echo "increment-version.sh: committing to repository and tagging release version $VERSION_WITH_TAG"
|
|
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 "$VERSION_GIT_TAG" -m "Keyman release $VERSION_WITH_TAG"
|
|
git checkout -b "$branch"
|
|
git add VERSION.md HISTORY.md
|
|
|
|
# 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 GitHub
|
|
#
|
|
|
|
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
|
|
|
|
#
|
|
# If we are on a stable-x.y branch, then we also want to merge changes to
|
|
# HISTORY.md to master. We don't want to do this for beta or alpha builds;
|
|
# beta changes will be merged to master periodically anyway.
|
|
#
|
|
if [[ "$base" =~ ^stable-[0-9]+\.[0-9]+$ ]]; then
|
|
git switch master
|
|
|
|
# In order to avoid potential git conflicts, we run the history collater
|
|
# again on the master HISTORY.md. Note that the script always exits 1 to
|
|
# indicate it hasn't updated VERSION.md. We could tweak that in the future.
|
|
node resources/build/version/lib/index.js history --no-write-github-comment -t "$GITHUB_TOKEN" -b "$base" || true
|
|
|
|
# If HISTORY.md has been updated, then we want to create a branch and push
|
|
# it for review
|
|
if git status --porcelain=v1 | grep -q HISTORY.md; then
|
|
# TODO: once we are sure this is stable, rename this to
|
|
# "$branch-master-history" to get automatic merges with "auto/..." branch
|
|
# name
|
|
git switch -c "chore/version-$base-$NEWVERSION-master-history" master
|
|
git add HISTORY.md
|
|
git commit -m "$message (history cherry-pick to master)"
|
|
# TODO: once we are sure this is stable, add `-l auto` to get the "auto:"
|
|
# label
|
|
hub pull-request -f --no-edit -b master
|
|
fi
|
|
|
|
# Return to our best working branch
|
|
git switch "$branch"
|
|
fi
|
|
|
|
#
|
|
# 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
|