release: dry-run the publish from a fresh unpack of the packages #232

Merged
natsukium merged 2 commits from release/dry-run-fresh-packages into main 2026-10-23 10:33:28 +09:00
Owner

just publish-dry-run failed on PRs that did not cause it: #228 and #229 failed building felis-client against an Action::RunCommand { background } field that exists only on another branch.

cargo publish --workspace --dry-run builds each crate against the others through a local overlay registry. Cargo unpacks an overlay crate into CARGO_HOME/registry/src/-<hash>/ once per name and version and keeps its build fresh while those stand. Since every felis crate is on crates.io at its current version, any tree that changes a library without a bump verifies against whichever tree packaged that version first on the same CARGO_HOME (the shared CI runner, or parallel local worktrees).

  • tools/release/crates.py publish-dry-run drops the workspace's overlay unpacks, cleans the felis units of <target>/publish-dry-run, and runs the dry run there, so the main target's test build survives. An exclusive lock in CARGO_HOME spans the whole step.
  • just publish-dry-run calls it; pr.yml and release.yml are unchanged.

Verified locally on one CARGO_HOME and target: main, then a branch adding a felis-render-core API, both pass in sequence; the old recipe failed the second.

`just publish-dry-run` failed on PRs that did not cause it: #228 and #229 failed building `felis-client` against an `Action::RunCommand { background }` field that exists only on another branch. `cargo publish --workspace --dry-run` builds each crate against the others through a local overlay registry. Cargo unpacks an overlay crate into `CARGO_HOME/registry/src/-<hash>/` once per name and version and keeps its build fresh while those stand. Since every felis crate is on crates.io at its current version, any tree that changes a library without a bump verifies against whichever tree packaged that version first on the same `CARGO_HOME` (the shared CI runner, or parallel local worktrees). - `tools/release/crates.py publish-dry-run` drops the workspace's overlay unpacks, cleans the felis units of `<target>/publish-dry-run`, and runs the dry run there, so the main target's test build survives. An exclusive lock in `CARGO_HOME` spans the whole step. - `just publish-dry-run` calls it; pr.yml and release.yml are unchanged. Verified locally on one `CARGO_HOME` and target: main, then a branch adding a felis-render-core API, both pass in sequence; the old recipe failed the second.
`cargo publish --workspace --dry-run` builds each crate against the
others through a local overlay registry. Cargo unpacks an overlay crate
into CARGO_HOME once per name and version and treats the build as
fresh while those stand, so once a library is on crates.io, every tree
that changes it without a bump verifies against whichever tree packaged
that version first. On the shared CI runner a PR failed on fields
another branch had added.

The recipe now drops the workspace's overlay unpacks and cleans the
felis units of a target directory kept for the dry run, leaving the
test build in the main one alone.

Assisted-by: Claude Code
release: serialize publish dry runs that share a CARGO_HOME
All checks were successful
fuzz / cargo fuzz nightly long-run (pull_request) Has been skipped
darwin / detect relevant changes (pull_request) Successful in 9s
windows / detect relevant changes (pull_request) Successful in 10s
darwin / darwin docs-only no-op (pull_request) Has been skipped
windows / windows docs-only no-op (pull_request) Has been skipped
bench / instruction-count regression gate (pull_request) Successful in 48s
darwin / build felis (aarch64-darwin) (pull_request) Successful in 1m11s
fuzz / cargo fuzz smoke (per target) (pull_request) Successful in 36s
pr / nix flake check (pull_request) Successful in 28s
windows / cargo nextest (Windows) (pull_request) Successful in 3m1s
windows / frontend smoke (Windows) (pull_request) Successful in 44s
pr / cargo build / clippy / test / deny (pull_request) Successful in 3m35s
pr / wire schema is compatible with the base (pull_request) Successful in 6s
pr / frontend smoke (x86_64-linux) (pull_request) Successful in 31s
windows / cargo clippy (Windows cross) (pull_request) Successful in 17s
9268b5486e
The dry run deletes overlay unpacks outside Cargo's own locks, so two
runs on one CARGO_HOME (parallel worktrees, or two CI jobs) could pull
an unpack out from under the other's build. An exclusive lock file in
CARGO_HOME now spans the deletion, the clean and the publish.

Assisted-by: Claude Code
natsukium deleted branch release/dry-run-fresh-packages 2026-10-23 10:33:28 +09:00
Sign in to join this conversation.
No reviewers
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
felis-terminal/felis!232
No description provided.