ci: stop gating the build on the runner's Go patch release - #15
Merged
Conversation
The shared workflow's security job failed on any govulncheck finding, standard-library ones included. A stdlib finding names the version of Go the runner happens to have installed, so from the moment an advisory is published until the fixed toolchain reaches the setup-go manifest, every branch went red on something nobody here could act on. That window has been open on main since GO-2026-6090 and GO-2026-5972 landed, both fixed in go1.25.13. It also cascaded. A reusable workflow reports one conclusion for all of its jobs, so the failure skipped drivers, extension, bench and lint along with it. Set govulncheck-fail-on-findings false for that job and move the gate into a new vulncheck matrix. gosec still gates from the shared job. The gate itself moves into .github/actions/govulncheck-gate so the root module, extension and the four drivers all run the same rule instead of the drivers job carrying its own copy. Standard-library findings report; only reachable third-party findings missing from the allowlist fail the build. Verified locally against all six modules: root, extension and sftpdriver come back clean, and the other three match their existing allowlist entries. vulncheck deliberately does not declare needs: ci, so it cannot be skipped by a failure somewhere else.
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.
mainis red, and nothing in this repository caused it.Both findings describe the version of Go the runner happened to install. The fix for both is go1.25.13, which arrives when the toolchain reaches the setup-go manifest and not before. Between an advisory being published and that happening, every branch is red on something no one here can act on.
That window will keep reopening on every Go patch release, so this is not a one-off.
What it also broke
A reusable workflow reports one conclusion for all of its jobs. When
ci / Securityfailed, the wholecijob was marked failed, and everything declaringneeds: ciskipped with it:drivers,extension,bench,lint. A skipped job reports as neither pass nor fail, so four modules quietly stopped being built and tested while the run still looked healthy.The
if: ${{ !cancelled() }}change already on main stops the cascade. This PR removes the cause.The fix
govulncheck-fail-on-findingsgoes tofalseon the shared job. gosec still gates from there, and govulncheck findings are still reported, they just stop failing the build on the toolchain's behalf.The real gate moves to a new
vulncheckmatrix that scans every module in the repository:That closes a second hole at the same time. govulncheck resolves imports per module, so the shared job's scan of the repository root never once looked at the sub-modules, which is where every third-party dependency the project ships actually lives.
vulncheckdeliberately does not declareneeds: ci. A vulnerability gate that a failure elsewhere can skip is not a gate.The rule it applies:
.github/govulncheck-allowlist.txt, which stays a backlog rather than an exemption. Delete a line to enforce a fix.One gate, not two copies
The
driversjob was carrying its own copy of that script. It now lives in.github/actions/govulncheck-gateand both callers use it, so the allowlist handling and the stdlib split cannot drift apart.Verified
Every module was scanned locally before any of this was committed.
Root and
extensionhave no reachable third-party findings at all, so neither one needs an allowlist entry. Worth noting how lopsided those columns are: gate on the left-hand column and the build is red permanently, for reasons that change every few weeks and never involve this code.Worth knowing
Re-running the failed job on main does not fix it. go1.25.13 is released and sits in the setup-go manifest, but a re-run still came back reporting
Found in: crypto/tls@go1.25.12, because the runner image already ships a Go that satisfies the"1.25"spec and setup-go takes the cached hit instead of downloading the newer patch. So main stays red until the runner image rolls forward on GitHub's schedule, or until this lands.The
securityjob's govulncheck output is still visible in the run summary. You lose the automatic failure on a root-module finding from that job, butvulncheck (root)gates on exactly that, with the stdlib noise removed.Nothing here touches the
docs/Next.js alerts or the three allowlisted driver backlogs. Those are still open.