ci: switch from SLSA provenance to actions/attest with subject-path#19
Merged
kinyoklion merged 7 commits intomainfrom Apr 1, 2026
Merged
ci: switch from SLSA provenance to actions/attest with subject-path#19kinyoklion merged 7 commits intomainfrom
kinyoklion merged 7 commits intomainfrom
Conversation
Contributor
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
Since actions/attest@v4 stores attestations via GitHub's attestation API (not as release assets), repos that only use attestation don't need draft releases. Release-please can publish the release directly. Changes: - Remove draft:true from release-please-config.json - Remove create-tag job/steps (force-tag-creation handles this) - Remove publish-release job (release is published directly) - Remove publish_release input from manual workflows
force-tag-creation only operates in conjunction with draft releases. Since this repo does not use draft releases (attestation-only, no artifact uploads to the release), force-tag-creation is not needed.
Ensures that checksums generation and attestation are skipped during dry runs, preventing unnecessary attestation of unpublished artifacts.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
There are 2 total unresolved issues (including 1 from previous review).
Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
kinyoklion
approved these changes
Apr 1, 2026
This was referenced Apr 1, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Requirements
N/A — CI-only changes, no application code or tests modified.
Related issues
Supports the org-wide migration to immutable GitHub releases. Once a release is published, it can no longer be modified, which breaks workflows that upload artifacts after release-please publishes the release.
Describe the solution you've provided
Since this repo only uses attestation (no binary/artifact uploads to the release), draft releases are not needed —
actions/attest@v4stores attestations via GitHub's attestation API rather than as release assets. This PR makes the following changes:Replace SLSA with
actions/attest@v4usingsubject-path(both workflows): Removed the separaterelease-provenancejob that usedslsa-framework/slsa-github-generator(which uploaded.intoto.jsonlfiles as release assets viaupload-assets: true) and replaced it with inlineactions/attest@v4steps within the build job. Attestation usessubject-path: 'launchdarkly-openfeature-server-sdk-*.gem'to reference the built gem file directly on disk — no hash computation, base64 encoding, or checksums file needed. Addedattestations: writepermission. Removedgem-hashjob output entirely.Removed hash plumbing from composite action (
.github/actions/publish/action.yml): Removed thegem-hashoutput and "Hash gem for provenance" step. These existed to produce base64-encoded checksums for the old SLSA generator and are no longer needed sincesubject-pathletsactions/attest@v4read files directly from disk.Cleaned up orphaned declarations: Removed the unused
taginput frommanual-publish.yml(was declared but never referenced by any step, with a stale "draft release" description). Removed orphanedrelease-createdandupload-tag-namejob outputs fromrelease-please.yml— their sole consumer was the removedrelease-provenancejob.release-please-config.json: Reformattedextra-filesarray to multi-line — no functional changes.Why no draft releases?
The old SLSA generator uploaded provenance files as release assets via
upload-assets: true, which would fail under immutable releases. The newactions/attest@v4stores attestations in GitHub's attestation API instead — it does not modify the GitHub release. Since this repo has no other artifact uploads, release-please can publish directly without a draft→un-draft flow. Repos that upload actual binaries (e.g. ld-relay, cpp-sdks) still use draft releases.Updates since last revision
taginput frommanual-publish.ymland orphanedrelease-created/upload-tag-nameoutputs fromrelease-please.yml. These were dead declarations left behind when therelease-provenancejob and draft-release machinery were removed. (Addresses Cursor Bugbot findings.)Describe alternatives you've considered
publish-releasejob to un-draft after completion. This was simplified after determining that attestation-only repos don't need draft releases sinceactions/attest@v4doesn't modify the release.subject-checksums: An intermediate revision decoded base64 hashes into a checksums file foractions/attest. This worked but was unnecessarily complex — the gem file is already on disk in the same job, sosubject-pathreferences it directly.Additional context
Key review points:
: Now resolved — thetaginput is declared but unusedtaginput was removed entirely.No: Now resolved — the attest step is gated ondry_runguard on attestation inmanual-publish.yml!inputs.dry_run.subject-path: 'launchdarkly-openfeature-server-sdk-*.gem'matches the gem produced bygem build launchdarkly-openfeature-server-sdk.gemspec. The publish action already uses the same pattern forgem push, so this should be consistent — but worth confirming.releases_createdvsrelease_created: Inrelease-please.yml, the attestation step usessteps.release.outputs.releases_created(plural) while the original job-level output usedrelease_created(singular). Both are valid release-please outputs but confirm they behave identically for this single-package repo.contents: readvscontents: write:manual-publish.ymlhascontents: readwhilerelease-please.ymlhascontents: write. Verifyactions/attest@v4does not requirecontents: write.actions/attest@v4meets compliance requirements: This replacesslsa-framework/slsa-github-generator. Verify the attestation format is acceptable for your supply-chain security needs.Link to Devin session: https://app.devin.ai/sessions/7d5bda4d9dbe4ae0b950b30a50485e60
Requested by: @keelerm84