Skip to content

Add verified-garbage's x86 and ARMv7 runner images - #799

Closed
reaperhulk wants to merge 3 commits into
mainfrom
claude/lucid-darwin-qhdgmq
Closed

reaperhulk wants to merge 3 commits into
mainfrom
claude/lucid-darwin-qhdgmq

Conversation

@reaperhulk

Copy link
Copy Markdown
Member

verified-garbage runs its x86 jobs in rust:slim, installing the amd64 libc, git and python3 in every job. Its ARMv7 jobs run in cryptography-runner-ubuntu-rolling:armv7l with a separate RUSTUP_HOME, which works around that image's stripped toolchain. This adds one image for both 32-bit userspaces, containing only what those jobs use. It's built by a new workflow, build-verified-garbage-images.yml, modelled on build-docker-images.yml:

  • ghcr.io/pyca/verified-garbage-runner:i686 (linux/386, on ubuntu-latest)
  • ghcr.io/pyca/verified-garbage-runner:armv7l (linux/arm/v7, on ubuntu-24.04-arm)

Contents (verified-garbage/Dockerfile, on debian:trixie-slim)

  • libc6 and libstdc++6 for the runner's architecture (amd64/arm64), so the Node binary that GitHub Actions injects can run
  • gcc and libc6-dev (rustc's linker; binutils provides readelf for the Thumb check)
  • git and ca-certificates for actions/checkout
  • python3 for the coverage export and the benchmark comparison
  • zstd for actions/cache
  • libssl-dev, pkg-config and openssl for the benchmarks, which link rust-openssl
  • Stable Rust (minimal profile) with clippy, rustfmt and llvm-tools, plus the thumbv7neon-unknown-linux-gnueabihf target on ARMv7. These are the components and target the jobs install. The host triple is the userspace's, and the toolchain lives in a fixed RUSTUP_HOME/CARGO_HOME, because jobs run with HOME=/github/home.

The toolchain is shrunk the same way as the Ubuntu runner images (#798): libLLVM is deduplicated and the big binaries are run through llvm-strip. Every file in rustup's manifests is kept, so jobs can update the toolchain in place. RUSTUP_PERMIT_COPY_RENAME=1 is also set.

Checks

After building, the workflow runs these inside each image:

  • the runner's own Node
  • git, Python, OpenSSL and pkg-config
  • rustc, clippy, rustfmt and llvm-cov
  • a hello-world crate built and run for every installed target
  • rustup component remove on the toolchain's components

Testing

Locally, I built the i386 package layer and ran the runner's x86-64 Node inside it. The rustup step and the ARMv7 image have only been checked by this PR's CI.

Follow-ups

  • The new verified-garbage-runner package will be private when it's first pushed from main. It needs to be made public, or given read access for pyca/verified-garbage.
  • verified-garbage then switches to these images in a separate PR.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NpYBbKWv7QaJdAZp7VafSt


Generated by Claude Code

claude added 3 commits October 5, 2026 08:35
verified-garbage runs its x86 jobs in rust:slim (installing the amd64 libc,
git and python3 in every job) and its ARMv7 jobs in
cryptography-runner-ubuntu-rolling:armv7l, whose stripped toolchain the
jobs cannot update in place. Build one image for both, with only what those
jobs use: the runner's libc and libstdc++ for the Node GitHub Actions
injects, gcc, git, python3, OpenSSL's headers and CLI for the benchmarks,
and an unstripped stable toolchain with the components and targets the jobs
install, in a fixed RUSTUP_HOME and CARGO_HOME.

It is built in a job of its own, as verified-garbage-runner:i686
(linux/386, on an x86-64 runner) and verified-garbage-runner:armv7l
(linux/arm/v7, on an ARM64 runner), and each image is checked: the
runner's Node runs in it, a crate builds and runs for every installed
target, and rustup can uninstall the toolchain's components.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NpYBbKWv7QaJdAZp7VafSt
Move the build out of build-docker-images.yml into
build-verified-garbage-images.yml, with the same triggers for its own
paths. Install zstd for actions/cache, set RUSTUP_PERMIT_COPY_RENAME, and
shrink the toolchain as the Ubuntu runner images do: deduplicate libLLVM
and llvm-strip the big binaries (clippy's and rustfmt's too), keeping every
file in rustup's component manifests so the jobs can still update it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NpYBbKWv7QaJdAZp7VafSt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NpYBbKWv7QaJdAZp7VafSt
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants