ci: unbreak zizmor and cargo-deny, and stop upstream ref moves from re-breaking them - #155
Merged
Merged
Conversation
This was referenced Jul 25, 2026
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.
Summary
Every open Renovate PR (#145–#154) has been failing CI, and so has
mainitself since #143. Neither is a Renovate problem: nothing in this repository changed. Two upstream refs moved, and the version comments next to our pinned SHAs stopped matching them.zizmorwas never the variable.zizmorcore/zizmor-action@192e21d(v0.5.7) resolvesversion: latestthroughsupport/versionsinside that pinned action commit, which mapslatestto a fixedghcr.io/zizmorcore/zizmorimage digest — 1.26.1. Pinning the action SHA already pins the binary, so the audit set has been constant since #121 introduced it on 07-11. What changed was the online audits' input:zizmor-actionv0.5.7 (= zizmor 1.26.1)stable/master3 error[impostor-commit](high) +4 warning[ref-version-mismatch], all ondtolnay/rust-toolchainactions/checkoutv7.0.1 released, moving thev7tag# v7comments now name a ref that no longer resolves to the pinned v7.0.0 SHA8 mediumactions/checkoutpinsrust-toolchaindigestscheckoutfindings remainA third, independent failure hit #145 / #150 / #151:
cargo-deny'sbanscheck, because the ecosystem-widesyn2 → 3 migration puts two majors in the graph at once.This PR fixes both, and removes the class of breakage rather than just today's instance.
Changes
Stop naming moving refs in version comments. A comment like
# v7only passes while the pinned SHA happens to be the current tip of a tag that upstream keeps moving — a red window between every upstream release and Renovate's next run (this repo is onschedule: every weekend, so up to a week). Exact-version comments name an immutable tag instead.actions/checkout×8: bumped to3d3c42eand the comment changed# v7→# v7.0.1.actions/upload-artifact×3 andactions/download-artifact×1: SHA unchanged, comment only,# v7→# v7.0.1and# v8→# v8.0.1.Swatinem/rust-cache:e18b497 # v2→c193711 # v2.9.1. The pinned SHA had no exact tag pointing at it — only the movingv2. The two commits differ byCHANGELOG.md(+4 −0) and nothing else, so this is inert.dtolnay/rust-toolchain×4: suppress two structurally-false-positive audits. This action publishes via force-pushed branches, not tags, so there is no immutable ref to name. Both audits fire on a pin that is not actually compromised:ref-version-mismatchbecausestableno longer resolves to it,impostor-commitbecause the old SHA is no longer reachable from any ref. That is normal for this publisher, not an attack signal. Each of the four pins now carries an inline# zizmor: ignore[ref-version-mismatch,impostor-commit], with the reasoning written out at the first occurrence inci.ymland referenced from the other sites.Rejected alternative: pinning to the
v1tag.v1was last moved 2025-08-23 whilemasterhas moved five times since; itstoolchaininput isrequired: true, so the three# stablesites would each need an addedwith: toolchain: stable; and itsaction.ymlis missingRUSTUP_PERMIT_COPY_RENAME: 1. Replacing the action with directrustupcalls (whichzizmor'ssuperfluous-actionssuggests atinfoseverity, suppressed under this repo'sregularpersona) is a larger change to the release path and belongs in its own PR.deny.toml: tolerate thesyn2/3 split. Proc-macro crates cross tosyn3 one release at a time —clap_derive,serde_deriveandthiserror-implalready have;tokio-macros,tracing-attributesand the icu4x derives have not — so a two-major graph is unavoidable for months and merging the three PRs together does not resolve it. Added a documentedskipfollowing the existingbitflags@1.3.2precedent, rather than downgradingmultiple-versionsto"warn"(which that file's own comment rejects).Two deliberate details: the skip targets
syn@2, the older side, so it becomes a no-op and can be deleted as the migration completes — skippingsyn@3would leave it needed permanently. And it is a range, not an exact pin likebitflags@1.3.2, becausesyn2.x keeps shipping patches while the migration runs; an exact pin would go stale on the next Renovate lockfile bump.Verification
Run with the exact versions CI uses:
zizmor1.26.1 (matching the🌈 zizmor v1.26.1banner in the failing logs) andcargo-deny0.19.8 (ENV deny_versionincargo-deny-actionv2.0.20's Dockerfile) plus 0.20.2 (bundled by v2.1.1, which #146 upgrades to).zizmorwas run with a token so the online audits actually execute — without one they are silently skipped and the run is a false green.Before the fix, the reproduction matched CI exactly:
24 findings (16 suppressed, 8 unsafe fixes): 8 medium.Each open PR was merged onto this branch individually and both checks run:
cargo-deny0.19.8 / 0.20.2zizmorFor the
rust-toolchainignores, passing today proves nothing — today's pins match the branch tips. So the 07-17 failure was reconstructed by reverting the four pins to the stale SHAs and run both ways:No findings to report. (3 ignored, 16 suppressed)23 findings (16 suppressed): 4 medium, 3 highOne honest note on that mechanism: with only
impostor-commitlisted, the fourref-version-mismatchfindings also stop firing — appending the directive changes how the trailing comment parses, so that audit no longer evaluates rather than being explicitly ignored.ref-version-mismatchis kept in the list so that a futurezizmorwhich parses the comment correctly still finds an explicit entry.Follow-ups
actions/checkoutto the same3d3c42ethis PR uses (verified identical), but conflicts because this PR also rewrites the comment. Renovate is unlikely to auto-close it, since# v7.0.1reads as a different dependency version than thev7digest it was tracking.cargo-denyemitswarning[unnecessary-skip]: skip 'syn = =2' applied to a crate with only one version. Exit code 0, non-blocking — expected, not a regression.main.