ci: source-only release workflow on v* tag - #80
Merged
Conversation
Add .github/workflows/release.yml: on a v* tag it reuses ci.yml as the gate (workflow_call, the full Definition of Done), then publishes a source-only GitHub Release whose body is the tag's CHANGELOG section plus a static testnet/source-only warning. GitHub attaches the source tarballs; no binaries are built. scripts/release-check.sh (wrapped by `just release-check`) is the single source of truth that CI and the local pre-flight share: it validates the tag shape, asserts every crate version matches the tag, and extracts the CHANGELOG section, failing loudly with the fix otherwise. Move the v* tag trigger out of ci.yml so one workflow owns the tag (no double build), and rewrite docs/RELEASING.md to the automated flow. Binaries stay deferred on purpose: for a wallet, an unsigned, un-notarized download trains users to bypass Gatekeeper, and a checksum in the same Release proves download-integrity, not authenticity. Signed and notarized binaries (Apple cert) are the real later unlock, tracked separately.
3 tasks
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.
Summary
Adds a source-only release pipeline: a
v*tag now runs.github/workflows/release.yml, which reusesci.ymlas the gate viaworkflow_call(the full Definition of Done) and then publishes a GitHub Release whose body is the tag'sCHANGELOG.mdsection plus a static testnet/source-only warning (GitHub attaches the source tarballs; no binaries are built). A newscripts/release-check.sh— wrapped byjust release-check <tag>— is the single source of truth that CI and the local pre-flight share: it validates the tag shape, asserts every crate version matches the tag, and extracts the CHANGELOG section, failing loudly otherwise. Thev*trigger moves out ofci.ymlso one workflow owns the tag (no double build), anddocs/RELEASING.mdis rewritten to the automated flow. Binaries stay deferred on purpose: for a wallet, an unsigned/un-notarized download trains users to bypass Gatekeeper and a same-release checksum proves download-integrity rather than authenticity, so signed + notarized binaries (Apple cert) are the real later unlock.Linked issue
No issue. Motivation: tagging
v*previously only ran CI and produced nothing publishable; this gives each tag a gated, verifiable GitHub Release without the trust hole of shipping unsigned wallet binaries. The approach was chosen via a dual-model (/autoplan) review.Definition of Done
This PR changes only CI workflows, a shell script, the Justfile, and docs — no Rust, no
Cargo.toml/Cargo.lockchanges (git diff origin/main --name-onlyhas zero.rs/Cargo.*entries). So the Rust gates are unaffected by this change set, and the PR's own CI (ci.ymlonpull_request, which this PR also wires as the release gate) runs them in full.cargo fmt --all --checkis clean — verified locally (output below)just check— not run locally (no Rust delta); runs in this PR's CIcargo test --workspace— not run locally (no Rust delta); runs in this PR's CICargo.toml/Cargo.lockDESIGN.mdN/A (CI/tooling/docs only)Zeroizing/ never logged — N/A; no secret-handling code touched (the script readsCHANGELOG.md+cargo metadataonly)Evidence (paste command output here)
Notes for reviewers
release.yml's gate isuses: ./.github/workflows/ci.yml(workflow_call), so the release gate can never drift from CI.ci.ymllost itstags: ["v*"]push trigger and gainedworkflow_call.release.yml(actions/checkout,softprops/action-gh-release) since the release workflow is a high-value supply-chain target;cargo-denydoes not cover Actions.## [X.Y.Z]CHANGELOG section, never[Unreleased]—RELEASING.mdnow documents promoting[Unreleased]→[X.Y.Z]before tagging, andjust release-checkenforces it.gh workflow run release.yml --ref <branch> -f tag=v0.0.1-alpharuns the full gate and prints the rendered body; the publish step is gated ongithub.event_name == 'push'..appescape hatch stays documented inRELEASING.md.