bbolt/scripts/release.sh
Mustafa Elbehery 3019cbc227 chore(release): fix release script for MacOS
Signed-off-by: Mustafa Elbehery <melbeher@redhat.com>
2025-06-27 14:41:36 +02:00

95 lines
3.0 KiB
Bash
Executable File

#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
# === Function Definitions ===
function get_gpg_key {
local git_email
local key_id
git_email=$(git config --get user.email)
key_id=$(gpg --list-keys --with-colons "${git_email}" | awk -F: '/^pub:/ { print $5 }')
if [[ -z "${key_id}" ]]; then
echo "Failed to load gpg key. Is gpg set up correctly for etcd releases?"
return 2
fi
echo "${key_id}"
}
# === Main Script Logic ===
function main {
VERSION="$1"
if [ -z "${VERSION}" ]; then
read -p "Release version (e.g., v1.2.3) " -r VERSION
if [[ ! "${VERSION}" =~ ^v[0-9]+.[0-9]+.[0-9]+ ]]; then
echo "Expected 'version' param of the form 'v<major-version>.<minor-version>.<patch-version>' but got '${VERSION}'"
exit 1
fi
fi
VERSION=v${VERSION#v}
RELEASE_VERSION="${VERSION#v}"
MINOR_VERSION=$(echo "${RELEASE_VERSION}" | cut -d. -f 1-2)
RELEASE_BRANCH="release-${MINOR_VERSION}"
REPOSITORY=${REPOSITORY:-"git@github.com:etcd-io/bbolt.git"}
local remote_tag_exists
remote_tag_exists=$(git ls-remote "${REPOSITORY}" "refs/tags/${VERSION}" | grep -c "${VERSION}" || true)
if [ "${remote_tag_exists}" -gt 0 ]; then
echo "Release version tag exists on remote."
exit 1
fi
# Set up release directory.
local reldir="/tmp/bbolt-release-${VERSION}"
echo "Preparing temporary directory: ${reldir}"
if [ ! -d "${reldir}/bbolt" ]; then
mkdir -p "${reldir}"
cd "${reldir}"
git clone "${REPOSITORY}" --branch "${RELEASE_BRANCH}" --depth 1
fi
cd "${reldir}/bbolt" || exit 2
git checkout "${RELEASE_BRANCH}" || exit 2
git fetch origin
git reset --hard "origin/${RELEASE_BRANCH}"
# ensuring the minor-version is identical.
source_version=$(grep -E "\s+Version\s*=" ./version/version.go | sed -e "s/.*\"\(.*\)\".*/\1/g")
if [[ "${source_version}" != "${RELEASE_VERSION}" ]]; then
source_minor_version=$(echo "${source_version}" | cut -d. -f 1-2)
if [[ "${source_minor_version}" != "${MINOR_VERSION}" ]]; then
echo "Wrong bbolt minor version in version.go. Expected ${MINOR_VERSION} but got ${source_minor_version}. Aborting."
exit 1
fi
fi
# bump 'version.go'.
echo "Updating version from '${source_version}' to '${RELEASE_VERSION}' in 'version.go'"
if [[ "$OSTYPE" == "darwin"* ]]; then
sed -i '' "s/${source_version}/${RELEASE_VERSION}/g" ./version/version.go
else
sed -i "s/${source_version}/${RELEASE_VERSION}/g" ./version/version.go
fi
# push 'version.go' to remote.
echo "committing 'version.go'"
git add ./version/version.go
git commit -s -m "Update version to ${VERSION}"
git push origin "${RELEASE_BRANCH}"
echo "'version.go' has been committed to remote repo."
# create tag and push to remote.
echo "Creating new tag for '${VERSION}'"
key_id=$(get_gpg_key) || return 2
git tag --local-user "${key_id}" --sign "${VERSION}" --message "${VERSION}"
git push origin "${VERSION}"
echo "Tag '${VERSION}' has been created and pushed to remote repo."
echo "SUCCESS"
}
main "$1"