ci: Revert to local tag creation and push for releases (#5714)

This commit is contained in:
Mathias Fredriksson
2023-01-13 20:45:31 +02:00
committed by GitHub
parent 0cf713869b
commit e821b98918
5 changed files with 58 additions and 165 deletions
+24 -58
View File
@@ -7,7 +7,7 @@ cdroot
usage() {
cat <<EOH
Usage: ./release.sh [--branch <name>] [--draft] [--dry-run] [--ref <ref>] [--major | --minor | --patch]
Usage: ./release.sh [--dry-run] [--ref <ref>] [--major | --minor | --patch]
This script should be called to create a new release.
@@ -23,47 +23,24 @@ be tagged at, otherwise the latest commit will be used.
Set --minor to force a minor version bump, even when there are no breaking
changes. Likewise for --major. By default a patch version will be created.
Set --dry-run to run the release workflow in CI as a dry-run (no release will
be created).
Set --dry-run to see what this script would do without making actual changes.
To mark a release as containing breaking changes, the commit title should
either contain a known prefix with an exclamation mark ("feat!:",
"feat(api)!:") or the PR that was merged can be tagged with the
"release/breaking" label.
To test changes to this script, you can set --branch <my-branch>, which will
run the release workflow in CI as a dry-run and use the latest commit on the
specified branch as the release commit. This will also set --dry-run.
EOH
}
# Warn if CODER_IGNORE_MISSING_COMMIT_METADATA is set any other way than via
# --branch.
if [[ ${CODER_IGNORE_MISSING_COMMIT_METADATA:-0} != 0 ]]; then
log "WARNING: CODER_IGNORE_MISSING_COMMIT_METADATA is enabled externally, we will ignore missing commit metadata."
fi
branch=main
draft=0
dry_run=0
ref=
increment=
args="$(getopt -o h -l branch:,draft,dry-run,help,ref:,major,minor,patch -- "$@")"
args="$(getopt -o h -l dry-run,help,ref:,major,minor,patch -- "$@")"
eval set -- "$args"
while true; do
case "$1" in
--branch)
branch="$2"
log "Using branch $branch, implies DRYRUN and CODER_IGNORE_MISSING_COMMIT_METADATA."
dry_run=1
export CODER_IGNORE_MISSING_COMMIT_METADATA=1
shift 2
;;
--draft)
draft=1
shift
;;
--dry-run)
dry_run=1
shift
@@ -115,64 +92,53 @@ fi
# Check the current version tag from GitHub (by number) using the API to
# ensure no local tags are considered.
log "Checking GitHub for latest release..."
mapfile -t versions < <(gh api -H "Accept: application/vnd.github+json" /repos/coder/coder/git/refs/tags -q '.[].ref | split("/") | .[2]' | grep '^v' | sort -r -V)
old_version=${versions[0]}
log "Latest release: $old_version"
log
trap 'log "Check commit metadata failed, you can try to set \"export CODER_IGNORE_MISSING_COMMIT_METADATA=1\" and try again, if you know what you are doing."' EXIT
# shellcheck source=scripts/release/check_commit_metadata.sh
source "$SCRIPT_DIR/release/check_commit_metadata.sh" "$old_version" "$ref"
trap - EXIT
new_version="$(execrelative ./release/tag_version.sh --dry-run --ref "$ref" --"$increment")"
log "Executing DRYRUN of release tagging..."
new_version="$(execrelative ./release/tag_version.sh --old-version "$old_version" --ref "$ref" --"$increment" --dry-run)"
log
read -p "Continue? (y/n) " -n 1 -r continue_release
log
if ! [[ $continue_release =~ ^[Yy]$ ]]; then
exit 0
fi
release_notes="$(execrelative ./release/generate_release_notes.sh --old-version "$old_version" --new-version "$new_version" --ref "$ref")"
log
read -p "Preview release notes? (y/n) " -n 1 -r show_reply
log
if [[ $show_reply =~ ^[Yy]$ ]]; then
log
echo -e "$release_notes\n"
fi
create_message="Create release"
if ((draft)); then
create_message="Create draft release"
fi
if ((dry_run)); then
create_message+=" (DRYRUN)"
fi
read -p "$create_message? (y/n) " -n 1 -r create
read -p "Create release? (y/n) " -n 1 -r create
log
if ! [[ $create =~ ^[Yy]$ ]]; then
exit 0
fi
args=()
log
# Run without dry-run to actually create the tag, note we don't update the
# new_version variable here to ensure we're pushing what we showed before.
maybedryrun "$dry_run" execrelative ./release/tag_version.sh --old-version "$old_version" --ref "$ref" --"$increment" >/dev/null
maybedryrun "$dry_run" git push --tags -u origin "$new_version"
# Draft and dry-run are required args.
if ((draft)); then
args+=(-F draft=true)
else
args+=(-F draft=false)
fi
if ((dry_run)); then
args+=(-F dry_run=true)
else
args+=(-F dry_run=false)
# We only set this on non-dry-run releases because it will show a
# warning in CI.
if [[ ${CODER_IGNORE_MISSING_COMMIT_METADATA:-0} == 1 ]]; then
args+=(-F ignore_missing_commit_metadata=true)
fi
# We can't watch the release.yaml workflow if we're in dry-run mode.
exit 0
fi
log
logrun gh workflow run release.yaml \
--ref "$branch" \
-F increment="$increment" \
"${args[@]}"
log
read -p "Watch release? (y/n) " -n 1 -r watch
log
if ! [[ $watch =~ ^[Yy]$ ]]; then
+5 -3
View File
@@ -91,10 +91,12 @@ main() {
commit_sha_long=${parts[1]}
commit_prefix=${parts[2]}
if [[ $ignore_missing_metadata != 1 ]]; then
# Safety-check, guarantee all commits had their metadata fetched.
if [[ ! -v labels[$commit_sha_long] ]]; then
# Safety-check, guarantee all commits had their metadata fetched.
if [[ ! -v labels[$commit_sha_long] ]]; then
if [[ $ignore_missing_metadata != 1 ]]; then
error "Metadata missing for commit $commit_sha_short"
else
log "WARNING: Metadata missing for commit $commit_sha_short"
fi
fi
+1 -15
View File
@@ -35,10 +35,9 @@ fi
version=""
release_notes_file=""
draft=0
dry_run=0
args="$(getopt -o "" -l version:,release-notes-file:,draft,dry-run -- "$@")"
args="$(getopt -o "" -l version:,release-notes-file:,dry-run -- "$@")"
eval set -- "$args"
while true; do
case "$1" in
@@ -50,10 +49,6 @@ while true; do
release_notes_file="$2"
shift 2
;;
--draft)
draft=1
shift
;;
--dry-run)
dry_run=1
shift
@@ -134,20 +129,11 @@ popd
log
log
log "Pushing git tag"
maybedryrun "$dry_run" git push --quiet origin "$new_tag"
args=()
if ((draft)); then
args+=(--draft)
fi
# We pipe `true` into `gh` so that it never tries to be interactive.
true |
maybedryrun "$dry_run" gh release create \
--title "$new_tag" \
--notes-file "$release_notes_file" \
"${args[@]}" \
"$new_tag" \
"$temp_dir"/*
+16 -16
View File
@@ -7,23 +7,27 @@ cdroot
usage() {
cat <<EOH
Usage: ./version_tag.sh [--dry-run] [--ref <ref>] <--major | --minor | --patch>
Usage: ./version_tag.sh [--dry-run] [--old-version <version>] [--ref <ref>] <--major | --minor | --patch>
This script should be called to tag a new release. It will take the suggested
increment (major, minor, patch) and optionally promote e.g. patch -> minor if
there are breaking changes between the previous version and the given --ref
(or HEAD).
This script will create a git tag, so it should only be run in CI (or via
--dry-run).
Pass --old-version optionally to ensure that the version is bumped from the
provided version instead of the latest tag (for use in release.sh).
This script will create a git tag, it should only be called by release.sh or in
CI.
EOH
}
dry_run=0
old_version=
ref=HEAD
increment=
args="$(getopt -o h -l dry-run,help,ref:,major,minor,patch -- "$@")"
args="$(getopt -o h -l dry-run,help,old-version:,ref:,major,minor,patch -- "$@")"
eval set -- "$args"
while true; do
case "$1" in
@@ -31,6 +35,10 @@ while true; do
dry_run=1
shift
;;
--old-version)
old_version="$2"
shift 2
;;
--ref)
ref="$2"
shift 2
@@ -63,20 +71,12 @@ if [[ -z $increment ]]; then
error "No version increment provided."
fi
if [[ $dry_run != 1 ]] && [[ ${CI:-} == "" ]]; then
error "This script must be run in CI or with --dry-run."
if [[ -z $old_version ]]; then
old_version="$(git describe --abbrev=0 "$ref^1" --always)"
fi
old_version="$(git describe --abbrev=0 "$ref^1")"
cur_tag="$(git describe --abbrev=0 "$ref")"
cur_tag="$(git describe --abbrev=0 "$ref" --always)"
if [[ $old_version != "$cur_tag" ]]; then
message="Ref \"$ref\" is already tagged with a release ($cur_tag)"
if ! ((dry_run)); then
error "$message."
fi
log "DRYRUN: $message, echoing current tag."
echo "$cur_tag"
exit 0
error "A newer tag than \"$old_version\" already exists for \"$ref\" ($cur_tag), aborting."
fi
ref=$(git rev-parse --short "$ref")