Add a static Linux release pipeline - #7
Open
Jimbo4350 wants to merge 1 commit into
Open
Conversation
Jimbo4350
force-pushed
the
feat/release-pipeline
branch
5 times, most recently
from
September 10, 2026 16:11
dcbf6eb to
c289aaf
Compare
Jimbo4350
marked this pull request as ready for review
September 10, 2026 18:02
Jimbo4350
force-pushed
the
feat/release-pipeline
branch
2 times, most recently
from
September 10, 2026 19:59
d90a0b5 to
0fa36cd
Compare
Release binaries are built with plain cabal inside IOG's devx static shell (musl GHC 9.8 with static libsodium-vrf, secp256k1, blst), on GitHub Actions for x86_64-linux and aarch64-linux. Versioning, changelog and tagging follow the cardano-api process (herald), without the CHaP upload: PRs carry a changelog fragment in .changes/, the Release workflow batches them into a release PR, and the signed cardano-sieve-A.B.C.D tag push publishes a GitHub Release with the two tarballs, a sha256sums file, and the changelog section. - .github/workflows/build.yml: runs on release tags (and by hand); devx toolchain comes as a prebuilt closure via input-output-hk/actions/devx; cabal store cached on the freeze file; verifies the binary is static and that --version matches the tag; packages bin/ plus completions and LICENSE; release job on tags. - .github/workflows/check-pr-changelog.yml: herald-validate on every PR. - .github/workflows/release.yml: herald-release (workflow_dispatch), opens the release PR; no CHaP instructions. - .herald.yml, .changes/: herald config (PVP kinds as in cardano-api) and the initial-release fragment. - cabal.project.release: imports cabal.project and adds the flags a static musl link needs (text -simdutf, formatting +no-double-conversion, blockio +serialblockio, executable-static), kept out of cabal.project so dev builds don't rebuild the store. - --version flag (optparse-applicative simpleVersioner, Paths_cardano_sieve). - LICENSE (Apache-2.0), CHANGELOG.md header, RELEASING.md, scripts/ci/extract-changelog.sh (herald section format). - README: Installation section for the release tarballs.
Jimbo4350
force-pushed
the
feat/release-pipeline
branch
from
September 10, 2026 20:30
0fa36cd to
a7413a3
Compare
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.
Context
cardano-sieve had no release machinery: no CI, no LICENSE file, no changelog, no
--version, and a build that only linked because of a gitignoredcabal.project.local. This PR adds the cardano-api release process (herald: changelog fragments per PR, a dispatchable Release workflow that opens a release PR, a signedcardano-sieve-A.B.C.Dtag) without the CHaP upload, and a CI build that turns that tag into fully static Linux binaries (x86_64,aarch64) attached to a GitHub Release. Haskell PVP versions; first release will be0.1.0.0; no Docker image yet.What's in it
.github/workflows/build.yml— runs oncardano-sieve-*release tags only (plusworkflow_dispatchfor a dry run that uploads the tarballs as workflow artifacts without releasing). The devx toolchain (ghc98-static-minimal-iog) arrives as a prebuilt closure viainput-output-hk/actions/devx, so nothing is compiled with nix. The cabal store is cached on the freeze file. The verify step asserts the binary is statically linked and, on tags, that--versionmatches the tag. The package step tarsbin/cardano-sieve(stripped) with bash/zsh completions and the licence. On tags, areleasejob publishes the two tarballs, asha256sums.txt, and the matchingCHANGELOG.mdsection as the GitHub Release..github/workflows/check-pr-changelog.yml— herald-validate on every PR (fragment present,pr:matches), as in cardano-api..github/workflows/release.yml— herald-release onworkflow_dispatch: computes the PVP version from fragments (or takes an explicit one), opens therelease/cardano-sieve-A.B.C.DPR with the changelog section and cabal bump, and prints the signing/tagging commands.chap-instructions: false..herald.yml,.changes/— herald config (kinds copied from cardano-api) and the initial-release fragment for this PR.cabal.project.release— importscabal.projectand adds what a static musl link needs (executable-static,text -simdutf,formatting +no-double-conversion,blockio +serialblockio). Kept separate so dev builds don't rebuild the store.--versionvia optparse-applicative'ssimpleVersionerandPaths_cardano_sieve.LICENSE(Apache-2.0, matching the cabal file),CHANGELOG.md(herald header),RELEASING.md,scripts/ci/extract-changelog.sh(herald section format).How to trust this PR
Local dry run of the exact release recipe (via the same
devxentrypoint CI uses) (devx5f05c1e, GHC 9.8.4,cabal.project.release):file→ELF 64-bit LSB executable, x86-64, statically linked; 208 MB unstripped, 124 MB stripped, 30 MB gzipped.cardano-sieve --version→cardano-sieve 0.1.0.0;+RTS --info→rts_thr, GHC 9.8.4.alpine:3.20(no glibc).--serve):/healthreports version and checkpoint,/matches?unspentpages withX-Next-Cursor,/checkpointsanswers, clean SIGTERM shutdown.cabal test— 62/62 pass with the--versionchange.actionlintclean; all actions SHA-pinned.The two static builds ran green on this PR's earlier revisions (before the triggers were narrowed to release tags): x86_64 30 min and aarch64 26 min cold. A release rehearsal on a throwaway tag exercised the release job end to end (assets, checksums, notes) and was then deleted.
herald validate --diff --pr 7and aherald batch --dry-run --version 0.1.0.0were run locally against this branch.Follow-ups (not here)
aarch64runner (dynamic against system libs, ad-hoc codesign).ghcr.io/intersectmbo/cardano-sievereusing the static artifact.CI
First (cold-cache) run on this PR:
x86_64-linux30 min,aarch64-linux26 min. Both binaries verified statically linked,--version=cardano-sieve 0.1.0.0, threaded RTS; tarballs ~30 MB.