Linux self-hosted runners
Learn how to set up and use Linux self-hosted runners for your GitHub Actions workflows. Supports native x64 and arm64 architectures.
If you want to self-host GitHub Actions runners for Linux on AWS, RunsOn supports both native x64 and arm64 runners, irrespective of your GitHub plan (even with free plans).
For instance if you want to use a 2cpu x64 runner, your workflow file would look like this:
jobs:
build:
runs-on: runs-on=${{ github.run_id }}/runner=2cpu-linux-x64
steps:
- run: echo "Hello from x64!"
For an arm64 runner, you would use:
jobs:
build:
runs-on: runs-on=${{ github.run_id }}/runner=2cpu-linux-arm64
steps:
- run: echo "Hello from arm64!"
The list of predefined runner names is available below, although most users will customize their runners to use a specific number of CPUs, memory, volume size, etc. using the Custom runners capabilities.
Default runners
Per-minute costs including compute + 40GB gp3 EBS storage. Reduce egress costs further with Magic Cache.
Spot prices, us-east-1. Actual costs vary by region, time of day, and instance type selected.
Default images
You can opt into a specific image by setting the image label in your workflow.
x64
| Image | Description |
|---|---|
| ubuntu22-full-x64 | x64 image compatible with official Ubuntu 22.04 GitHub runner image |
| ubuntu24-full-x64 | x64 image compatible with official Ubuntu 24.04 GitHub runner image |
arm64
| Image | Description |
|---|---|
| ubuntu22-full-arm64 | arm64 image compatible with official Ubuntu 22.04 GitHub runner image |
| ubuntu24-full-arm64 | arm64 image compatible with official Ubuntu 24.04 GitHub runner image |
In case you specify the image label, make sure you have a family label that specifies instance types that support your image architecture. For instance:
jobs:
build:
runs-on: runs-on=${{ github.run_id }}/image=ubuntu24-full-arm64/family=c7g+m7g
Custom runners
You can also create your own custom runners using inline runs-on: labels in your workflow, or by referencing a custom runner name created in the repository configuration file.
For more details:
- See the Job labels section.
- See the Repository configuration section.
Custom images
Every runner launches from an AMI. Default runners are launched using a public AMI managed by RunsOn, but you can also build and use your own custom AMIs if you’d like better control, or preinstall specific software.
For more details:
- See the Custom images section.
Examples
Disable spot pricing for critical jobs:
jobs:
build:
runs-on: runs-on=${{ github.run_id }}/runner=2cpu-linux-x64/spot=false
Only allow instances with 4 CPUs from compute-optimized families:
jobs:
build:
runs-on: runs-on=${{ github.run_id }}/runner=4cpu-linux-x64/family=c7
Use ubuntu22 image instead of default ubuntu24:
jobs:
build:
runs-on: runs-on=${{ github.run_id }}/runner=2cpu-linux-x64/image=ubuntu22-full-x64
Fully custom runs-on definition, instance is launched in private subnet with static egress IP:
jobs:
build:
runs-on: runs-on=${{ github.run_id }}/family=m7+c7+r7/image=ubuntu24-full-x64/spot=false/ssh=false/private=true
Quotas
Note that new AWS accounts have low quotas set by default for standard instances, so you might need to request an increase if you plan on launching many jobs.
How to request an increase
- Search for “Quotas” in the AWS console.
- Click on “Request quota increase”.
- Select “EC2” as the service.
- Select “G” as the instance type.
- Fill in the form and submit (remember that you request vCPUs, not instance count).
- Repeat for both spot and on-demand quotas.

Finding the right instance
Need help choosing the right instance type for your workload? Use the instance finder ↗ to quickly find AWS instances matching your CPU, RAM, and architecture requirements.