Clear the last zizmor findings in the release workflows - #6281
Merged
Conversation
Every expression in this workflow's run blocks is now bound through env:. The version is the same value throughout and is checked against a semver pattern before any of these steps run, so this is consistency rather than a fix. The checkout stops persisting credentials. The single push in this job supplies its token in the remote URL, so the credential actions/checkout leaves in .git/config was never what authenticated it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Neither releaser.yml nor create-release-pr.yml contains a git push, commit or tag. GoReleaser uploads release assets through the API with the token it is given, and pushes the Homebrew formula with a separate app token; releaseo is handed the release app token explicitly. In both workflows the credential actions/checkout leaves behind is unused. Two of the three releaser jobs declare contents: read and so could not push regardless. This clears the last findings: zizmor now reports none across .github. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
rdimitrov
approved these changes
Aug 10, 2026
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #6281 +/- ##
==========================================
+ Coverage 72.73% 72.75% +0.02%
==========================================
Files 742 742
Lines 77325 77325
==========================================
+ Hits 56244 56261 +17
+ Misses 17116 17083 -33
- Partials 3965 3981 +16 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follows #6275, which did the same for
helm-publish.yml. This clears the last of them:zizmornow reports no findings at all across.github/.Summary
create-release-tag.yml— 9 findings → 0. Every expression in arun:block is bound throughenv:, and the checkout stops persisting credentials.releaser.yml×3 andcreate-release-pr.yml×1 — the remainingartipackedfindings. Checkouts that kept a credential none of them uses.Repository total: 13 → 0. The starting point was 111.
This is consistency, not a fix
Seven of the eight
template-injectionfindings are the same value —steps.version.outputs.version— which the job checks against^[0-9]+\.[0-9]+\.[0-9]+$before any of these steps run. The eighth pair aresteps.check-*.outputs.exists, which the workflow sets itself to the literaltrueorfalse. None could carry a shell metacharacter. The genuinely unconstrained value in this file, theRelease-Triggered-Bycommit trailer, was bound in #6272.Why the checkout changes are safe
None of these three workflows uses the persisted credential:
create-release-tag.ymlgit push— but asgit push "https://x-access-token:${GH_TOKEN}@github.com/${REPOSITORY}.git". The token is in the remote URL, so.git/configis never consulted.releaser.ymlgit push,commitortag. GoReleaser uploads assets through the API with the token it is given, and pushes the Homebrew formula with a separate app token. Two of its three checkouts are in jobs declaringcontents: readand could not push regardless.create-release-pr.ymlreleaseois handed the release app token explicitly as an input.Each change carries a comment recording this, so the next reader does not have to re-derive it.
Deliberately not restructured
The version is bound per-step rather than exported once via
$GITHUB_ENV. Sixenv:blocks repeating one line is more verbose, but moving a value from a step output into the job environment changes how it flows between steps — a refactor of plumbing in workflows no pull request can exercise. An earlier attempt at this file did exactly that and was correctly pushed back on. The verbose version is the safe one.Part of #6253
Type of change
Test plan
Unit tests (
task test)E2E tests (
task test-e2e)Linting (
task lint-fix)Manual testing (describe below)
Checked every shell variable in every step resolves. Collected each step's available names — workflow
env:, jobenv:, stepenv:, locally assigned, and GitHub-provided — and compared against every$VARreferenced. Nothing undefined.Confirmed no
run:block contains an expression any more, by walking the block structure rather than grepping for a pattern.Confirmed how each workflow authenticates, as tabled above, rather than assuming the credential was unused.
All workflows parse as YAML;
actionlintreports 12 findings before and after, all pre-existing.zizmoracross.github/: no findings to report.None of this can be verified before merge. All three workflows run only on release events.
create-release-tag.ymlfailing would stop the run after the release pull request merges but before the tag exists, so nothing would be half-published; recovery is re-running it or tagging by hand.Does this introduce a user-facing change?
No.
Special notes for reviewers
mediumtolowor lower, since there is nothing left for it to catch. Worth doing as a follow-up once a release has passed through these workflows unchanged — tightening the threshold before the first real exercise would mean two untested changes at once.Generated with Claude Code