From ba6d019c5bad9924fd2169d295a7f1724acfed5b Mon Sep 17 00:00:00 2001 From: rcourtman Date: Wed, 12 Nov 2025 15:47:21 +0000 Subject: [PATCH] Fix eventual consistency issue with release API lookup The releases REST API endpoint is eventually consistent for draft releases. Immediately after gh release create, the new release may not appear in the listing yet, causing the release_id lookup to return empty and fail validation. Add retry loop (10 attempts, 2s intervals) to wait for the release to appear in the API before extracting the ID. Also add validation to ensure we got a valid release_id before proceeding. This fixes the immediate validation failure with 'Release metadata is missing'. --- .github/workflows/release.yml | 36 ++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6ea246c..2922fb0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -377,13 +377,47 @@ jobs: # The validation workflow needs the numeric ID for REST API calls # Note: /releases/tags/{tag} endpoint doesn't work for draft releases, # so we list all releases and filter by tag_name - RELEASE_JSON=$(gh api "repos/${{ github.repository }}/releases" | jq ".[] | select(.tag_name == \"${TAG}\")") + # The releases endpoint is eventually consistent, so retry until the release appears + echo "Waiting for release to appear in GitHub API..." + MAX_ATTEMPTS=10 + ATTEMPT=1 + RELEASE_JSON="" + + while [ $ATTEMPT -le $MAX_ATTEMPTS ]; do + echo "Attempt $ATTEMPT/$MAX_ATTEMPTS: Looking for release ${TAG}..." + RELEASE_JSON=$(gh api "repos/${{ github.repository }}/releases" --paginate | jq ".[] | select(.tag_name == \"${TAG}\")") + + if [ -n "$RELEASE_JSON" ]; then + echo "✓ Found release in API" + break + fi + + if [ $ATTEMPT -lt $MAX_ATTEMPTS ]; then + echo "Release not indexed yet, waiting 2 seconds..." + sleep 2 + fi + + ATTEMPT=$((ATTEMPT + 1)) + done + + if [ -z "$RELEASE_JSON" ]; then + echo "::error::Failed to find release ${TAG} in API after $MAX_ATTEMPTS attempts" + exit 1 + fi + RELEASE_ID=$(echo "$RELEASE_JSON" | jq -r '.id') + if [ -z "$RELEASE_ID" ] || [ "$RELEASE_ID" = "null" ]; then + echo "::error::Failed to extract release ID from API response" + exit 1 + fi + echo "release_url=$(echo "$RELEASE_JSON" | jq -r '.html_url')" >> $GITHUB_OUTPUT echo "release_id=${RELEASE_ID}" >> $GITHUB_OUTPUT echo "tag=${TAG}" >> $GITHUB_OUTPUT + echo "✓ Release ID: ${RELEASE_ID}" + - name: Upload checksums.txt env: GH_TOKEN: ${{ github.token }}