Releasing¶
nshell ships a binary as well as a source release, so its release checklist is longer than the org default: a green test suite does not prove that the dumped SBCL image starts on a user's machine.
The invariant¶
The :version form in nshell.asd is the single source of truth. flake.nix
reads it, and release.yml refuses to publish a tag that disagrees with it.
Bump the .asd and nothing else.
What CI enforces on a tag push¶
Pushing a v*.*.* tag runs release.yml, which:
- Verifies the tag matches
nshell.asd's:version, and stops before building anything if it does not. - Runs
nix flake check --print-build-logsagainst the tagged tree. - Builds the binary for
x86_64-linuxandaarch64-darwin, confirms each one starts, and packages a tarball plus a SHA-256 checksum. - Extracts the
## [X.Y.Z]section fromCHANGELOG.mdas the release body, failing if that section is missing.
Manual checklist before tagging¶
Verify the public artefacts from a clean checkout:
nix flake check --print-build-logspasses on Linux and macOS.- The non-sandboxed integration suite passes for PTY, subprocess, terminal, signal, and job-control coverage:
nix develop --command sbcl --non-interactive \
--eval '(require :asdf)' \
--eval '(push (truename "./") asdf:*central-registry*)' \
--eval '(asdf:test-system :nshell/test)'
nix build --print-build-logsproduces./result/bin/nshell../result/bin/nshell --versionreports the intended version../result/bin/nshell --helpandman ./man/nshell.1match the documentation and shipped behaviour.- Release tarballs contain
nshell,README.md,LICENSE, and the man page, and each checksum verifies withshasum -a 256 -c. CHANGELOG.mdhas a non-empty section for the release, and[Unreleased]makes no stale claims about already-shipped behaviour.
When triggering the workflow manually rather than by tag push, pass the tag as
the tag input so checkout, artefact naming, and the GitHub Release target all
use it consistently. Do not build a branch ref while publishing a tag release.