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.
This commit is contained in:
2026-11-06 20:23:22 +05:30
parent 6404a5efcd
commit e8e26ae6dc
4 changed files with 10 additions and 6 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ name: xbps-release
# and the committed Void template must already name that version;
# 2. the XBPS_SIGNING_KEY secret must be non-empty and RSA 4096, and its public
# half must be packaging/void/repository-key.plist;
# 3. the canonical reproducible sdist is built from the tag (Python 3.11,
# 3. the canonical sdist is built from the tag (Python 3.11,
# uv 0.12/0.13, scripts/build_reproducible_wheel.py);
# 4. every template builds in the pinned Void glibc image with podman (no
# signing key in that phase), then the repository is signed in a second
+1 -1
View File
@@ -558,7 +558,7 @@ approved each time: the workflow has no schedule and no manual trigger.
3. **Runner check.** podman, python3.11, uv 0.12/0.13, openssl, git and curl
must be on the runner, or the job names what is missing and stops.
4. **Release.** `build-release.sh release` builds the canonical sdist from the
tag (reproducibly), builds every template in the pinned Void glibc container
tag, builds every template in the pinned Void glibc container
without the key, signs the repository in a second container with no network,
and installs `voculinux` from that repository in a clean image without the key.
A local dry run is `just void-release vX.Y.Z` with `XBPS_SIGNING_KEY_FILE`
+5 -2
View File
@@ -151,7 +151,7 @@ throwaway RSA 4096 key generated in a temporary directory. The gate needs no
host Void install and nothing is published. Stages, in order, each fails the run:
1. the tag gate (`check-tag`) and the committed template's version and `_tag`;
2. the reproducible sdist, built from the working tree;
2. the canonical sdist, built from the working tree;
3. `build`: every template in `PKGS` order (`smoke.sh` owns the list), linted
with `xlint`, built with `xbps-src`, the sdist resolved by `xbps-src show`;
4. `sign`: the packages indexed and signed, with no network;
@@ -177,7 +177,10 @@ Fail-closed, in this order, before any container starts:
name that version and tag;
- the key must be non-empty, valid, RSA 4096, and its public half must equal
`repository-key.plist` byte for byte (a different key never publishes);
- the sdist must build, reproducibly, with Python 3.11 and uv 0.12/0.13.
- the canonical sdist must build with Python 3.11 and uv 0.12/0.13. Only its
wheel is compared byte for byte: a second build of the same tag has identical
contents, but the tar and gzip timestamps differ, so the release records the
digest of the sdist it publishes, not of a rebuild.
Then three containers, each with only what it needs:
+3 -2
View File
@@ -12,7 +12,7 @@
# src/vocalinux/version.py, and the committed Void template must already
# name that version and tag. Exits 1 otherwise.
# build-release.sh release TAG --key-file FILE --out-dir DIR
# the whole release: gate, reproducible sdist, signed repository,
# the whole release: gate, canonical sdist, signed repository,
# completeness check. Writes DIR/sdist and DIR/xbps. Publishes nothing;
# the workflow publishes DIR. DIR must be absent or empty.
# build-release.sh smoke
@@ -155,7 +155,8 @@ check_key() {
echo "signing key: RSA 4096, fingerprint $FINGERPRINT ($MODE)"
}
# build_sdist: the canonical reproducible sdist, copied under its xbps name.
# build_sdist: the canonical sdist (the reproducible build path; only its wheel is
# compared byte for byte), copied under its xbps name.
build_sdist() {
command -v "$PYTHON" >/dev/null 2>&1 ||
fail "$PYTHON not found: the sdist is built with Python 3.11 (set PYTHON)"