Container Images
Each runner pod uses a single unified container image: the GitHub Actions runner together with the full set of tools listed below. The image is built for linux/riscv64 and stored in the Scaleway Container Registry.
Source: riscv-runner-images
Runner image
Dockerfile: runner/Dockerfile.ubuntu
The runner image is a multi-stage build based on Ubuntu (24.04 or 26.04). It contains:
GitHub Actions Runner
The GitHub Actions Runner for RISC-V, built with .NET 8. This is the process that registers with GitHub, receives the job, and executes workflow steps. The JIT runner config is passed in via the RUNNER_JITCONFIG environment variable; the worker obtains it from the GitHub API at pod creation time.
Pre-installed software
| Category | Packages |
|---|---|
| Languages | Python 3.10–3.14 (including free-threaded variants), Node.js, Go, Rust, Java (Temurin 17/21/25), PHP, Ruby, Perl, Lua, R |
| Compilers | GCC, G++, Clang |
| Build tools | Make, CMake, Ninja, Autoconf, Automake, Libtool, Flex, Bison, Binutils, Gradle, Maven, Ant |
| Container tooling | Docker (CLI, Buildx, Compose, daemon), podman, buildah, skopeo, runc, kubectl |
| VCS | Git, Mercurial |
| Networking | curl, wget, openssh-client, netcat, dnsutils |
| Compression | bzip2, lz4, xz, zip, 7z, aria2 |
| Packaging | dpkg, rpm, fakeroot |
| Utilities | jq, shellcheck, tree, rsync, sudo, parallel |
The image aims to track the official GitHub Actions Ubuntu runner images. Pinned versions live in versions-map.json. If your workflow needs a package that isn’t in the image, open an issue.
User configuration
The image creates a non-root runner user with passwordless sudo. All workflow steps run inside this single container. The pod runs with privileged: true so the in-pod Docker daemon can program iptables and bridge devices.
Build pipeline
Workflow: .github/workflows/release.yml
A single build-runner job builds the runner image, currently for Ubuntu 24.04 (26.04 is staged behind a matrix entry).
- Trigger: push to
mainorstaging, daily schedule, or manual dispatch. - Platform:
linux/riscv64, built natively onubuntu-24.04-riscvself-hosted RISC-V runners (no QEMU emulation in the build path). - Caching: GitHub Actions Cache (
type=gha) for Docker layer reuse. A concurrency group ensures only one build runs per branch. - Versioning:
scripts/update-versions.pysyncs pinned versions inversions-map.jsonfrom upstream releases, then a scheduled workflow opens a PR with the diff.
Registry
Images are stored in the Scaleway Container Registry:
rg.fr-par.scw.cloud/funcscwriseriscvrunnerappqdvknz9s/riscv-runner
Image tags
| Tag | Image | Source branch |
|---|---|---|
ubuntu-24.04-latest | Runner image, Ubuntu 24.04 | main |
ubuntu-26.04-latest | Runner image, Ubuntu 26.04 | main |
Source files
| File | Role |
|---|---|
runner/Dockerfile.ubuntu | Runner image (multi-stage; tools, language runtimes, container tooling) |
runner/riscv-runner-entrypoint.sh | PID-1 entrypoint, execs run.sh --jitconfig "$RUNNER_JITCONFIG" |
versions-map.json | Pinned versions for all bundled tools and runtimes |
.github/workflows/release.yml | CI/CD pipeline |