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'.
This commit is contained in:
rcourtman 2025-11-12 15:47:21 +00:00
parent bf8622eeaa
commit ba6d019c5b

View file

@ -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 }}