Linux runners
Native x64 and arm64 Linux runners on any EC2 instance, from Flex labels or Fleet runner definitions.
RunsOn supports both native x64 and arm64 Linux runners.
Flex
Pick a predefined runner from the runs-on label — 2cpu-linux-x64 for x64, 2cpu-linux-arm64 for arm64:
jobs: build: runs-on: runs-on=${{ github.run_id }}/runner=2cpu-linux-x64 steps: - uses: runs-on/action@v2 - run: echo "Hello from x64!"jobs: build: runs-on: runs-on=${{ github.run_id }}/runner=2cpu-linux-arm64 steps: - uses: runs-on/action@v2 - run: echo "Hello from arm64!"Most users go beyond the predefined names and tailor CPU, memory, family, and volume with job labels or custom runners.
Fleet
Define the runner shape in Terraform, publish it as a fleet, then target the fleet from workflow YAML:
runners = { linux-small = { family = ["c8i.large"] image = "ubuntu24-full-x64" }}
fleets = { linux-small = { runner = "linux-small" }}jobs: build: runs-on: runs-on/fleet=linux-small/env=productionDefault runners#
Flex has these predefined runners. Pass one as runner=<name>, and override any part of it with other labels, for example runner=4cpu-linux-x64/family=c8. All of them use Spot instances by default (spot=false for on-demand).
| Runner | vCPUs | Memory (GiB) | Instance families | Image |
|---|---|---|---|---|
1cpu-linux-x64 | 1 or 2 | 4 | c8, m8a, t8i | ubuntu24-full-x64 |
2cpu-linux-x64 | 2 | any | m8, r8 | ubuntu24-full-x64 |
4cpu-linux-x64 | 4 | any | m8, r8 | ubuntu24-full-x64 |
8cpu-linux-x64 | 8 | any | c8, m8 | ubuntu24-full-x64 |
16cpu-linux-x64 | 16 | any | c8, m8 | ubuntu24-full-x64 |
32cpu-linux-x64 | 32 | any | c8, m8 | ubuntu24-full-x64 |
48cpu-linux-x64 | 48 | any | c8, m8 | ubuntu24-full-x64 |
64cpu-linux-x64 | 64 | any | c8, m8 | ubuntu24-full-x64 |
1cpu-linux-arm64 | 1 or 2 | 2 to 8 | m8g, m9g, t4g | ubuntu24-full-arm64 |
2cpu-linux-arm64 | 2 | 4 to 16 | m8g, m9g, r8g, r9g, t4g | ubuntu24-full-arm64 |
4cpu-linux-arm64 | 4 | any | c8g, c9g, m8g, m9g | ubuntu24-full-arm64 |
8cpu-linux-arm64 | 8 | any | c8g, c9g, m8g, m9g | ubuntu24-full-arm64 |
16cpu-linux-arm64 | 16 | any | c8g, c9g, m8g, m9g | ubuntu24-full-arm64 |
32cpu-linux-arm64 | 32 | any | c8g, c9g, m8g, m9g | ubuntu24-full-arm64 |
48cpu-linux-arm64 | 48 | any | c8g, c9g, m8g, m9g | ubuntu24-full-arm64 |
64cpu-linux-arm64 | 64 | any | c8g, c9g, m8g, m9g | ubuntu24-full-arm64 |
Without a runner label, Flex uses 2cpu-linux-x64. To change a default runner or add your own, see custom runners.
Default images#
Opt into a specific image with the image label. When you set image, make sure your family uses instance types matching the image architecture (e.g. family=c8g+m8g for arm64).
| Image | Architecture | Description |
|---|---|---|
ubuntu22-full-x64 | x64 | Compatible with the official Ubuntu 22.04 GitHub runner image. |
ubuntu24-full-x64 | x64 | Compatible with the official Ubuntu 24.04 GitHub runner image. |
ubuntu26-full-x64 | x64 | Compatible with the official Ubuntu 26.04 GitHub runner image. |
ubuntu22-full-arm64 | arm64 | Compatible with the official Ubuntu 22.04 GitHub runner image. |
ubuntu24-full-arm64 | arm64 | Compatible with the official Ubuntu 24.04 GitHub runner image. |
ubuntu26-full-arm64 | arm64 | Compatible with the official Ubuntu 26.04 GitHub runner image. |
Minimal images#
Since v3.0.7, RunsOn also publishes minimal images, for the fastest boot times. They ship the GitHub Actions runner, Docker (with Buildx and Compose), Git and Python 3, and none of the toolchains of the full images: no Node.js, Java, browsers or cloud CLIs. Use them for jobs that run in containers, or that install what they need with setup-* actions.
Like the full images, they ship libicu, which .NET needs for cultures such as en-US, and a /usr/share/dotnet that the runner user can write to, so actions/setup-dotnet works with its default install directory.
| Image | Architecture | Description |
|---|---|---|
ubuntu24-minimal-x64 | x64 | Ubuntu 24.04 with the GitHub Actions runner, Docker, Git and Python 3. |
ubuntu24-minimal-arm64 | arm64 | Ubuntu 24.04 with the GitHub Actions runner, Docker, Git and Python 3. |
Flex
jobs: build: runs-on: runs-on=${{ github.run_id }}/runner=2cpu-linux-x64/image=ubuntu24-minimal-x64 steps: - uses: actions/checkout@v7 - uses: actions/setup-node@v7 with: node-version: 24 - run: npm ci && npm testFleet
runners = { linux-minimal = { family = ["c8i.large"] image = "ubuntu24-minimal-x64" }}Minimal images are rebuilt on the same schedule as the full images, from the same repository ↗.
Examples#
Disable spot pricing for critical jobs:
jobs: build: runs-on: runs-on=${{ github.run_id }}/runner=2cpu-linux-x64/spot=falseOnly allow 4-CPU instances from compute-optimized families:
jobs: build: runs-on: runs-on=${{ github.run_id }}/runner=4cpu-linux-x64/family=c8Fully custom definition — launched in a private subnet with a static egress IP:
jobs: build: runs-on: runs-on=${{ github.run_id }}/ram=8/family=m8+c8+r8/image=ubuntu24-full-x64/spot=false/ssh=false/private=trueNeed help choosing? Use the instance finder ↗ to match AWS instances to your CPU, RAM, and architecture requirements.
Quotas#
New AWS accounts have low default quotas for standard instances, so you may need an increase to launch many jobs.
How to request an increase
- Search for “Quotas” in the AWS console.
- Click “Request quota increase”.
- Select “EC2” as the service.
- Select the standard instance type.
- Fill in the form and submit (you request vCPUs, not instance count).
- Repeat for both spot and on-demand quotas.
