fix(release): link the three binaries one at a time in binaries.yml - #15
Merged
Conversation
Every Linux binary job of the last two releases died at the same point, linking oxidelake-runtime after all 444 dependencies had compiled, with "The runner has received a shutdown signal" and exit code 143: v0.1.0 (both musl targets) and v0.1.2 (aarch64 musl). The release profile is fat LTO with a single codegen unit, so each binary's link is a whole-program LLVM pass over Arrow, DataFusion and Ballista, and Cargo schedules the three binaries' links in parallel. Three of those exceed a 16 GB Linux runner with no swap and the VM is torn down. macOS survives by swapping, which is why its jobs took four hours on v0.1.0. `cargo install` from crates.io is unaffected because a crate built outside the workspace does not carry the workspace release profile, which is why the install job passes while the binaries job dies. Build the binaries with one `cargo build --bin` per binary: the dependencies still compile in parallel during the first invocation, and the second and third only link, so one LTO pass is in memory at a time. A re-run against an existing tag now checks the release first and skips targets whose archive is already attached instead of rebuilding them, so `gh workflow run binaries.yml --ref main -f tag=vX.Y.Z` fills in the missing Linux archives for v0.1.2 without repeating the macOS builds. Not done: no automated test covers the workflow shell; the skip step was dry-run locally against v0.1.0, v0.1.2 and a nonexistent tag, and the link change is verified by the dispatched run for v0.1.2. Signed-off-by: Vyncint Ng <vyncint@icloud.com>
This was referenced Sep 7, 2026
Merged
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.
Today
Every Linux binary job of the last two releases died at the same point: linking
oxidelake-runtimeafter all 444 dependencies had compiled, withThe runner has received a shutdown signal, exit 143.v0.1.0 shipped with macOS archives only; its macOS jobs took 4h11m and 4h37m.
Why
The release profile is
lto = "fat",codegen-units = 1. Each binary's link is a whole-program LLVM pass over Arrow, DataFusion and Ballista, and Cargo schedules the three binaries' links in parallel. Three of those exceed a 16 GB Linux runner with no swap, so the VM is torn down. macOS swaps instead, slowly.cargo installfrom crates.io passes because a crate built outside the workspace does not carry the workspace release profile.Change
cargo build --release --locked -p oxidelake-runtime --bin <name> --target <t>per binary. Dependencies compile in parallel during the first call; the other two only link, so one LTO pass is in memory at a time.docs/RELEASING.mdalready documentsgh workflow run binaries.yml --ref main -f tag=vX.Y.Zfor this; it now costs nothing for targets that are done.[Unreleased].Verified
make zizmor(pedantic): no findings. YAML parses.ghagainstv0.1.2/aarch64 musl (absent → build),v0.1.0/aarch64 darwin (present → skip), and a nonexistent tag (build).Not done
binaries.ymlatmainforv0.1.2after this merges; the Linux archives are the evidence.