Skip to content

release: publish aarch64/arm64 client packages alongside x86_64/amd64 - #4329

Open
ayushsingh82 wants to merge 1 commit into
malbeclabs:mainfrom
ayushsingh82:fix/4176-aarch64-client-packaging
Open

ayushsingh82 wants to merge 1 commit into
malbeclabs:mainfrom
ayushsingh82:fix/4176-aarch64-client-packaging

Conversation

@ayushsingh82

Copy link
Copy Markdown
Contributor

Problem

Closes #4176.

We publish apt and yum repositories but no ARM64 artifacts, so the client cannot be installed from a package on aarch64 hosts. Every published artifact is x86_64 (rpm) / amd64 (deb) — since packages publish as any-distro/any-version, architecture is the only real constraint. Verified on the issue itself: the client and daemon both build clean and run correctly on Graviton with no source changes needed — this is packaging only, not a port.

Fix

  • doublezerod (CGO_ENABLED=0, pure Go): add arm64 to its goarch matrix — cross-compiles natively, no extra toolchain.
  • Rust doublezero CLI: new doublezero-cli-arm64 / doublezero-cli-mainnet-beta-arm64 build entries targeting aarch64-unknown-linux-musl, using cargo-zigbuild instead of a musl-gcc cross toolchain. Reason: aws-lc-sys's hand-written arm assembly build script feeds raw --target=<rust-triple> flags straight to the C compiler, which a plain aarch64-linux-musl-gcc (or a bare zig cc CC-shim) does not accept as-is — cargo-zigbuild rewrites that invocation for zig's own target syntax. The existing x86_64 build entries and their musl-gcc setup are untouched (separate build ids).
  • Wired the new arm64 build ids into the existing archives/nfpms ids: lists so both the tarball and deb/rpm packages carry the arm64 binaries.
  • CI (release.client.yml and the shared release.daily.yml) installs zig (pinned tarball from ziglang.org) + cargo-zigbuild, and adds the aarch64-unknown-linux-musl rustup target. In release.daily.yml — shared by several pure-Go daily-release components — this is gated on inputs.component == 'client' so unrelated components don't pay the cost.
  • client/INSTALL.md: one-line note that packages now support both architectures.

Testing Verification

  • cargo zigbuild --release --package=doublezero --bin=doublezero --target aarch64-unknown-linux-musl (run locally): produces a statically-linked ARM64 ELF binary (file confirms ELF 64-bit LSB executable, ARM aarch64 ... statically linked).
  • CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build ./client/doublezerod/cmd/doublezerod/main.go: produces a statically-linked ARM64 ELF binary.
  • All touched YAML files re-validated for syntax.
  • Not verified: the actual GoReleaser-Pro pipeline end-to-end (build-id grouping into archives/nfpm packages, the CI zig-install step, Cloudsmith publish) — I don't have goreleaser-pro or a Cloudsmith token to run this outside CI. Recommend a --snapshot dry run (or a real tag push to a test channel) to confirm the packaging/publish steps before this goes out on a real release.

We publish apt/yum repositories but no ARM64 artifacts, so the client
cannot be installed from a package on aarch64 hosts (Graviton, Ampere).
Every published artifact is x86_64 (rpm) / amd64 (deb) only.

doublezerod (CGO_ENABLED=0) cross-compiles to arm64 with no extra
toolchain. The Rust doublezero CLI needs cargo-zigbuild rather than a
musl-gcc cross toolchain: aws-lc-sys's hand-written arm assembly build
script feeds raw --target=<rust-triple> flags straight to the C
compiler, which a plain aarch64-linux-musl-gcc (or a bare `zig cc` CC
shim) does not accept as-is; cargo-zigbuild rewrites that invocation
for zig's own target syntax.

New doublezero-cli-arm64 / doublezero-cli-mainnet-beta-arm64 goreleaser
build entries (separate ids, so the existing x86_64 entries and their
musl-gcc toolchain are untouched), wired into the existing archives/
nfpm ids lists. CI installs zig + cargo-zigbuild for the client build
only (release.daily.yml is shared by several pure-Go components that
don't need it).

Verified locally: `cargo zigbuild --release --package=doublezero
--bin=doublezero --target aarch64-unknown-linux-musl` produces a
statically-linked ARM64 ELF binary, and `GOOS=linux GOARCH=arm64 go
build` on doublezerod does the same.

Closes malbeclabs#4176.
@ayushsingh82
ayushsingh82 requested a review from a team September 13, 2026 18:15
@ayushsingh82

Copy link
Copy Markdown
Contributor Author

@armcconnell could you take a look when you have a chance?

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 8a53fee. Configure here.

- id: doublezero
package_name: doublezero
ids: [doublezerod, doublezero-cli]
ids: [doublezerod, doublezero-cli, doublezero-cli-arm64]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Arm64 packages need missing solana dep

High Severity

The new arm64 doublezero deb and rpm packages still declare a hard dependency on doublezero-solana, which is only built and published for x86_64/amd64. On aarch64 hosts, apt/yum cannot satisfy that dependency, so the packages this change adds are not installable from the repo.

Additional Locations (2)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 8a53fee. Configure here.

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.

packaging: publish aarch64 rpm/deb artifacts for the client

1 participant