Skip to content

Commit e85ad41

Browse files
authored
feat(release): single nix-backed build per target (#18)
* feat(release): single nix-backed build per target Follow-up to #17: every target now builds once. The build-twice bit-identical gate is replaced by nix for the linux legs - hermetic builds from the committed flake.lock, reproducible locally by anyone with nix build, a stronger guarantee than re-running the build in CI ever was. Mac and windows legs keep the pinned rustup toolchain, single build. Linux archives bundle the dynamic loader + libraries behind an abgen entry script, so they run on any distro (glibc, musl, nixos) with zero host requirements - the old glibc>=2.35 floor is gone. Layout is unchanged for consumers: ./abgen is still the entry point next to template/ and shader/. Flake: version and ABGEN_GIT_COMMIT now come from crate/Cargo.toml and self.rev instead of being hardcoded; flake.lock bumped (rustc 1.96.1). PROVENANCE.md and the DEVELOPMENT.md runbook updated to match. * feat(release): magic nix cache on the linux legs DetSys nix-installer + magic-nix-cache (sha-pinned) replace the official installer script: store paths land in the repo's Actions cache, so re-runs and warm branches skip the toolchain closure and vendored-deps fetch. * refactor(flake): drop flake-utils for plain genAttrs Same outputs for the same four systems, one fewer external input. * feat(release): warm cargo caches on the mac legs actions/cache (first-party, sha-pinned) on registry+git+target for the two darwin legs, keyed by target, toolchain, and Cargo.lock. The windows legs stay uncached to keep the repo inside the 10GB Actions-cache LRU budget. * feat(release): drop magic nix cache, keep the mac cargo caches Measured across three dispatch runs: the nix legs were flat with and without it (777s/771s vs 778s cold - the whole build is one derivation, so a store cache replays nothing), while its ~9GB of nar entries filled the repo's 10GB Actions-cache budget and would evict the two 450MB mac cargo caches that actually cut those legs 2-4x (285s/150s warm vs 1030s/272s cold). DetSys nix-installer stays. * feat(flake): crane dep-split so releases recompile only the abgen crate Dependency crates now build in their own derivation keyed on the manifests/lockfile (verified drv-stable across source edits), which is what makes the magic nix cache pay: warm linux legs replay the deps derivation and compile just the abgen crate (132s local vs 13min full). crane is pinned to the v0.23.4 release tag + narHash; audited 2026-07-22: pure-nix lib (~3k lines, no binaries), network access only through fixed-output fetches pinned by our own Cargo.lock checksums. Magic nix cache returns to the linux legs alongside it. * feat(release): extend the cargo cache to the windows legs With linux and mac warm, the uncached windows cross-builds become the critical path (~450s). Same target-scoped cache; fits the budget now that the useless store-nar entries are gone. * fix(release): carry the crane deps closure via actions/cache + nix copy magic-nix-cache never substituted in practice (nix marked its local daemon 'disabled' after failed fetches; warm linux legs stayed at cold timings). Replace it with the primitive already proven on the rustup legs: a first-party actions/cache entry holding a nix file store of the deps closure, keyed on the manifests and pins, imported/exported with nix copy. * style: drop comments from the release workflow and flake * chore(release): latest pins across the board rust 1.97.1, actions/cache v6.1.0, llvm-mingw 20260721, ubuntu-24.04 + macos-15 runners (runner glibc no longer reaches any artifact: linux ships the nix closure, windows is mingw-static). nix-deps cache key gains rust-toolchain.toml so toolchain bumps rotate it. * fix(release): restore the nix-deps cache after checkout hashFiles evaluates against the workspace when the step runs; before the checkout it matched nothing and produced a degenerate constant key. * chore: release 0.11.3
1 parent f638969 commit e85ad41

12 files changed

Lines changed: 253 additions & 209 deletions

File tree

.github/release-notes.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Reproducible builds: the linux and macOS binaries were each built from a clean tree in two independent CI jobs (separate runners) and required bit-identical before publishing; the windows binary is built once (mingw's linker has a residual link-order non-determinism). Toolchain: rust 1.97.0 (pinned), `--locked` against the committed Cargo.lock, `SOURCE_DATE_EPOCH` from the tagged commit. Each archive is self-contained: the `abgen` server binary plus the `template/` and `shader/` assets it needs, resolved from the binary's own directory (`ABGEN_ROOT`/`ABGEN_SHADER_BUNDLE` override). Runtime requirements - Linux (x64 and arm64): glibc >= 2.35 and libstdc++6/libgcc_s (present on any mainstream distro). Windows x64: none, the mingw runtime DLLs ship in the archive next to the exe. Windows arm64: none, a single static exe (llvm-mingw/libc++). macOS (Apple Silicon and Intel): system libraries only. Optional everywhere: libturbojpeg (bit-parity JPEG decode with the upstream ab-cdn pipeline; without it JPEG textures decode through a pure-Rust fallback - valid output, not guaranteed byte-identical to upstream bundles). The same binaries publish to npm as `@dcl/abgen` (per-platform packages as optionalDependencies; `npx @dcl/abgen` runs the server).
1+
Single-build releases with pinned provenance. Linux (x64 and arm64): built by Nix from the committed flake.lock — hermetic, locally reproducible with `nix build`; the archive bundles the dynamic loader and libraries behind the `abgen` entry script, so it runs on any Linux (glibc, musl, NixOS) with no host requirements. Windows and macOS: rust 1.97.0 (pinned), `--locked` against the committed Cargo.lock, `SOURCE_DATE_EPOCH` from the tagged commit; windows-x64 ships the mingw runtime DLLs next to the exe, windows-arm64 is a single static exe (llvm-mingw/libc++), macOS needs system libraries only. Each archive is self-contained: the `abgen` server entry point plus the `template/` and `shader/` assets it needs, resolved from its own directory (`ABGEN_ROOT`/`ABGEN_SHADER_BUNDLE` override). Optional everywhere: libturbojpeg (bit-parity JPEG decode with the upstream ab-cdn pipeline; without it JPEG textures decode through a pure-Rust fallback - valid output, not guaranteed byte-identical to upstream bundles). The same binaries publish to npm as `@dcl/abgen` (per-platform packages as optionalDependencies; `npx @dcl/abgen` runs the server).

.github/workflows/release.yml

Lines changed: 86 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -14,53 +14,51 @@ env:
1414

1515
jobs:
1616
build:
17-
name: ${{ matrix.target }} (build ${{ matrix.attempt }})
17+
name: ${{ matrix.target }}
1818
runs-on: ${{ matrix.runner }}
1919
strategy:
2020
fail-fast: false
2121
matrix:
22-
attempt: [1, 2]
23-
target:
24-
- x86_64-unknown-linux-gnu
25-
- aarch64-unknown-linux-gnu
26-
- x86_64-pc-windows-gnu
27-
- aarch64-pc-windows-gnullvm
28-
- aarch64-apple-darwin
29-
- x86_64-apple-darwin
3022
include:
3123
- target: x86_64-unknown-linux-gnu
32-
runner: ubuntu-22.04
33-
bin: abgen
24+
runner: ubuntu-24.04
25+
builder: nix
3426
- target: aarch64-unknown-linux-gnu
35-
runner: ubuntu-22.04-arm
36-
bin: abgen
27+
runner: ubuntu-24.04-arm
28+
builder: nix
3729
- target: x86_64-pc-windows-gnu
38-
runner: ubuntu-22.04
30+
runner: ubuntu-24.04
31+
builder: rustup
3932
bin: abgen.exe
40-
# rquickjs-sys has no pregenerated bindings for this triple: bindgen
41-
# runs against the llvm-mingw sysroot (BINDGEN_EXTRA_CLANG_ARGS below)
4233
- target: aarch64-pc-windows-gnullvm
43-
runner: ubuntu-22.04
34+
runner: ubuntu-24.04
35+
builder: rustup
4436
bin: abgen.exe
4537
cargo_flags: --features rquickjs/bindgen
4638
- target: aarch64-apple-darwin
47-
runner: macos-14
39+
runner: macos-15
40+
builder: rustup
4841
bin: abgen
4942
- target: x86_64-apple-darwin
5043
runner: macos-15-intel
44+
builder: rustup
5145
bin: abgen
52-
exclude:
53-
# mingw ld link-order non-determinism: no bit-identical gate, built once
54-
- target: x86_64-pc-windows-gnu
55-
attempt: 2
5646

5747
steps:
48+
- if: matrix.builder == 'nix'
49+
uses: DeterminateSystems/nix-installer-action@ef8a148080ab6020fd15196c2084a2eea5ff2d25 # v22
50+
5851
- name: setup (checkout + toolchains)
5952
run: |
6053
git init -q .
6154
git remote add origin "https://github.com/$GITHUB_REPOSITORY"
6255
git fetch -q --depth 1 origin "$GITHUB_SHA"
6356
git checkout -q FETCH_HEAD
57+
echo "SOURCE_DATE_EPOCH=$(git log -1 --format=%ct)" >> "$GITHUB_ENV"
58+
59+
if [ "${{ matrix.builder }}" = "nix" ]; then
60+
exit 0
61+
fi
6462
6563
(
6664
if ! command -v rustup >/dev/null 2>&1; then
@@ -69,8 +67,8 @@ jobs:
6967
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
7068
export PATH="$HOME/.cargo/bin:$PATH"
7169
fi
72-
rustup toolchain install 1.97.0 --profile minimal --no-self-update
73-
rustup default 1.97.0
70+
rustup toolchain install 1.97.1 --profile minimal --no-self-update
71+
rustup default 1.97.1
7472
rustup target add ${{ matrix.target }}
7573
) > /tmp/rustup.log 2>&1 &
7674
rustup_pid=$!
@@ -95,8 +93,8 @@ jobs:
9593
fi
9694
9795
if [ "${{ matrix.target }}" = "aarch64-pc-windows-gnullvm" ]; then
98-
curl -fsSL -o llvm-mingw.tar.xz https://github.com/mstorsjo/llvm-mingw/releases/download/20260616/llvm-mingw-20260616-ucrt-ubuntu-22.04-x86_64.tar.xz
99-
echo "534b92e067b22a6b4441f48ae9240a3341b17825d04d577eab0cf85c44b4deda llvm-mingw.tar.xz" | sha256sum -c
96+
curl -fsSL -o llvm-mingw.tar.xz https://github.com/mstorsjo/llvm-mingw/releases/download/20260721/llvm-mingw-20260721-ucrt-ubuntu-22.04-x86_64.tar.xz
97+
echo "4a9fd7ac5bda8a0a514f33c4ad7864a76e58c56ed958be18221c5ca0ac0a2b10 llvm-mingw.tar.xz" | sha256sum -c
10098
sudo tar -xJf llvm-mingw.tar.xz -C /opt && rm llvm-mingw.tar.xz
10199
cat > /tmp/aarch64-mingw-toolchain.cmake <<'EOF'
102100
set(CMAKE_SYSTEM_NAME Windows)
@@ -105,17 +103,16 @@ jobs:
105103
set(CMAKE_CXX_COMPILER aarch64-w64-mingw32-clang++)
106104
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
107105
EOF
108-
# without the import libs, lld resolves libc++/libunwind statically
109-
sudo rm /opt/llvm-mingw-20260616-ucrt-ubuntu-22.04-x86_64/aarch64-w64-mingw32/lib/libc++.dll.a \
110-
/opt/llvm-mingw-20260616-ucrt-ubuntu-22.04-x86_64/aarch64-w64-mingw32/lib/libunwind.dll.a
111-
echo "/opt/llvm-mingw-20260616-ucrt-ubuntu-22.04-x86_64/bin" >> "$GITHUB_PATH"
106+
sudo rm /opt/llvm-mingw-20260721-ucrt-ubuntu-22.04-x86_64/aarch64-w64-mingw32/lib/libc++.dll.a \
107+
/opt/llvm-mingw-20260721-ucrt-ubuntu-22.04-x86_64/aarch64-w64-mingw32/lib/libunwind.dll.a
108+
echo "/opt/llvm-mingw-20260721-ucrt-ubuntu-22.04-x86_64/bin" >> "$GITHUB_PATH"
112109
{
113110
echo "CMAKE_TOOLCHAIN_FILE=/tmp/aarch64-mingw-toolchain.cmake"
114111
echo "CARGO_TARGET_AARCH64_PC_WINDOWS_GNULLVM_LINKER=aarch64-w64-mingw32-clang"
115112
echo "CC_aarch64_pc_windows_gnullvm=aarch64-w64-mingw32-clang"
116113
echo "CXX_aarch64_pc_windows_gnullvm=aarch64-w64-mingw32-clang++"
117114
echo "AR_aarch64_pc_windows_gnullvm=aarch64-w64-mingw32-ar"
118-
echo "BINDGEN_EXTRA_CLANG_ARGS=--target=aarch64-w64-mingw32 --sysroot=/opt/llvm-mingw-20260616-ucrt-ubuntu-22.04-x86_64/aarch64-w64-mingw32"
115+
echo "BINDGEN_EXTRA_CLANG_ARGS=--target=aarch64-w64-mingw32 --sysroot=/opt/llvm-mingw-20260721-ucrt-ubuntu-22.04-x86_64/aarch64-w64-mingw32"
119116
} >> "$GITHUB_ENV"
120117
fi
121118
@@ -130,36 +127,82 @@ jobs:
130127
rustflags="$rustflags -C target-feature=+crt-static -C link-arg=-Wl,--no-insert-timestamp"
131128
fi
132129
{
133-
echo "SOURCE_DATE_EPOCH=$(git log -1 --format=%ct)"
134130
echo "RUSTFLAGS=$rustflags"
135131
echo "CFLAGS=-ffile-prefix-map=$PWD=/build"
136132
echo "CXXFLAGS=-ffile-prefix-map=$PWD=/build"
137133
} >> "$GITHUB_ENV"
138134
135+
- if: matrix.builder == 'nix'
136+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
137+
with:
138+
path: /tmp/nix-deps-cache
139+
key: nix-deps-${{ matrix.target }}-${{ hashFiles('Cargo.lock', 'Cargo.toml', 'crate/Cargo.toml', 'flake.lock', 'flake.nix', 'rust-toolchain.toml') }}
140+
141+
- if: matrix.builder == 'rustup'
142+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
143+
with:
144+
path: |
145+
~/.cargo/registry
146+
~/.cargo/git
147+
target
148+
key: cargo-${{ matrix.target }}-1.97.1-${{ hashFiles('Cargo.lock') }}
149+
restore-keys: cargo-${{ matrix.target }}-1.97.1-
150+
139151
- name: build
140-
run: cargo build --release --locked --target ${{ matrix.target }} ${{ matrix.cargo_flags }} --bin abgen
152+
run: |
153+
if [ "${{ matrix.builder }}" = "nix" ]; then
154+
flags="--extra-experimental-features nix-command --extra-experimental-features flakes"
155+
if [ -d /tmp/nix-deps-cache ]; then
156+
nix copy $flags --from file:///tmp/nix-deps-cache --all --no-check-sigs || true
157+
fi
158+
nix build .#default --print-build-logs $flags
159+
deps=$(nix build .#default.cargoArtifacts --print-out-paths --no-link $flags)
160+
nix copy $flags --to file:///tmp/nix-deps-cache "$deps"
161+
else
162+
cargo build --release --locked --target ${{ matrix.target }} ${{ matrix.cargo_flags }} --bin abgen
163+
fi
141164
142165
- name: package, smoke test, publish
143166
env:
144167
GH_TOKEN: ${{ github.token }}
145168
run: |
146169
dist="abgen-${GITHUB_REF_NAME:-dev}-${{ matrix.target }}"
147170
mkdir -p "$dist/shader"
148-
cp "target/${{ matrix.target }}/release/${{ matrix.bin }}" "$dist/"
149171
cp -R template "$dist/template"
150172
cp crate/shader/scene_ignore_windows "$dist/shader/"
151173
cp LICENSE README.md "$dist/"
152-
if [ "${{ matrix.target }}" = "x86_64-pc-windows-gnu" ]; then
153-
for dll in libstdc++-6.dll libgcc_s_seh-1.dll libwinpthread-1.dll; do
154-
cp "$(x86_64-w64-mingw32-g++-posix -print-file-name=$dll)" "$dist/"
174+
175+
if [ "${{ matrix.builder }}" = "nix" ]; then
176+
mkdir -p "$dist/bin" "$dist/lib"
177+
install -m755 result/bin/abgen "$dist/bin/abgen.bin"
178+
for lib in $(ldd result/bin/abgen | awk '$3 ~ /^\// {print $3}'); do
179+
install -m644 "$lib" "$dist/lib/"
155180
done
181+
interp=$(readelf -l result/bin/abgen | sed -n 's/.*interpreter: \(.*\)]/\1/p')
182+
install -m755 "$interp" "$dist/lib/ld.so"
183+
cat > "$dist/abgen" <<'EOF'
184+
#!/bin/sh
185+
here="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)"
186+
export ABGEN_ROOT="${ABGEN_ROOT:-$here}"
187+
export ABGEN_SHADER_BUNDLE="${ABGEN_SHADER_BUNDLE:-$here/shader/scene_ignore_windows}"
188+
exec "$here/lib/ld.so" --library-path "$here/lib" "$here/bin/abgen.bin" "$@"
189+
EOF
190+
chmod 755 "$dist/abgen"
191+
else
192+
cp "target/${{ matrix.target }}/release/${{ matrix.bin }}" "$dist/"
193+
if [ "${{ matrix.target }}" = "x86_64-pc-windows-gnu" ]; then
194+
for dll in libstdc++-6.dll libgcc_s_seh-1.dll libwinpthread-1.dll; do
195+
cp "$(x86_64-w64-mingw32-g++-posix -print-file-name=$dll)" "$dist/"
196+
done
197+
fi
156198
fi
199+
157200
TAR=tar; command -v gtar >/dev/null && TAR=gtar
158201
"$TAR" --sort=name --owner=0 --group=0 --numeric-owner \
159202
--mtime="@${SOURCE_DATE_EPOCH}" -czf "$dist.tar.gz" "$dist"
160203
shasum -a 256 "$dist.tar.gz" > "$dist.tar.gz.sha256"
161204
162-
if [ "${{ matrix.attempt }}" = "1" ] && ! echo "${{ matrix.target }}" | grep -q windows; then
205+
if ! echo "${{ matrix.target }}" | grep -q windows; then
163206
rm -rf /tmp/smoke && mkdir /tmp/smoke
164207
tar -xzf "$dist.tar.gz" -C /tmp/smoke
165208
(
@@ -181,18 +224,12 @@ jobs:
181224
|| gh release create "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" \
182225
--title "abgen $GITHUB_REF_NAME" --notes-file .github/release-notes.md \
183226
|| gh release view "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" >/dev/null
184-
if [ "${{ matrix.attempt }}" = "1" ]; then
185-
gh release upload "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --clobber \
186-
"$dist.tar.gz" "$dist.tar.gz.sha256"
187-
else
188-
cp "$dist.tar.gz.sha256" "$dist.tar.gz.sha256-2"
189-
gh release upload "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --clobber \
190-
"$dist.tar.gz.sha256-2"
191-
fi
227+
gh release upload "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --clobber \
228+
"$dist.tar.gz" "$dist.tar.gz.sha256"
192229
193230
publish:
194231
needs: build
195-
runs-on: ubuntu-22.04
232+
runs-on: ubuntu-24.04
196233
if: startsWith(github.ref, 'refs/tags/v')
197234
permissions:
198235
contents: write
@@ -209,18 +246,14 @@ jobs:
209246
git checkout -q FETCH_HEAD
210247
211248
gh release download "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" \
212-
--pattern 'abgen-*.tar.gz' --pattern 'abgen-*.tar.gz.sha256*' -D dist
249+
--pattern 'abgen-*.tar.gz' --pattern 'abgen-*.tar.gz.sha256' -D dist
213250
cd dist
214251
test "$(ls ./*.tar.gz | wc -l)" -eq 6
215-
test "$(ls ./*.sha256-2 | wc -l)" -eq 5
216-
for f2 in ./*.sha256-2; do
217-
diff "$f2" "${f2%-2}" || { echo "reproducibility mismatch: $f2"; exit 1; }
218-
done
219252
sha256sum -c ./*.sha256
220253
cat ./*.sha256 > SHA256SUMS.txt
221254
cat SHA256SUMS.txt
222255
gh release upload "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --clobber SHA256SUMS.txt
223-
for f in ./*.sha256 ./*.sha256-2; do
256+
for f in ./*.sha256; do
224257
gh release delete-asset "$GITHUB_REF_NAME" "$(basename "$f")" --repo "$GITHUB_REPOSITORY" --yes
225258
done
226259
cd ..

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

DEVELOPMENT.md

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -184,22 +184,30 @@ the lib sets `#[global_allocator] mimalloc`; any downstream embedding the lib in
184184
## Releasing
185185

186186
The release pipeline (`.github/workflows/release.yml`) is plain shell on GitHub-hosted
187-
runners - no third-party or marketplace actions. Beyond the repo it trusts only rustup.rs
188-
(version-pinned toolchain) and the sha256-pinned llvm-mingw tarball. Every release
189-
operation is idempotent, so job re-runs converge on the full asset set.
187+
runners; the only non-shell steps are Determinate Systems' sha-pinned nix installer on
188+
the linux legs and first-party actions/cache everywhere (rustup legs: cargo registry +
189+
target dirs; nix legs: a nix file store carrying the crane deps-derivation closure,
190+
moved with nix copy). Measured rationale: warm cargo caches cut the rustup legs 2-4x,
191+
and the nix cache only pays because the flake splits dependency compilation into its
192+
own crane derivation (keyed on manifests/lockfile, stable across source edits) -
193+
without the split, a store cache replayed nothing. Every target builds **once**: Linux via
194+
`nix build` from the committed flake.lock (hermetic; reproduce locally with `nix build` -
195+
the archives bundle the loader + libs behind the `abgen` entry script and run on any
196+
Linux, including NixOS); Windows and macOS via the pinned rustup toolchain with
197+
`SOURCE_DATE_EPOCH` from the tagged commit. Every release operation is idempotent, so job
198+
re-runs converge on the full asset set.
190199

191200
1. Land a `chore: release X.Y.Z` PR bumping the crate version (Cargo.toml + Cargo.lock).
192201
2. Tag the merge commit and push the tag:
193202
`git tag vX.Y.Z <merge-sha> && git push origin vX.Y.Z`
194203
Don't pre-create the release in the web UI: the pipeline adopts an existing release
195204
(that is how v0.11.0 first shipped assetless), but only a CI-created one carries the
196205
notes from `.github/release-notes.md`.
197-
3. What runs: every target builds twice in parallel jobs on separate runners
198-
(windows-x64 once - mingw ld is non-deterministic); each leg packages, smoke-tests
199-
(`--version` + `/readyz`), and uploads its archive with `--clobber`. The `publish` job
200-
re-downloads the published assets, requires bit-identical hashes from both build
201-
attempts, verifies contents, uploads the aggregated `SHA256SUMS.txt`, and publishes
202-
npm (skipped explicitly when `NPM_TOKEN` is unset - why `@dcl/abgen` is not on npm).
206+
3. What runs: each leg builds, packages, smoke-tests (`--version` + `/readyz`; windows
207+
legs are cross-built and not smoke-run), and uploads its archive with `--clobber`.
208+
The `publish` job re-downloads the published assets, verifies them against the
209+
build-time hashes, uploads the aggregated `SHA256SUMS.txt`, and publishes npm
210+
(skipped explicitly when `NPM_TOKEN` is unset - why `@dcl/abgen` is not on npm).
203211
4. Verify: exactly 7 assets on the release page (6 archives + `SHA256SUMS.txt`).
204212
5. Failed leg: re-run failed jobs from the Actions UI; everything converges.
205213

PROVENANCE.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@ from its code.
1212
## Reproducible releases
1313

1414
Each release is **versioned and tagged**; the release pipeline
15-
([`.github/workflows/release.yml`](.github/workflows/release.yml)) builds every Linux and macOS binary
16-
**twice from a clean tree and requires the two bit-identical** before publishing (Windows x64 builds
17-
once — mingw's linker has a residual link-order non-determinism). Builds are `--locked` against the
18-
committed `Cargo.lock`, pinned to a single Rust toolchain, with `SOURCE_DATE_EPOCH` taken from the
19-
tagged commit, so a given tag reproduces the same artifacts.
15+
([`.github/workflows/release.yml`](.github/workflows/release.yml)) builds every target **once**.
16+
The Linux binaries are built by **Nix from the committed `flake.lock`** — a hermetic, pinned
17+
derivation anyone can reproduce locally with `nix build`, which is a stronger guarantee than
18+
re-running the same build in CI; the archives bundle the loader and libraries behind the `abgen`
19+
entry script, so they run on any Linux with no host requirements. The Windows and macOS binaries
20+
are built with a pinned Rust toolchain, `--locked` against the committed `Cargo.lock`, and
21+
`SOURCE_DATE_EPOCH` from the tagged commit.
2022

2123
## Vendored shader bundles
2224

crate/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "abgen"
3-
version = "0.11.2"
3+
version = "0.11.3"
44
edition = "2021"
55
description = "Decentraland asset-bundle converter + ab-cdn-compatible JIT server — clean-room reimplementation of asset-bundle-converter."
66
license = "AGPL-3.0-or-later"

crate/dcl-contents/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "dcl-contents"
3-
version = "0.11.2"
3+
version = "0.11.3"
44
edition = "2021"
55
description = "Content-DB active-entity component, asset-bundle status DTOs, manifest-status reader, and the unsigned registry HTTP surface (profiles, entity status, world manifests)."
66

crate/kernel-ptx/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "abgen-gpu-kernel-ptx"
3-
version = "0.11.2"
3+
version = "0.11.3"
44
edition = "2021"
55
license = "AGPL-3.0-or-later"
66
description = "rustc-native nvptx64 PTX kernels for abgen-gpu-core (nightly + -Z build-std=core; artifact consumed by host via ABGEN_GPU_PTX)"

crate/wasm-poc/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "abgen-wasm-poc"
3-
version = "0.11.2"
3+
version = "0.11.3"
44
edition = "2021"
55
publish = false
66

0 commit comments

Comments
 (0)