37. Release Build in Reusable Workflow with SLSA v1 Build Level 3 Provenance¶
Date: 2026-10-19
Status¶
Accepted. Closes the HISS-11 exception declared in .standards.yaml for .github/workflows/release-matrix.yml.
Context¶
.standards.yaml declares SLSA Build Level 3 under supply_chain.slsa_level: 3. The build and signing jobs lived in the trigger workflow .github/workflows/release-matrix.yml, which signed SHA256SUMS with cosign but published no build provenance, so the measured level was 0. This gap was tracked as a dated category A exception under rule HISS-11 in .standards.yaml.
GitHub artifact attestations provide SLSA v1 Build Level 3 provenance only when the build runs inside a reusable workflow called by the trigger workflow, per GitHub's documentation "Using artifact attestations and reusable workflows to achieve SLSA v1 Build Level 3".
Decision¶
- Build and sign move to a reusable workflow. A new reusable workflow,
.github/workflows/release-build.yml(on: workflow_call), encapsulatesbuild-matrixandsignjobs. The caller workflow.github/workflows/release-matrix.ymlretains only triggers, input choices, and concurrency controls, delegating execution torelease-build.ymlvia a singlereleasejob. - Attest build provenance. In the
build-matrixjob, aftermake buildand compression and before uploading release assets,actions/attest@v4generates cryptographically signed in-toto SLSA provenance over that flavor's checksum filechecksums-${FLAVOR}.sha256. - Verify before release. The
build-matrixjob verifies the attestation bundle withgh attestation verifyagainst the flavor's CycloneDX SBOM before uploading release assets. - Publish attestation bundle. The attestation bundle is uploaded as a permanent release asset
provenance-<flavor>.sigstore.jsonalongside the flavor's image and metadata assets. - Update signing identities. Cosign verification binds to the reusable workflow identity
https://github.com/${GITHUB_REPOSITORY}/.github/workflows/release-build.yml@${GITHUB_REF}, matching the certificate emitted by GitHub's OIDC issuer. - HISS-11 exception removal. The HISS-11 exception entry for
release-matrix.ymlin.standards.yamlis deleted.
Consequences¶
- Positive: Every release asset carries signed SLSA v1 build provenance from the layout GitHub documents for Build Level 3, verifiable with
gh attestation verifyagainst GitHub's attestation store or the release assetprovenance-<flavor>.sigstore.json. The first published release is the first run of the new path; until then the wiring is covered bytests/test_release_provenance.pyonly. - Positive: The HISS-11 supply-chain exception in
.standards.yamlis resolved and removed. - Negative (breaking for verifiers): The Cosign OIDC certificate identity changes from
.github/workflows/release-matrix.yml@refs/tags/<tag>to.github/workflows/release-build.yml@refs/tags/<tag>. Downstream verifiers must update their--certificate-identityflags. - Neutral: Check run names for image builds and release signing change to
release / Build Image (<flavor>)andrelease / Sign the Release Checksums. TheKEEP_CHECKSfilter inrequired-aggregator.ymlis updated to exclude both forms.
References¶
- GitHub documentation: "Using artifact attestations and reusable workflows to achieve SLSA v1 Build Level 3".
- SLSA Specification: Source Levels for Security Artifacts, Version 1.0 (Build Level 3).
- ADR-0022: Fail-Closed Provisioners and Declared Main Protection (HISS-11 exception entry).
- ADR-0035: Required Checks Wait Only for Gate Workflows.