Skip to content

Match the runner image to GitHub's ubuntu-24.04 image for each architecture #103

Open

Description

@Mearman

The runner pod image in Dockerfile starts from ghcr.io/actions/actions-runner and adds gcc 11, make, unzip, python3-venv, bun, gh and the Docker CLI. GitHub's own runner image for the same OS and architecture (ubuntu-24.04-arm, defined by images/ubuntu/templates/build.ubuntu-24_04-arm64.pkr.hcl and images/ubuntu/toolsets/toolset-2404-arm64.json in actions/runner-images) carries far more, so a workflow written for ubuntu-24.04-arm or ubuntu-latest breaks when it lands on the fleet. Repositories should not have to install what the native image carries, and they should not come to rely on anything the native image does not.

Gaps that have already broken or slowed jobs routed to the fleet:

  • Rust (install-rust.sh: rustup with the stable toolchain, clippy and rustfmt, $HOME/.cargo/bin on the path). A Rust job failed with cargo: command not found, and its workflow now carries a guarded rustup install as a stopgap.
  • zstd (install-zstd.sh). Without it actions/cache falls back to gzip, which costs more to compress and decompress the same cache.
  • cmake, ninja and clang/libclang (install-cmake.sh, install-ninja.sh, install-clang.sh), which build scripts that compile C or C++ through bindgen need.

The Dockerfile installs nothing for most of the native image's other install scripts either, among them git-lfs, Node.js, Java, Ruby, PHP, .NET, PowerShell, pipx packages, yq, the Kubernetes tools, the cloud CLIs, the Docker engine (only the CLI is installed), Homebrew, Bazel, Swift and vcpkg; some may come with the actions-runner base image, which the check below would settle. The native image's own manifest is the reference, not this list.

Proposal: build the fleet image to the native image's toolset for its architecture, from the runner-images install scripts or toolset JSON, and add a check that compares the two so the gap cannot reopen. Where a tool genuinely cannot be carried, the image's README says which, so workflows know not to assume it.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions