subsurface/scripts/get-or-create-build-nr.sh
Dirk Hohndel f10feef23a create script to determine build number
What a pain. It turns out that github.run_number is counting the number of
times a specific workflow has been run - but that's different for different
workflows, so using that won't get us a single tag with all the corresponding
build artifacts.  And sadly I can't find a simple atomic way to increase a
GitHUb repo variable, so I came up with this somewhat convoluted dance, using
the the fact that a push to an existing brach that isn't a fast-forward will
fail.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2023-12-11 12:59:33 -08:00

60 lines
2.3 KiB
Bash

#!/bin/bash
# this is comically complicated - why does GitHub not have a monotonic number
# that tracks how many times any action was kicked off? Or an atomic way to update a variable?
# So we use the fact that git itself does a great job of preventing us from overwriting an
# existing branch and abuse that to create atomicity
SHA_BRANCH="branch-for-$1"
# first - make sure git is configured so we can do stuff
git config --global user.email "ci@subsurface-divelog.org"
git config --global user.name "Subsurface CI"
# next, clone the release repo
[ -d nightly-builds ] || git clone https://github.com/subsurface/nightly-builds
cd nightly-builds
# this is from the main branch, so this should be the PREVIOUS build number
latest=$(<latest-subsurface-buildnumber)
# now let's see if a branch for the current SHA exists
if git checkout $SHA_BRANCH
then
# one of the other workflows created a release number already
latest=$(<latest-subsurface-buildnumber)
else
# this is almost certainly a race between the different workflow files
# the main branch should have held the previous release number
# increment by one and write as new build number into the named branch
latest=$((latest+1))
git checkout -b $SHA_BRANCH
echo $latest > latest-subsurface-buildnumber
git commit -a -m "record build number for this SHA"
# now comes the moment of truth - are we the first one?
# the push will succeed for exactly one of the workflows
if git push https://github.com/subsurface/nightly-builds $SHA_BRANCH
then
# yay - we win! now let's make sure that we remember this number for next time
git checkout main
echo $latest > latest-subsurface-buildnumber
git commit -a -m "record latest build number in main branch"
if ! git push https://github.com/subsurface/nightly-builds main
then
echo "push to main failed - we'll lose monotonic property"
exit -1
fi
else
# someone else was faster - get the number they wrote
git checkout main
git branch -D $SHA_BRANCH
if ! git checkout -b $SHA_BRANCH
then
echo "push to $SHA_BRANCH failed, but switching to it failed as well"
exit -2
fi
latest=$(<latest-subsurface-buildnumber)
fi
fi
# if we get here, we have the next build number - wow that was weird.
echo "Build number is $latest"