From 17e5c5c081265f5ff01af504f8415a1a329a16b7 Mon Sep 17 00:00:00 2001 From: Roman Lemekha Date: Fri, 26 Jun 2026 13:55:32 +0200 Subject: [PATCH] fix: retry major-tag move to survive transient 422 after release merge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The release commit can briefly return "Reference does not exist" (HTTP 422) immediately after the release PR merges — the object is not yet ref-able. The v1 tag had to be created by hand for v1.1.0. Wrap the create/update in a 5x retry with backoff so the moving major tag lands automatically. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/release-please.yml | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 73662c2..e20bbd3 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -83,11 +83,22 @@ jobs: run: | set -euo pipefail ref="tags/v${MAJOR}" - # Update the ref if it exists, otherwise create it. - if gh api "repos/${REPO}/git/refs/${ref}" >/dev/null 2>&1; then - gh api -X PATCH "repos/${REPO}/git/refs/${ref}" -F sha="${SHA}" -F force=true >/dev/null - echo "Moved tag v${MAJOR} -> ${SHA}" - else - gh api -X POST "repos/${REPO}/git/refs" -f ref="refs/tags/v${MAJOR}" -f sha="${SHA}" >/dev/null - echo "Created tag v${MAJOR} -> ${SHA}" - fi + move_tag() { + # Update the ref if it exists, otherwise create it. + if gh api "repos/${REPO}/git/refs/${ref}" >/dev/null 2>&1; then + gh api -X PATCH "repos/${REPO}/git/refs/${ref}" -F sha="${SHA}" -F force=true >/dev/null + echo "Moved tag v${MAJOR} -> ${SHA}" + else + gh api -X POST "repos/${REPO}/git/refs" -f ref="refs/tags/v${MAJOR}" -f sha="${SHA}" >/dev/null + echo "Created tag v${MAJOR} -> ${SHA}" + fi + } + # The release commit can briefly 422 ("Reference does not exist") right + # after the release PR merges (object not yet ref-able), so retry. + for attempt in 1 2 3 4 5; do + if move_tag; then exit 0; fi + echo "tag move attempt ${attempt} failed; retrying in 5s" + sleep 5 + done + echo "::error::failed to move major tag v${MAJOR} after retries" + exit 1