Skip to content

fix(deps): clear the go-git advisories blocking every PR, and pin the toolchain - #287

Merged
pedromvgomes merged 1 commit into
mainfrom
fix/go-git-advisories
Aug 22, 2026
Merged

fix(deps): clear the go-git advisories blocking every PR, and pin the toolchain#287
pedromvgomes merged 1 commit into
mainfrom
fix/go-git-advisories

Conversation

@pedromvgomes

Copy link
Copy Markdown
Contributor

Every open pull request in this repository is currently red. govulncheck fails on GO-2026-6213 and GO-2026-6214, both in go-git v6.0.0-alpha.4, and both reachable from cmd/inforge/stack.go:217ephemeralWorkspaceauto.NewLocalWorkspacedotgit ref handling and worktree checkout.

main looks green because its last CI run was 2026-08-16, before the advisories were published. Dependabot #286 fails bulwarkPR Gate; so does everything else open.

The bump

go-git is indirect via Pulumi's Automation API, so it is bumped explicitly: alpha.4alpha.5, carrying go-billy to alpha.2 and x/net to v0.57.0. Build and the full test suite pass.

Why the toolchain pin rides along

Same failure, different form. go.mod asked for 1.25.11 while five workflow steps pinned 1.26.6, and govulncheck reports against whichever Go actually builds. Five of the vulnerabilities it finds locally are standard-library issues fixed in 1.26.6 — invisible in CI only because CI happens to pin the newer one. Dependabot updates neither number, so the two drift silently, and the gap is a security question rather than a tidiness one.

Stating it once in go.mod also unblocks the CI migration (#278), which moves every workflow onto setup-go's go-version-file. Without a toolchain line that resolves to 1.25.11 and would quietly downgrade CI.

Verification

bulwark v2.0.0, diff-scoped:

No vulnerabilities found.
[PASS] gosec
[PASS] govulncheck
[PASS] semgrep

Merging this should turn the 12 open Dependabot PRs and #279 green again.

… toolchain

govulncheck has been failing on every open pull request since GO-2026-6213
and GO-2026-6214 were published — both in go-git v6.0.0-alpha.4, both
reachable from cmd/inforge/stack.go:217 where ephemeralWorkspace calls
auto.NewLocalWorkspace, which reaches dotgit ref handling and worktree
checkout. main's last CI run predates the advisories, so main looks green
while nothing can merge: Dependabot #286 fails bulwark and therefore PR Gate,
and so does everything else open.

go-git is an indirect dependency via Pulumi's Automation API, so the bump is
explicit: alpha.4 -> alpha.5, which carries go-billy to alpha.2 and x/net to
v0.57.0. Build and the full suite pass on it.

The toolchain pin is here rather than in a tidy-up of its own because it is
the same failure in a different form. go.mod asked for 1.25.11 while five
workflow steps pinned 1.26.6, and govulncheck reports against whichever Go
actually builds — five of the vulnerabilities it finds locally are standard
library issues fixed in 1.26.6, invisible in CI only because CI happens to
pin the newer one. Dependabot updates neither number, so the two drift
silently and the gap is a security question rather than a tidiness one.

Stating it once in go.mod lets every workflow read it through setup-go's
go-version-file, which the CI migration then depends on: without a toolchain
line, go-version-file resolves to 1.25.11 and would quietly downgrade CI.

Verified with bulwark v2.0.0: gosec, govulncheck and semgrep all pass, "no
vulnerabilities found".
pedromvgomes added a commit that referenced this pull request Aug 22, 2026
The governance PR added the gt workflows but left ci.yml in place, so
ci-gate went green on a pipeline that ran nothing. This moves the work.

ci.yml's four jobs land as follows:

  - lint -> ci-build, as its own job. gt's stage vocabulary is
    preflight/build/test/end2end with no lint stage, and lint is not a test.
    Keeping it a separate job inside ci-build preserves the parallelism it
    had. bulwark does NOT make it redundant: bulwark runs gosec and
    govulncheck, not golangci-lint, so dropping it would lose real coverage.
  - build-test splits. `go build ./...` joins ci-build; `go test -race
    -coverprofile` and the artifact upload become ci-test.
  - bulwark is deleted, and bulwark.enabled comes out of .gt-repo.yaml so
    gt's own stage takes over. The override existed because this repository
    hand-rolled the job gt could not generically reproduce — that is no
    longer true once the pipeline is gt's. gt's version also names its
    secrets rather than inheriting them, which is what works across owners.
  - pr-gate is deleted; ci-gate is its replacement, and the ruleset's
    required context has to move with it — "PR Gate" stops existing the
    moment this merges.

The coverage artifact is renamed coverage-out -> gt-coverage. That exact
name is the contract gt's bulwark stage consumes; it mirrors the artifact's
tree into the scan root, and a single module rooted here means one
coverage.out at the top level lands where bulwark already looks.
.bulwark.yml already declares coverage.source: report, so this keeps the
one-test-run property ci.yml was built for.

Every setup-go now reads go-version-file: go.mod, in release.yml as well as
the new stages, so the toolchain is stated once. That depends on the
toolchain line added by #287 — without it go-version-file resolves to
1.25.11 and silently downgrades CI from 1.26.6.

The README's CI badge pointed at ci.yml and would have gone blank; it now
points at ci-orchestration.yml.

Re-synced with gt 1.3.0 first as its own step; `gt repo config` was
byte-identical across it apart from the version stamp.
@github-actions

Copy link
Copy Markdown

bulwark

  • scan — no findings

  • coverage — go: 66.8% (baseline 66.8%)

📦 Full bulwark output — complete scan and coverage logs.

@pedromvgomes
pedromvgomes merged commit 61df205 into main Aug 22, 2026
5 checks passed
@pedromvgomes
pedromvgomes deleted the fix/go-git-advisories branch August 22, 2026 17:33
pedromvgomes added a commit that referenced this pull request Aug 22, 2026
The governance PR added the gt workflows but left ci.yml in place, so
ci-gate went green on a pipeline that ran nothing. This moves the work.

ci.yml's four jobs land as follows:

  - lint -> ci-build, as its own job. gt's stage vocabulary is
    preflight/build/test/end2end with no lint stage, and lint is not a test.
    Keeping it a separate job inside ci-build preserves the parallelism it
    had. bulwark does NOT make it redundant: bulwark runs gosec and
    govulncheck, not golangci-lint, so dropping it would lose real coverage.
  - build-test splits. `go build ./...` joins ci-build; `go test -race
    -coverprofile` and the artifact upload become ci-test.
  - bulwark is deleted, and bulwark.enabled comes out of .gt-repo.yaml so
    gt's own stage takes over. The override existed because this repository
    hand-rolled the job gt could not generically reproduce — that is no
    longer true once the pipeline is gt's. gt's version also names its
    secrets rather than inheriting them, which is what works across owners.
  - pr-gate is deleted; ci-gate is its replacement, and the ruleset's
    required context has to move with it — "PR Gate" stops existing the
    moment this merges.

The coverage artifact is renamed coverage-out -> gt-coverage. That exact
name is the contract gt's bulwark stage consumes; it mirrors the artifact's
tree into the scan root, and a single module rooted here means one
coverage.out at the top level lands where bulwark already looks.
.bulwark.yml already declares coverage.source: report, so this keeps the
one-test-run property ci.yml was built for.

Every setup-go now reads go-version-file: go.mod, in release.yml as well as
the new stages, so the toolchain is stated once. That depends on the
toolchain line added by #287 — without it go-version-file resolves to
1.25.11 and silently downgrades CI from 1.26.6.

The README's CI badge pointed at ci.yml and would have gone blank; it now
points at ci-orchestration.yml.

Re-synced with gt 1.3.0 first as its own step; `gt repo config` was
byte-identical across it apart from the version stamp.
pedromvgomes added a commit that referenced this pull request Aug 22, 2026
The governance PR added the gt workflows but left ci.yml in place, so
ci-gate went green on a pipeline that ran nothing. This moves the work.

ci.yml's four jobs land as follows:

  - lint -> ci-build, as its own job. gt's stage vocabulary is
    preflight/build/test/end2end with no lint stage, and lint is not a test.
    Keeping it a separate job inside ci-build preserves the parallelism it
    had. bulwark does NOT make it redundant: bulwark runs gosec and
    govulncheck, not golangci-lint, so dropping it would lose real coverage.
  - build-test splits. `go build ./...` joins ci-build; `go test -race
    -coverprofile` and the artifact upload become ci-test.
  - bulwark is deleted, and bulwark.enabled comes out of .gt-repo.yaml so
    gt's own stage takes over. The override existed because this repository
    hand-rolled the job gt could not generically reproduce — that is no
    longer true once the pipeline is gt's. gt's version also names its
    secrets rather than inheriting them, which is what works across owners.
  - pr-gate is deleted; ci-gate is its replacement, and the ruleset's
    required context has to move with it — "PR Gate" stops existing the
    moment this merges.

The coverage artifact is renamed coverage-out -> gt-coverage. That exact
name is the contract gt's bulwark stage consumes; it mirrors the artifact's
tree into the scan root, and a single module rooted here means one
coverage.out at the top level lands where bulwark already looks.
.bulwark.yml already declares coverage.source: report, so this keeps the
one-test-run property ci.yml was built for.

Every setup-go now reads go-version-file: go.mod, in release.yml as well as
the new stages, so the toolchain is stated once. That depends on the
toolchain line added by #287 — without it go-version-file resolves to
1.25.11 and silently downgrades CI from 1.26.6.

The README's CI badge pointed at ci.yml and would have gone blank; it now
points at ci-orchestration.yml.

Re-synced with gt 1.3.0 first as its own step; `gt repo config` was
byte-identical across it apart from the version stamp.
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