Skip to content

ci(release): SLSA Build L3 provenance via slsa-github-generator - #112

Merged
mountainowl merged 1 commit into
mainfrom
ci/slsa-l3-provenance
Jun 17, 2026
Merged

ci(release): SLSA Build L3 provenance via slsa-github-generator#112
mountainowl merged 1 commit into
mainfrom
ci/slsa-l3-provenance

Conversation

@mountainowl

Copy link
Copy Markdown
Owner

What

Adds SLSA Build Level 3 provenance to the release pipeline (you said yes to this), on top of the existing cosign signing + SBOM.

  • The release job emits a hashes output — base64 sha256 of the distributables (wheel, sdist, deploy bundle, SBOM); these are the SLSA subjects. Computed after build/SBOM, before cosign (the .bundle signatures aren't distributables).
  • A new provenance job calls slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v2.1.0, which builds + keyless-signs an in-toto provenance attestation in an isolated trusted builder (the isolation is what earns L3) and attaches the .intoto.jsonl to the release.

Notes

  • The generator is pinned to a version tag (v2.1.0, the current latest), not a SHA — it reads its own ref to assert the trusted-builder identity, so a SHA pin breaks it. This is the documented exception to the repo's hash-pinning convention (OpenSSF Scorecard's pinned-dependencies check may flag it; it's expected).
  • Takes effect on the next tagged release. Verify any artifact with slsa-verifier verify-artifact <art> --provenance-path <art>.intoto.jsonl --source-uri github.com/mountainowl/bubo.
  • The SLSA L3 badge (+ the cosign badge that didn't land in docs: lead README + docs home with a badge row (PyPI, Docker, Ruff, cosign) + feature subtitle #108) will come in the badge-completeness PR, to keep all README badge-row edits in one place.

Verification

  • release.yml parses; provenance job wired with correct needs/permissions/base64-subjects. (Provenance generation itself can only be exercised by a real tag push.)

Earns a legitimate SLSA Build Level 3 attestation for released artifacts
(wheel, sdist, deploy bundle, SBOM), complementing the existing cosign
signing + SBOM:

- The release job now emits a `hashes` output — base64 sha256 of the
  distributables (the SLSA subjects), computed after build/SBOM and before
  cosign (the .bundle signatures are excluded, they are not distributables).
- A new `provenance` job calls the slsa-github-generator generic L3 reusable
  workflow, which generates and keylessly signs an in-toto provenance
  attestation and attaches the .intoto.jsonl to the release. The generator
  runs in an isolated trusted builder — that isolation is what makes it L3.

The generator is pinned to a version tag (v2.1.0), not a SHA, because it
reads its own ref to assert the trusted-builder identity — the documented
exception to this repo's hash-pinning convention.

Verify:
  slsa-verifier verify-artifact <artifact> \
    --provenance-path <artifact>.intoto.jsonl \
    --source-uri github.com/mountainowl/bubo
@mountainowl
mountainowl merged commit dac863e into main Jun 17, 2026
4 checks passed
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