fix(void): build the xbps release from the tag, not an attached sdist #37

Merged
xavierk merged 6 commits from fix/release-sdist-build into main 2026-11-06 15:31:47 +00:00
6 Commits
Author SHA1 Message Date
xavierk d4ac89f0a1 fix(void): stage the sdist into the publish set before verifying it
CI / security (pull_request) Successful in 1m22s
CI / lint (pull_request) Successful in 23s
CI / ai-review (pull_request) Successful in 8s
The completeness check requires sdist/<name> in the output directory, but
nothing copied the built sdist there. Copy it from the build work directory
before the signing phase, and pin that order in a test.
2026-11-06 20:34:37 +05:30
xavierk e8e26ae6dc docs(void): state that only the wheel is byte-reproducible
The canonical sdist is built from the tag, but a second build of the same
commit differs in tar and gzip timestamps, so its digest is recorded from the
published asset, not from a rebuild. Correct the comments and docs that said
"reproducible sdist". No behaviour change.
2026-11-06 20:23:22 +05:30
xavierk 6404a5efcd fix(void): read package payloads through zstd in the install smoke
xbps packages are zstd-compressed. The clean install image had no zstd, so
tar could not list the payload and the smoke failed on a package that was
fine. Install zstd in the install phase.
2026-11-06 20:18:28 +05:30
xavierk 22c52a9065 docs(void): describe the tag-built release, the template bump and runner requirements
The sdist is built from the tag by the release path and never attached by
hand. The release PR sets version and _tag in the template; the checksum is
recorded by a pull request after the tag. Runner requirements, the three
container phases and the local dry run are documented.
2026-11-06 20:16:46 +05:30
xavierk 80fb4365bd test(void): guard the tag-built release path offline
- build-release.sh: POSIX-only checks (dash runs the release), a release form
  is exactly X.Y.Z or X.Y.Z-alpha|beta|rcN, and the install smoke refuses a
  package that has no smoke recipe.
- Tests: names and tag gate (exact match, committed template must agree), key
  refusals before any container starts (fake podman records calls), the
  render script pins only the build tree, podman wiring (only the sign phase
  sees the key, and it has no network), the xbps ordering of pre-release
  spellings, the workflow gates, tmpfs key staging, and the publish set
  (sdist, packages, signatures, repodata, client key).
2026-11-06 20:16:46 +05:30
xavierk 05ef78922d fix(void): build the xbps release from the tag, not an attached sdist
The signed Void release depended on a fork sdist attached to the release
before the tag existed, and the app template carried a PENDING checksum that
had to be filled by hand. Every release is now built from its tag alone:

- packaging/void/build-release.sh is the one release path. The Gitea workflow,
  the local dry run and the smoke gate all call it.
- The canonical reproducible sdist is built from the tag with
  scripts/build_reproducible_wheel.py (Python 3.11, pinned uv).
- render-voculinux.sh pins version, _tag and checksum in the container's build
  tree only, and places the sdist where xbps-src resolves its distfile.
  The committed template keeps a zero placeholder until the post-release
  checksum pull request.
- xbps version is __version__ with the hyphen removed (0.19.0-beta becomes
  0.19.0beta), which xbps sorts below the final release.
- Builds run without the key; signing runs with the key mounted read-only and
  no network; the install smoke runs in a clean image without the key.
- The workflow gates the tag and the key before any container starts, writes
  the key to a 0600 tmpfs file, and publishes only the staged set (sdist,
  packages, signatures, repodata, client key).
- smoke.sh runs the same pipeline with a throwaway key.
2026-11-06 20:06:35 +05:30