Why
A release attaches the binaries, the packages, and SHA256SUMS, but not the
component list they were built from. Someone answering “is this instance
affected by an advisory in a dependency” has to check out the tag and rebuild
go.mod’s graph by hand, and a downstream packager has no authoritative list to
compare against.
Nothing has to be invented to produce that list: go.mod and go.sum pin every
module, the release image pins the toolchain and the SQLite development library,
and the build is already reproducible (SOURCE_DATE_EPOCH, no build id).
Scope
- Generate one SBOM per release from the pinned build, in a machine-readable format (SPDX-JSON or CycloneDX), naming every Go module version, the Go toolchain, and the SQLite library version the binary links through cgo.
- Generate it with a pinned tool, the way
govulncheckandnfpmare pinned, so a local run and the release run agree. - Attach it to the tag’s release beside
SHA256SUMSin.vole/workflows/release.yamlwithrelease: true. - Keep it reproducible: the same tag produces the same SBOM bytes.
- Document in
docs/releases.mdwhat it covers and what it does not.
Out of scope: the runner images in .vole/images. They are built on the runner
host, not by the release, so their contents are a runner concern.
Acceptance
- A release page lists the SBOM next to
SHA256SUMS. - It names
github.com/mattn/go-sqlite3and the linked SQLite version, not just the module names. - Rebuilding the same tag produces an identical SBOM.
docs/releases.mdsays what the SBOM covers, who consumes it, and how to regenerate it.
Part of #14.