Skip to content

fix(release): ship gvproxy to Linux installs (native own-ip) - #982

Closed
norrietaylor wants to merge 1 commit into
mainfrom
fix/980-linux-gvproxy-staging
Closed

fix(release): ship gvproxy to Linux installs (native own-ip)#982
norrietaylor wants to merge 1 commit into
mainfrom
fix/980-linux-gvproxy-staging

Conversation

@norrietaylor

@norrietaylor norrietaylor commented Jul 27, 2026

Copy link
Copy Markdown
Member

Summary

Part of #980 — the gvproxy half. Linux installs now get bin/gvproxy, and both daemons agree with the installer on where it lives, so native (DM2) own-IP sessions work on installed hosts.

  • scripts/stage-release.sh: add gvproxy|linux|amd64 and gvproxy|linux|arm64 rows. The release workflow already uploads the pin-verified gvproxy-linux-{amd64,arm64} artifacts (#495); they were just never mapped to Linux install components. The installer is manifest-driven and needs no change.
  • switch::installed_gvproxy_bin() (new): staging the binary alone would not revive own-ip — the installer stamps bin/ components into ~/.local/bin (or $MINIMAL_BIN), but minimald resolved the switch only at the fixed /usr/lib/minimal/bin/gvproxy. The new function is the one shared definition of the installed location (user-local install if present, else the system path), in the crate whose charter is exactly "one definition rather than drifting copies" shared by both daemons.
  • minimald: the OwnIp switch default now goes through the shared resolver; --gvproxy-bin / the config field still win, and the GVPROXY_BIN env var remains scoped to the netns proof only.
  • minvmd: delegates tiers 2/3 of resolve_gvproxy_path() to the shared definition — it already had exactly this user-local tier, now the two daemons cannot drift. Its MINVMD_GVPROXY_BIN override tier is unchanged.

Deferred — the minvmd half of #980

VM-backed sessions on Linux installs stay out of scope, per the issue's own open questions: minvmd needs libkrun.so/libkrunfw.so staged (plus an rpath story), the guest payload (data/{vmlinuz,rootfs.img,initramfs.cpio}) mapped for Linux, and an arm64 minvmd build — all requiring changes to the frozen, CODEOWNER-gated release.yml. Shipping bin/minvmd today would install a binary that cannot load libkrun, and the arm64 row would hard-fail staging (no minvmd-linux-arm64 artifact exists).

Verification

  • scripts/stage-release.sh --dry-run against a stand-in artifacts dir emits both new rows with correct dest/src; shellcheck clean.
  • cargo test -p switch (incl. 2 new resolver tests), just test (darwin scope, 511 pass), just clippy, just fmt-check, just deny, just doctest — all green locally (macOS).
  • cross check -p minimald --all-targets --target aarch64-unknown-linux-musl --locked passes; the single warning is the pre-existing musl-only libc::time_t deprecation in guest.rs, untouched here.
  • The end-to-end own-ip proof is Linux-only: ci-linux-native's netns job (netns_root_integration.rs) covers the datapath, and the resolver change preserves its config-injection path.

🤖 Generated with Claude Code

Note

Ship gvproxy to Linux installs for native own-IP sessions

  • Adds gvproxy to the Linux amd64 and arm64 component lists in stage-release.sh, so the installer places bin/gvproxy on Linux hosts.
  • Moves gvproxy path resolution into a shared switch::installed_gvproxy_bin() function that prefers a user-local bin/gvproxy install, falling back to the system path.
  • Removes duplicated DEFAULT_GVPROXY_BIN and installer_bin_dir constants/helpers from minimald and minvmd; both now delegate to the switch crate.
  • Updates CLI docs and the release pipeline doc to reflect the new default and Linux inclusion.

Macroscope summarized a919053.

The Linux component set omitted gvproxy, so the native (DM2) own-IP
datapath was dead on every installed Linux host: minimald resolved the
switch only at the fixed /usr/lib/minimal/bin/gvproxy, which no install
provides. The release workflow already stages pin-verified
gvproxy-linux-{amd64,arm64} artifacts; they were just never mapped to
Linux install components.

- stage-release.sh: add gvproxy rows for linux/amd64 and linux/arm64
  (bin/gvproxy, same dest as the darwin row).
- switch: add installed_gvproxy_bin(), one shared definition of where
  an install puts gvproxy (user-local $MINIMAL_BIN / ~/.local/bin,
  else the system-wide /usr/lib/minimal/bin/gvproxy fallback).
- minimald: default the OwnIp switch path through the shared resolver
  instead of the fixed system path, so an installed daemon finds the
  user-local gvproxy. The --gvproxy-bin flag/config still wins.
- minvmd: delegate tiers 2/3 of its resolver to the shared definition
  (its MINVMD_GVPROXY_BIN override tier is unchanged).

The minvmd half of the issue (VM mode on Linux installs) is deferred:
it needs libkrun/libkrunfw and the guest payload staged alongside it,
plus an arm64 minvmd build, all behind the frozen release workflow.

Refs: #980

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 27, 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: 15 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: ba084630-cc19-4e6b-b058-2f4364d898ce

📥 Commits

Reviewing files that changed from the base of the PR and between b1cde76 and a919053.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (8)
  • crates/minimald/src/main.rs
  • crates/minimald/src/server.rs
  • crates/minvmd/src/image.rs
  • crates/switch/Cargo.toml
  • crates/switch/src/lib.rs
  • docs/internal/release-pipeline.md
  • docs/reference/cli-minimald.md
  • scripts/stage-release.sh

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

@norrietaylor
norrietaylor marked this pull request as draft July 27, 2026 19:38
@twitchyliquid64
twitchyliquid64 deleted the fix/980-linux-gvproxy-staging branch July 30, 2026 00:31
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.

1 participant