Skip to content

Linux self-hosted runners

RunsOn supports both native x64 and arm64 self-hosted GitHub Actions 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, disk size, etc. using the Custom runners capabilities.

Default runners

The table below shows the per-minute prices of various runner types using EC2 instances launched by RunsOn, against comparable official managed GitHub runners. Cost includes compute + storage using the default RunsOn stack parameters. Networking costs can vary depending on your usage but all ingress traffic is free. Most users can significantly reduce egress traffic by using the Magic Cache feature, as well as ECR for storing docker images.

1cpu-linux-x64 (m7a.medium)
$0.0008
GitHub Not available
-
2cpu-linux-x64 (m7i.large)
$0.0011
GitHub $0.008
7.2x cheaper
4cpu-linux-x64 (m7i.xlarge)
$0.0019
GitHub $0.016
8.6x cheaper
8cpu-linux-x64 (c7i.2xlarge)
$0.0034
GitHub $0.032
9.5x cheaper
16cpu-linux-x64 (c7i.4xlarge)
$0.0068
GitHub $0.064
9.4x cheaper
32cpu-linux-x64 (m7i-flex.8xlarge)
$0.0114
GitHub $0.128
11.3x cheaper
48cpu-linux-x64 (c7i.12xlarge)
$0.0165
GitHub Not available
-
64cpu-linux-x64 (c7a.16xlarge)
$0.0147
GitHub $0.256
17.4x cheaper

$/min, us-east-1 spot prices, for the instance type selected at the time of the calculation. Prices can vary based on time of day, region, and instance type selected. Savings are higher if you include the speed gains (your jobs will consume less minutes) or use previous-generation instance types.

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:

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:

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
- runner=4cpu-linux-x64
- run-id=${{ github.run_id }}
- family=c7

Use ubuntu24 image instead of default ubuntu22:

jobs:
build:
runs-on:
- runs-on=${{ github.run_id }}
- runner=2cpu-linux-x64
- image=ubuntu24-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