Compare commits

...

3 Commits

Author SHA1 Message Date
3fe06ce498 Merge pull request 'fix(ci): push detached HEAD to master using HEAD:master refspec' (#57) from fix/auto-tag-push-master into master
All checks were successful
Auto Tag / autotag (push) Successful in 7s
Auto Tag / wiki-sync (push) Successful in 6s
Test / rust-fmt-check (push) Successful in 1m36s
Test / frontend-tests (push) Successful in 2m14s
Test / frontend-typecheck (push) Successful in 2m15s
Auto Tag / changelog (push) Successful in 2m14s
Auto Tag / build-macos-arm64 (push) Successful in 3m9s
Test / rust-clippy (push) Successful in 4m58s
Test / rust-tests (push) Successful in 6m24s
Auto Tag / build-linux-amd64 (push) Successful in 8m52s
Auto Tag / build-windows-amd64 (push) Successful in 10m51s
Auto Tag / build-linux-arm64 (push) Successful in 11m1s
Reviewed-on: #57
2026-05-31 21:43:18 +00:00
Shaun Arman
34a69620f5 fix(ci): consolidate all auto-tag changelog fixes
All checks were successful
Test / rust-fmt-check (pull_request) Successful in 1m25s
Test / frontend-typecheck (pull_request) Successful in 1m53s
Test / frontend-tests (pull_request) Successful in 1m53s
Test / rust-clippy (pull_request) Successful in 3m12s
PR Review Automation / review (pull_request) Successful in 4m24s
Test / rust-tests (pull_request) Successful in 4m37s
Three issues addressed together:

1. Race condition (was PR #56): changelog job now CREATES the Gitea
   release rather than assuming build jobs have already created it.
   Build jobs continue to use create-or-skip + upload unchanged.

2. Detached HEAD push: 'git push origin master' fails when HEAD is
   detached (no local branch named master). Changed to 'HEAD:master'.

3. git-cliff tag guard: verify tag is present locally before running
   git-cliff, to fail fast with a clear message rather than silently
   generating a wrong changelog.

4. git commit idiom: replaced 'git commit || echo' (swallows all
   non-zero exit codes including real failures) with an explicit
   'git diff --staged --quiet' guard so set -euo pipefail is not
   undermined.
2026-05-31 16:38:02 -05:00
Shaun Arman
f90c76911a fix(ci): push detached HEAD to master using HEAD:master refspec
The changelog job checks out a specific SHA (detached HEAD) then
commits CHANGELOG.md and tries to push with 'git push origin master'.
Since there is no local branch named 'master', git rejects the push
with 'src refspec master does not match any'.

Fix: use 'git push origin HEAD:master' which explicitly maps the
current detached HEAD to the remote master branch regardless of
local branch state.
2026-05-31 16:37:25 -05:00

View File

@ -125,11 +125,10 @@ jobs:
RELEASE_TAG: ${{ needs.autotag.outputs.release_tag }}
run: |
set -eu
# 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
# Verify the tag is present locally after fetch
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
@ -141,7 +140,7 @@ jobs:
if [ -n "$PREV_TAG" ]; then
git-cliff --config cliff.toml --tag "$CURRENT_TAG" --strip all > /tmp/release_body.md || true
else
echo "=== No previous tag found, generating from git commits ==="
echo "No previous tag found, generating from git commits"
git log --pretty=format:"- %s" > /tmp/release_body.md || true
fi
echo "=== Release body preview ==="
@ -155,16 +154,14 @@ jobs:
set -eu
TAG="${RELEASE_TAG}"
API="http://172.0.0.29:3000/api/v1/repos/$GITHUB_REPOSITORY"
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.
# First run: changelog job owns release creation so build jobs
# never race against a missing release object
echo "Creating release $TAG..."
RELEASE_ID=$(jq -n \
--arg tag "$TAG" \
@ -178,7 +175,7 @@ jobs:
| jq -r '.id')
echo "✓ Release created (id=$RELEASE_ID)"
else
# Release already exists (e.g. re-run) — patch the body only
# 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" \
@ -199,14 +196,21 @@ jobs:
run: |
set -euo pipefail
TAG="${RELEASE_TAG}"
# Validate tag format to prevent shell injection in commit message / JSON
if ! echo "$TAG" | grep -qE '^v[0-9]+\.[0-9]+\.[0-9]+$'; then
echo "ERROR: Unexpected tag format: $TAG"
exit 1
fi
git add CHANGELOG.md
git commit -m "chore: update CHANGELOG.md for ${TAG} [skip ci]" || echo "No changes to commit"
git push origin master
# Only commit if CHANGELOG.md actually changed — avoids ambiguous
# exit-code handling from 'git commit || echo' with set -e
if git diff --staged --quiet; then
echo "No CHANGELOG.md changes to commit"
else
git commit -m "chore: update CHANGELOG.md for ${TAG} [skip ci]"
fi
# HEAD:master works in detached HEAD state; 'git push origin master'
# would fail because there is no local branch named master
git push origin HEAD:master
echo "✓ CHANGELOG.md committed to master"
- name: Upload CHANGELOG.md as release asset