From cc99aa815b5efddddb34cc1fc5f3a0b1f815ed94 Mon Sep 17 00:00:00 2001 From: Shaun Arman Date: Sun, 31 May 2026 15:57:26 -0500 Subject: [PATCH 1/2] fix(ci): changelog job creates release to avoid race with build jobs The changelog and build-* jobs all fan out from autotag in parallel. Build jobs create the Gitea release with 'curl ... || true', but the changelog job was trying to GET the release before any build job had run, reliably failing with 'Could not find release for tag vX.Y.Z'. Fix: changelog job owns release creation. It creates the release with the git-cliff body if it does not exist, or patches the body if a prior run already created it. Build jobs continue using their existing create-or-skip + upload pattern unchanged. --- .gitea/workflows/auto-tag.yml | 45 +++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/.gitea/workflows/auto-tag.yml b/.gitea/workflows/auto-tag.yml index 17ae7522..c4d38bb0 100644 --- a/.gitea/workflows/auto-tag.yml +++ b/.gitea/workflows/auto-tag.yml @@ -140,7 +140,7 @@ jobs: echo "=== Release body preview ===" cat /tmp/release_body.md - - name: Update Gitea release body + - name: Create or update Gitea release env: RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }} RELEASE_TAG: ${{ needs.autotag.outputs.release_tag }} @@ -148,18 +148,43 @@ jobs: set -eu TAG="${RELEASE_TAG}" API="http://172.0.0.29:3000/api/v1/repos/$GITHUB_REPOSITORY" - RELEASE_ID=$(curl -sf "$API/releases/tags/$TAG" \ - -H "Authorization: token $RELEASE_TOKEN" | jq -r '.id') + RELEASE_BODY=$(cat /tmp/release_body.md) + + # Try to find an existing release for this tag + RELEASE_ID=$(curl -s "$API/releases/tags/$TAG" \ + -H "Authorization: token $RELEASE_TOKEN" | jq -r '.id // empty') + + if [ -z "$RELEASE_ID" ]; then + # Release doesn't exist yet — create it with the changelog body. + # Build jobs run in parallel and rely on the release existing; + # creating it here ensures no race condition. + echo "Creating release $TAG..." + RELEASE_ID=$(jq -n \ + --arg tag "$TAG" \ + --arg name "TFTSR $TAG" \ + --rawfile body /tmp/release_body.md \ + '{tag_name: $tag, name: $name, body: $body, draft: false}' \ + | curl -sf -X POST "$API/releases" \ + -H "Authorization: token $RELEASE_TOKEN" \ + -H "Content-Type: application/json" \ + --data @- \ + | jq -r '.id') + echo "✓ Release created (id=$RELEASE_ID)" + else + # Release already exists (e.g. re-run) — patch the body only + echo "Updating existing release $TAG (id=$RELEASE_ID)..." + jq -n --rawfile body /tmp/release_body.md '{body: $body}' \ + | curl -sf -X PATCH "$API/releases/$RELEASE_ID" \ + -H "Authorization: token $RELEASE_TOKEN" \ + -H "Content-Type: application/json" \ + --data @- + echo "✓ Release body updated" + fi + if [ -z "$RELEASE_ID" ] || [ "$RELEASE_ID" = "null" ]; then - echo "ERROR: Could not find release for tag $TAG" + echo "ERROR: Failed to create or locate release for $TAG" exit 1 fi - BODY=$(jq -n --rawfile note /tmp/release_body.md '{body: $note}') - curl -sf -X PATCH "$API/releases/$RELEASE_ID" \ - -H "Authorization: token $RELEASE_TOKEN" \ - -H "Content-Type: application/json" \ - -d "$BODY" - echo "✓ Release body updated" - name: Commit CHANGELOG.md to master env: From 7ee4f58bfd8eac5099aad04650d906b73f51b80c Mon Sep 17 00:00:00 2001 From: Shaun Arman Date: Sun, 31 May 2026 16:05:18 -0500 Subject: [PATCH 2/2] fix(ci): verify tag exists locally before running git-cliff Addresses the review warning: git rev-parse confirms the tag is present in the local repo after git fetch --tags before git-cliff or git tag --sort= runs against it. Fails fast with a clear error if the tag is missing rather than silently generating an incomplete changelog. --- .gitea/workflows/auto-tag.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitea/workflows/auto-tag.yml b/.gitea/workflows/auto-tag.yml index c4d38bb0..72b47f0e 100644 --- a/.gitea/workflows/auto-tag.yml +++ b/.gitea/workflows/auto-tag.yml @@ -128,6 +128,13 @@ jobs: # Use the tag output from autotag — never rely on git describe CURRENT_TAG="${RELEASE_TAG}" echo "Building changelog for $CURRENT_TAG" + + # Verify the tag is present locally after fetch before running git-cliff + if ! git rev-parse "refs/tags/${CURRENT_TAG}" >/dev/null 2>&1; then + echo "ERROR: tag ${CURRENT_TAG} not found locally after fetch" + exit 1 + fi + git-cliff --config cliff.toml --output CHANGELOG.md PREV_TAG=$(git tag --sort=-version:refname | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' \ | grep -v "^${CURRENT_TAG}$" | head -1 || echo "")