Skip to content

ci: let release tags actually trigger a release - #384

Merged
huyplb merged 2 commits into
mainfrom
fix/release-tags-actually-trigger
Sep 7, 2026
Merged

ci: let release tags actually trigger a release#384
huyplb merged 2 commits into
mainfrom
fix/release-tags-actually-trigger

Conversation

@huyplb

@huyplb huyplb commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Tagging a release has been a no-op since v0.2.73. v0.2.111 and v0.2.220 were both tagged and pushed; neither fired Release Gate, npm Publish or Web Release. Zero workflow runs, and no error anywhere to notice — today's release only went out because I dispatched each workflow by hand.

Cause

A release tag lands on the version-bump commit, and that commit's message ends in [skip ci]. GitHub honours that marker for every push event touching the commit — a tag push included — so it suppressed the release along with the branch build it was meant to skip.

Tag Tagged commit Fired?
v0.2.220 chore: bump version to 0.2.220 **[skip ci]**
v0.2.111 chore: bump version to 0.2.111 **[skip ci]**
v0.2.73 fix(web): list all providers… (0.2.73)

The marker was not preventing the loop

The bump job already refuses to bump its own commit:

if: !startsWith(github.event.head_commit.message, 'chore: bump version') && …

[skip ci] only saved CI on a commit that changes four version fields and nothing else. So the saving moves somewhere it cannot take releases down with it: each push-triggered workflow now skips bump commits by message.

if: >-
  github.event_name != 'push'
  || !startsWith(github.event.head_commit.message, 'chore: bump version')
  • github.event_name != 'push' keeps pull_request runs untouched — without it this would disable PR checks on any branch whose head commit happened to be a bump.
  • Applied only to the five branches: [main] workflows. The three tag workflows are deliberately left unguarded — that is the whole point.

Verification, and its limit

This PR's own checks verify half of it: they run on pull_request, so a green run proves the guard does not skip PR builds.

The other half is not provable here. Nothing in CI can push a tag, so "a tag now fires a release" is only confirmed by the next real tag. Worth knowing before treating a green tick as proof — that assumption is exactly what let this sit broken across two releases.

🤖 Generated with Claude Code


Note

Medium Risk
Changes release and CI gating behavior; wrong if: logic could skip PR checks or re-run heavy jobs on bump commits, but tag releases should work again.

Overview
Fixes silent release failures caused by [skip ci] on version-bump commits. GitHub applies that marker to every push for the commit, including tag pushes, so Release Gate, npm Publish, and Web Release never ran for tags like v0.2.111 and v0.2.220.

version-bump.yml now commits with chore: bump version to $V only (no [skip ci]), with comments documenting why.

Push-to-main workflows (build-gate, CodeQL, dependency security, deps backdoor scan, secret scan) gain a shared job if: so branch pushes whose head message starts with chore: bump version skip CI, while pull_request runs are never skipped. Tag-triggered release workflows stay unguarded so tags on bump commits can run releases again.

Reviewed by Cursor Bugbot for commit 7052c4c. Bugbot is set up for automated code reviews on this repo. Configure here.

Tagging a release has been a no-op since v0.2.73. v0.2.111 and v0.2.220 were
both tagged and pushed, and neither fired Release Gate, npm Publish or Web
Release — zero workflow runs, no error anywhere to notice.

The cause is that a release tag lands on the version-bump commit, whose
message ends in `[skip ci]`. GitHub honours that marker for *every* push event
touching the commit, and a tag push is a push event, so the marker suppressed
the release along with the branch build it was meant to skip. v0.2.73 released
fine because its tag sat on an ordinary fix commit.

`[skip ci]` was not what prevented the bump loop — the `if:` on the bump job
already refuses to bump a "chore: bump version" commit. The marker only saved
CI on a commit that changes four version fields and nothing else.

So the saving moves to where it cannot take releases down with it: each
push-triggered workflow skips bump commits by message. The guard is written
`github.event_name != 'push' || …` so pull_request runs are never affected,
and it is only on the five `branches: [main]` workflows — the three tag
workflows are left unguarded, which is the entire point.

Verified by construction here, and half of it by this PR's own checks: they
run on pull_request, so a green run proves the guard does not skip PR builds.
The other half — a tag firing a release — is only provable by the next tag,
since nothing in CI can push one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@cursor

cursor Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_d86567a1-818b-49d3-9606-bd508b377773)

The first form used a folded scalar and GitHub created no runs at all for the
branch — not skipped jobs, no runs — while an unrelated PR opened minutes later
ran all four workflows normally.

The expression matches on 'chore: bump version', and that colon-space is a
mapping indicator to YAML. Written bare inside ${{ }} it makes the parser read
the line as a nested mapping:

    mapping values are not allowed here
      ... vent.head_commit.message, 'chore: bump version') }}

Double-quoting the whole value settles it, and single quotes inside stay
readable.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@cursor

cursor Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_c9d25f86-b270-4c12-9daf-97b31bf023de)

@huyplb
huyplb merged commit 9539a4d into main Sep 7, 2026
12 checks passed
@huyplb
huyplb deleted the fix/release-tags-actually-trigger branch September 7, 2026 23:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant