Skip to content

chore(release): align release pipeline with synth reference (SBOM + SLSA + build-env)#330

Merged
avrabe merged 1 commit into
mainfrom
chore/release-pipeline-standardize-to-synth
May 25, 2026
Merged

chore(release): align release pipeline with synth reference (SBOM + SLSA + build-env)#330
avrabe merged 1 commit into
mainfrom
chore/release-pipeline-standardize-to-synth

Conversation

@avrabe
Copy link
Copy Markdown
Contributor

@avrabe avrabe commented May 24, 2026

Summary

Adopts the standardized pulseengine release pattern (per the per-repo Claude agent brief) so rivet's release-asset shape matches synth / spar / sigil / witness. Rivet already had cosign-keyless SHA256SUMS signing; this PR closes the remaining gaps:

  • CycloneDX SBOM generated BEFORE SHA256SUMS.txt so its digest enters the manifest (cosign signature transitively covers it).
  • SLSA v1 build provenance via actions/attest-build-provenance@v2 over every release-assets/*.tar.gz.
  • build-env.txt capturing rustc / cargo / cosign / runner versions (prerequisite for REQ-094 `rivet release-verify`).
  • attestations: write permission added alongside the existing contents: write + id-token: write.
  • Asset staging dir renamed release/release-assets/ to match the cross-repo shared name, so the verification one-liners are copy-pasteable across repos.

Final release-asset shape

```
rivet-vX.Y.Z-.{tar.gz|zip}
rivet-X.Y.Z.cdx.json
SHA256SUMS.txt
SHA256SUMS.txt.sig
SHA256SUMS.txt.pem
SHA256SUMS.txt.cosign.bundle
build-env.txt
(plus VSIX + compliance bundle from existing jobs)
```

Verification one-liners (for release notes)

```bash
cosign verify-blob \
--certificate-identity-regexp \
'https://github.com/pulseengine/rivet/.github/workflows/release.yml@.*' \
--certificate-oidc-issuer \
'https://token.actions.githubusercontent.com' \
--bundle SHA256SUMS.txt.cosign.bundle SHA256SUMS.txt

gh attestation verify rivet-vX.Y.Z-.tar.gz \
--repo pulseengine/rivet
```

Test plan

  • YAML parses (`python3 -c "import yaml; yaml.safe_load(...)"`)
  • CI run on this PR (mostly a no-op; the release.yml only fires on `v*` tags)
  • Next `v0.13.1` tag exercises the full chain end-to-end

What this does NOT do

  • Does not implement REQ-094 (`rivet release-verify`) — that REQ takes the same verification one-liners and bakes them into a single subcommand. This PR ships the producer-side primitives that REQ-094 will then consume.
  • Does not change the existing compliance-bundle or VSIX jobs; their outputs flow through the same `release-assets/` dir untouched.

Refs: REQ-068, REQ-094

🤖 Generated with Claude Code

Copy link
Copy Markdown

@ghost ghost left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Performance Alert ⚠️

Possible performance regression was detected for benchmark 'Rivet Criterion Benchmarks'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.20.

Benchmark suite Current: d27c128 Previous: cfe0cdf Ratio
store_insert/10000 20051567 ns/iter (± 2915939) 13754166 ns/iter (± 376068) 1.46
validate/10000 15358313 ns/iter (± 2400397) 12574742 ns/iter (± 634955) 1.22

This comment was automatically generated by workflow using github-action-benchmark.

@codecov
Copy link
Copy Markdown

codecov Bot commented May 24, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@avrabe avrabe force-pushed the chore/release-pipeline-standardize-to-synth branch 3 times, most recently from d27c128 to ae4e2af Compare May 25, 2026 09:45
… + SLSA + build-env)

Adopts the standardized pulseengine release pattern (per the
"per-repo Claude agent" brief): every release ships a CycloneDX SBOM,
a SLSA v1 build-provenance attestation, a signed SHA256SUMS, and a
build-env record naming the toolchain it was produced with.

Rivet already had cosign-keyless SHA256SUMS signing; the missing legs
were the SBOM (must precede the sums so its digest is captured in the
manifest), the SLSA provenance step, the build-env record, and the
`attestations: write` permission needed by attest-build-provenance.

Changes
-------

1. Top-level permissions: add `attestations: write` alongside the
   existing `contents: write` + `id-token: write`. Required by
   actions/attest-build-provenance@v2.

2. Asset staging directory: rename `release/` → `release-assets/`
   to match the synth/spar/sigil/witness shared name. Pure cosmetic
   (file paths are scoped to this job), but it makes the verification
   one-liner in release notes copy-pasteable across repos.

3. New step "Install cargo-cyclonedx" + "Generate toolchain SBOM
   (CycloneDX)" — inserted BEFORE the SHA256SUMS step so the SBOM's
   digest enters the manifest and the cosign signature transitively
   covers it. Emits `release-assets/rivet-<bare-version>.cdx.json`
   (no `v` prefix on the version per the brief).

4. New step "Generate SLSA build provenance"
   (actions/attest-build-provenance@v2) — runs AFTER the sums file
   exists, attests every `release-assets/*.tar.gz` to GitHub's
   attestation store. Consumers verify with:
       gh attestation verify rivet-vX.Y.Z-<triple>.tar.gz \\
         --repo pulseengine/rivet

5. New step "Capture build environment" — emits
   `release-assets/build-env.txt` with rustc, cargo, cosign, and
   runner versions. Prerequisite for REQ-094 (`rivet release-verify`).

Final release-asset shape
-------------------------

    rivet-vX.Y.Z-<triple>.{tar.gz|zip}
    rivet-X.Y.Z.cdx.json
    SHA256SUMS.txt
    SHA256SUMS.txt.sig
    SHA256SUMS.txt.pem
    SHA256SUMS.txt.cosign.bundle
    build-env.txt
    (plus VSIX + compliance bundle from existing jobs)

Verification one-liners (paste into release notes)
--------------------------------------------------

    cosign verify-blob \\
      --certificate-identity-regexp \\
        'https://github.com/pulseengine/rivet/.github/workflows/release.yml@.*' \\
      --certificate-oidc-issuer \\
        'https://token.actions.githubusercontent.com' \\
      --bundle SHA256SUMS.txt.cosign.bundle SHA256SUMS.txt

    gh attestation verify rivet-vX.Y.Z-<triple>.tar.gz \\
      --repo pulseengine/rivet

Refs: REQ-068, REQ-094

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@avrabe avrabe force-pushed the chore/release-pipeline-standardize-to-synth branch from ae4e2af to 93a4887 Compare May 25, 2026 11:21
@avrabe avrabe merged commit fce5dff into main May 25, 2026
22 of 38 checks passed
@avrabe avrabe deleted the chore/release-pipeline-standardize-to-synth branch May 25, 2026 13:25
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