fix: make release PR creation robust against race conditions (#19)

Two fixes for intermittent release workflow failures:

- **Use `BASE_BRANCH` instead of `DEFAULT_BRANCH`** for the PR `base` field — `BASE_BRANCH` has a `:-main` fallback, preventing an empty base from causing a 404
- **Replace fixed `sleep 3` with proper polling and retry** — polls for branch readiness (up to 10 attempts) before creating the PR, then retries PR creation (up to 5 attempts) with backoff

Fixes the `Error creating PR (HTTP 404)` seen when Gitea hasn't fully indexed the `next-release` branch by the time the PR creation request fires.

🤖 Generated with [Claude Code](https://claude.ai/claude-code)

Reviewed-on: #19
This commit was merged in pull request #19.
This commit is contained in:
2026-03-23 15:52:25 +00:00
parent 068c6ef686
commit e3c17ceaa0
+36 -12
View File
@@ -189,27 +189,51 @@ jobs:
fi fi
echo "Creating new PR..." echo "Creating new PR..."
echo "Waiting for branch to be ready..." echo "Waiting for next-release branch to be ready..."
sleep 3 for i in $(seq 1 10); do
BRANCH_STATUS=$(curl -s --retry 3 --retry-delay 2 --retry-connrefused \
RESPONSE=$(curl -s --retry 3 --retry-delay 3 --retry-all-errors --retry-connrefused \ -w "%{http_code}" -o /dev/null \
-w "\n%{http_code}" -X POST \
-H "Authorization: token ${TOKEN}" \ -H "Authorization: token ${TOKEN}" \
-H "Content-Type: application/json" \ "${API_URL}/branches/next-release")
--data "$(jq -n \ if [ "${BRANCH_STATUS}" = "200" ]; then
echo "Branch ready after ${i} attempt(s)"
break
fi
if [ "${i}" = "10" ]; then
echo "Branch next-release not found after 10 attempts, giving up"
exit 1
fi
echo "Branch not ready yet (attempt ${i}/10), waiting..."
sleep 3
done
PR_DATA=$(jq -n \
--arg title "${TITLE}" \ --arg title "${TITLE}" \
--arg body "${DESCRIPTION}" \ --arg body "${DESCRIPTION}" \
--arg head "next-release" \ --arg head "next-release" \
--arg base "${DEFAULT_BRANCH}" \ --arg base "${BASE_BRANCH}" \
'{title: $title, body: $body, head: $head, base: $base}')" \ '{title: $title, body: $body, head: $head, base: $base}')
for i in $(seq 1 5); do
RESPONSE=$(curl -s --retry 3 --retry-delay 2 --retry-connrefused \
-w "\n%{http_code}" -X POST \
-H "Authorization: token ${TOKEN}" \
-H "Content-Type: application/json" \
--data "${PR_DATA}" \
"${API_URL}/pulls") "${API_URL}/pulls")
HTTP_CODE=$(echo "${RESPONSE}" | tail -1) HTTP_CODE=$(echo "${RESPONSE}" | tail -1)
BODY=$(echo "${RESPONSE}" | sed '$d') BODY=$(echo "${RESPONSE}" | sed '$d')
if [ "${HTTP_CODE}" -ge 400 ]; then if [ "${HTTP_CODE}" -lt 400 ]; then
echo "Error creating PR (HTTP ${HTTP_CODE}): ${BODY}" echo "PR created successfully"
break
fi
if [ "${i}" = "5" ]; then
echo "Error creating PR after 5 attempts (HTTP ${HTTP_CODE}): ${BODY}"
exit 1 exit 1
fi fi
echo "PR created successfully" echo "PR creation attempt ${i}/5 failed (HTTP ${HTTP_CODE}), retrying..."
sleep 3
done
create-release: create-release:
name: Create Release name: Create Release