Skip to content

feat(release): ship the switch binary to Linux installs - #1063

Merged
norrietaylor merged 1 commit into
mainfrom
fix/stage-linux-gvproxy
Jul 29, 2026
Merged

feat(release): ship the switch binary to Linux installs#1063
norrietaylor merged 1 commit into
mainfrom
fix/stage-linux-gvproxy

Conversation

@norrietaylor

@norrietaylor norrietaylor commented Jul 29, 2026

Copy link
Copy Markdown
Member

Own-IP is dead on every installed Linux host.

The native (DM2) datapath is implemented and proven by the netns job, but minimald resolves a switch binary that no Linux install ships, so the spawn fails on a path that was never populated. CI has never caught it because it fetches gvproxy itself and sets GVPROXY_BIN.

The gap is two table rows

The release already builds pin-verified gvproxy-linux-amd64 and gvproxy-linux-arm64release.yml uploads both (lines 575–586). They were simply never mapped to install components, so stage-release.sh never put them in a manifest and the installer never had anything to place.

  # Linux amd64
  "minimal|linux|amd64|file|bin/min|minimal-linux-amd64"
  "git-remote-min|linux|amd64|symlink|bin/git-remote-min|min"
+ "gvproxy-min|linux|amd64|file|bin/gvproxy-min|gvproxy-linux-amd64"

(and the arm64 twin)

Why nothing else changes

The installer needs no change. It is manifest-driven: it filters rows by host os/arch and marks anything under bin executable.

The Rust tree needs no change. The resolver already looks exactly where these rows land — minimald falls back to switch::installed_gvproxy_bin() when GVPROXY_BIN is unset, which probes $MINIMAL_BIN / $HOME/.local/bin for gvproxy-min. There is no cfg(target_os) anywhere in that path; it was written platform-agnostic and Linux was the half that had nothing to find.

No migration is needed on Linux, unlike macOS. gvproxy was never staged here, so no Linux install record carries the pre-rename name for remove_renamed_gvproxy to clean up.

The naming rationale (gvproxy-min, not gvproxy — the bin prefix is on PATH and podman/crc ship their own) moves from the darwin row up to the table header, since it now governs three rows rather than one.

Verification

Dry-run stage against stub artifacts — both rows resolve, with distinct per-arch digests:

gvproxy-min  linux  amd64  testver  31db9278…  file  bin/gvproxy-min  versions/testver/gvproxy-linux-amd64
gvproxy-min  linux  arm64  testver  2a9953f0…  file  bin/gvproxy-min  versions/testver/gvproxy-linux-arm64

shellcheck clean at 0.11.0 and at CI's 0.10.0.

Scope

minvmd and the guest payload stay out. the static-musl research in #1065 has shown minvmd can ship as a single self-contained binary, so shipping the dynamic-glibc build now would mean putting ~29 MB of libraries plus RUNPATH machinery, a bin/lib sibling constraint, and a glibc floor onto users' disks — then deleting all of it. That is the remaining half of #980, tracked in #1065.

The release-pipeline.md per-platform component list is updated to match, including its macOS entry, which still read bin/gvproxy after the #994 rename.

Refs #980

🤖 Generated with Claude Code

Note

Ship gvproxy-min (switch binary) to Linux amd64 and arm64 installs

Adds gvproxy-min entries for Linux amd64 and arm64 to the COMPONENTS table in scripts/stage-release.sh, placing the switch binary (standard gvproxy bytes) at ~/.local/bin/gvproxy-min on Linux hosts. Updates docs/internal/release-pipeline.md to reflect the new per-platform component lists. Note: minvmd is not yet staged for Linux (tracked in issue #980).

Macroscope summarized bf13a86.

@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 26 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: affcbf12-7466-4085-8ba8-c353bed5f300

📥 Commits

Reviewing files that changed from the base of the PR and between 12c81c3 and bf13a86.

📒 Files selected for processing (2)
  • docs/internal/release-pipeline.md
  • scripts/stage-release.sh

Comment @coderabbitai help to get the list of available commands.

@norrietaylor
norrietaylor enabled auto-merge (squash) July 29, 2026 19:08
@norrietaylor
norrietaylor force-pushed the fix/stage-linux-gvproxy branch from f2efe48 to 283f503 Compare July 29, 2026 19:10
Own-IP is dead on every installed Linux host. The native (DM2) datapath
is implemented and proven by the netns job, but `minimald` resolves a
switch binary no Linux install ships, so the spawn fails on a path that
was never populated. CI only passes because it fetches gvproxy itself
and sets `GVPROXY_BIN`.

The release already builds pin-verified `gvproxy-linux-{amd64,arm64}`
(release.yml uploads both); they were simply never mapped to install
components. Two rows, and the manifest-driven installer needs no change
— it filters the manifest by host os/arch and marks anything under `bin`
executable.

The resolver already looks where these rows land: `minimald` falls back
to `switch::installed_gvproxy_bin()` when `GVPROXY_BIN` is unset, which
probes `$MINIMAL_BIN`/`$HOME/.local/bin` for `gvproxy-min` with no
platform gating. Nothing in the Rust tree changes.

No migration is needed on Linux, unlike macOS: `gvproxy` was never
staged here, so no Linux install record carries the pre-rename name for
`remove_renamed_gvproxy` to clean up.

The naming rationale moves from the darwin row up to the table header,
since it now governs three rows rather than one.

minvmd and the guest payload stay out. The static-musl research in
#1065 has shown minvmd can ship as a single self-contained binary, so
shipping the dynamic-glibc version now would mean putting ~29 MB of
libraries plus RUNPATH machinery, a bin/lib sibling constraint and a
glibc floor onto users' disks, then deleting all of it. The release-pipeline doc gets the
matching note (and its macOS entry, still reading `bin/gvproxy`, catches
up with the rename).

Verified with a dry-run stage against stub artifacts: both rows emit
`file bin/gvproxy-min` with distinct per-arch digests.

Refs: #980

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@norrietaylor
norrietaylor force-pushed the fix/stage-linux-gvproxy branch from 283f503 to bf13a86 Compare July 29, 2026 19:10
@norrietaylor
norrietaylor merged commit a6c0e35 into main Jul 29, 2026
29 checks passed
@norrietaylor
norrietaylor deleted the fix/stage-linux-gvproxy branch July 29, 2026 19:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants