scripts: add update-go-version.sh

This is a little helper to make updating the version of go a bit nicer.
This commit is contained in:
Jeff Schroeder 2024-04-02 21:44:31 -04:00
parent f1e502f7a0
commit 3b6f39d841
1 changed files with 111 additions and 0 deletions

111
scripts/update-go-version.sh Executable file
View File

@ -0,0 +1,111 @@
#!/bin/bash
# Make updating to a new version of go a bit easier.
#
# Usage:
# scripts/update-go-version.sh 1.21.8
#
# Any actual go package dependency updates should be manually done for
# correctness and safety. Always verify any major dependency updates.
DOCKER=${DOCKER:-podman}
# Update the github actions to use the updated version of go
update_github_actions() {
local version=$1
local directory=.github/workflows
# Don't cd in and then cd out
(
cd "$directory" || return 1
echo "Updating github actions under $directory"
git grep -l go-version | xargs sed -r -i -e '/go-version/s/:.*$/: "'"${version}"'"/g'
return "${PIPESTATUS[1]}"
)
return $?
}
# Update the documentation on versions of go to use
update_developer_docs() {
local version=$1
local documents="DEVELOP.md docs/operations.md"
echo "Updating developer docs: $documents"
# shellcheck disable=SC2086
sed -i -e '/golang.org\/dl/s/>= 1\.[0-9]*\.[0-9x]*/>= '"${version}"'/' $documents
return $?
}
get_docker_image_digest() {
local version="$1"
local image="${2:-docker.io/golang}"
echo "Attempting to pull ${image}:${version} to retrieve the image digest" >&2
# shellcheck disable=SC2155
local digest=$($DOCKER pull "${image}:${version}" | awk '/^Digest:/{print $NF}')
if [[ ${PIPESTATUS[0]} -ne 0 || -z "$digest" ]]; then
echo "ERROR: could not determine digest for ${image}:${version} container image" >&2
return 1
fi
echo "$digest"
}
# Keep go in Dockerfiles for wormhole specific stuff up to date with the latest go
# It is often impossible to update third party Dockerfiles due to the necessity of
# actual code changes to build with newer versions of go or go.mod dependency sad.
update_our_dockerfiles() {
local version=$1
local image=docker.io/golang
# shellcheck disable=SC2207
local wormhole_dockerfiles=($(git grep -lEi 'FROM.*go(lang)' | grep -Ev '^(wormchain/D|third_party|algorand|terra)'))
# shellcheck disable=SC2155
local digest=$(get_docker_image_digest "$version" "docker.io/golang")
for dockerfile in "${wormhole_dockerfiles[@]}"; do
if grep -qEi 'FROM.*go.*alpine' "$dockerfile"; then
echo "WARNING: '$dockerfile' uses alpine and not debian. Please update manually" >&2
continue
fi
# Flag ordering here is important to work correctly on macOS with crappy bsd sed and on Linux with more sensible gnu sed
sed -E -i -e '/docker\.io\/golang:/s/(:)[0-9]*\.[0-9]*\.([0-9]|[0-9a-zA-Z-])*(@)sha256:[0-9a-zA-Z-]*( (AS|as)*.*$)?/\1'"$version"'\3'"$digest"'\4/g' "$dockerfile"
# shellcheck disable=SC2181
if [[ $? -ne 0 ]]; then
echo "ERROR: problem updating $dockerfile to ${version}@${digest}" >&2
return 1
fi
if ! grep -q "${image}:${version}@${digest}" "$dockerfile"; then
echo "ERROR: Problem updating $dockerfile to ${version}@${digest}, please manually verify" >&2
return 1
fi
printf "Successfully updated %-38s to %s\n" "$dockerfile" "${image}:${version}@${digest}"
done
}
function main() {
local version=$1
if [ -z "$version" ]; then
echo -e "ERROR: Missing go version\nUsage:\n\t$0 <GO VERSION>" >&2
exit 1
elif echo "$version" | grep -q ^v; then
echo "ERROR: use explicit semver versions, not a git tag for this script" >&2
exit 1
fi
if ! update_github_actions "$version"; then
echo "ERROR: Problem updating github actions" >&2
exit 1
fi
if ! update_developer_docs "$version"; then
echo "ERROR: Problem updating developer docs" >&2
exit 1
fi
if ! update_our_dockerfiles "${version}-bullseye"; then
echo "ERROR: Problem updating dockerfiles" >&2
exit 1
fi
}
main "$@"