77
88permissions :
99 contents : write
10+ id-token : write
11+ attestations : write
1012
1113env :
1214 CARGO_TERM_COLOR : always
@@ -244,10 +246,28 @@ jobs:
244246 env :
245247 VSCE_PAT : ${{ secrets.VSCE_PAT }}
246248
249+ # ── SBOM (Software Bill of Materials) ─────────────────────────────────
250+ build-sbom :
251+ name : Generate SBOM
252+ runs-on : ubuntu-latest
253+ steps :
254+ - uses : actions/checkout@v4
255+ - uses : dtolnay/rust-toolchain@stable
256+ - name : Install cargo-cyclonedx
257+ uses : taiki-e/install-action@v2
258+ with :
259+ tool : cargo-cyclonedx
260+ - name : Generate CycloneDX SBOM
261+ run : cargo cyclonedx --format json --output-file spar-sbom.cdx.json
262+ - uses : actions/upload-artifact@v4
263+ with :
264+ name : sbom
265+ path : spar-sbom.cdx.json
266+
247267 # ── Create GitHub Release ─────────────────────────────────────────────
248268 create-release :
249269 name : Create GitHub Release
250- needs : [build-binaries, build-compliance, build-test-evidence, build-vsix]
270+ needs : [build-binaries, build-compliance, build-test-evidence, build-vsix, build-sbom ]
251271 runs-on : ubuntu-latest
252272 steps :
253273 - uses : actions/checkout@v4
@@ -260,7 +280,7 @@ jobs:
260280 - name : Collect assets
261281 run : |
262282 mkdir -p release
263- find artifacts -type f \( -name "*.tar.gz" -o -name "*.zip" -o -name "*.vsix" \) -exec mv {} release/ \;
283+ find artifacts -type f \( -name "*.tar.gz" -o -name "*.zip" -o -name "*.vsix" -o -name "*.cdx.json" \) -exec mv {} release/ \;
264284 ls -la release/
265285
266286 - name : Generate checksums
@@ -272,9 +292,20 @@ jobs:
272292 - name : Create Release
273293 env :
274294 GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
295+ VERSION : ${{ github.ref_name }}
275296 run : |
276- VERSION="${GITHUB_REF#refs/tags/}"
277297 gh release create "$VERSION" \
278298 --title "spar $VERSION" \
279299 --generate-notes \
280300 release/*
301+
302+ - name : Attest release artifacts (SLSA provenance)
303+ env :
304+ GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
305+ run : |
306+ for file in release/*; do
307+ echo "Attesting: $file"
308+ gh attestation create "$file" \
309+ --repo "${{ github.repository }}" \
310+ --bundle-output "$file.jsonl" || true
311+ done
0 commit comments