Runners

Configuring RunsOn Runners

Customize CPU, RAM, instance types, and images for your workflows


RunsOn provides flexible configuration through job labels, repository configuration files, and stack-level settings. This guide covers all configuration options.

Job label syntax#

The simplest way to configure runners is through the runs-on label in your workflow:

1
runs-on: runs-on=${{ github.run_id }}/runner=<runner-type>

The ${{ github.run_id }} ensures each workflow run gets unique runner instances.

Pre-defined runner types#

RunsOn provides pre-configured runner types for common use cases:

Linux x64#

RunnervCPUsRAMInstanceCost/min
1cpu-linux-x6414 GBm7a.medium$0.0008
2cpu-linux-x6428 GBm7i.large$0.0011
4cpu-linux-x64416 GBm7i.xlarge$0.0019
8cpu-linux-x64832 GBm7i.2xlarge$0.0038
16cpu-linux-x641664 GBm7i.4xlarge$0.0077
32cpu-linux-x6432128 GBm7i.8xlarge$0.0154
64cpu-linux-x6464256 GBc7a.16xlarge$0.0147

Linux ARM64#

RunnervCPUsRAMInstanceCost/min
1cpu-linux-arm6414 GBm7g.medium$0.0006
2cpu-linux-arm6428 GBm7g.large$0.0010
4cpu-linux-arm64416 GBm7g.xlarge$0.0016
8cpu-linux-arm64832 GBm7g.2xlarge$0.0032
16cpu-linux-arm641664 GBm7g.4xlarge$0.0064
32cpu-linux-arm6432128 GBm7g.8xlarge$0.0128
64cpu-linux-arm6464256 GBc7g.16xlarge$0.0200

Prices shown are for spot instances. On-demand pricing is approximately 3x higher.

Custom configuration#

For fine-grained control, use individual parameters in the label:

1
runs-on: runs-on=${{ github.run_id }}/cpu=4/ram=16/family=m7a+m7i-flex

Available parameters#

ParameterDescriptionExample
cpuNumber of vCPUscpu=4
ramRAM in GBram=16
familyEC2 instance families (+ separated)family=m7a+m7i
imageAMI name or IDimage=ubuntu24-full-x64
spotUse spot instancesspot=true (default)
volumeRoot volume size in GBvolume=100
hddAdditional HDD volumehdd=500
sshEnable SSH accessssh=true

Examples#

High-memory build:

1
runs-on: runs-on=${{ github.run_id }}/cpu=8/ram=64/family=r7i

Large disk for artifacts:

1
runs-on: runs-on=${{ github.run_id }}/runner=4cpu-linux-x64/volume=200

On-demand for critical jobs:

1
runs-on: runs-on=${{ github.run_id }}/runner=8cpu-linux-x64/spot=false

ARM64 with custom image:

1
runs-on: runs-on=${{ github.run_id }}/cpu=4/family=m7g/image=ubuntu24-full-arm64

Default images#

RunsOn provides four pre-built Ubuntu images that mirror GitHub-hosted runner tooling:

ImageOSArchitectureTools
ubuntu22-full-x64Ubuntu 22.04x64Full GitHub runner tools
ubuntu22-full-arm64Ubuntu 22.04ARM64Full GitHub runner tools
ubuntu24-full-x64Ubuntu 24.04x64Full GitHub runner tools
ubuntu24-full-arm64Ubuntu 24.04ARM64Full GitHub runner tools

Images are rebuilt every 15 days from the official GitHub runner-images repository to maintain compatibility.

Custom images#

Create custom AMIs with pre-installed dependencies for faster job startup:

  1. Launch an instance with a base RunsOn image
  2. Install your custom software and dependencies
  3. Create an AMI from the instance
  4. Reference the AMI in your workflow:
1
runs-on: runs-on=${{ github.run_id }}/image=ami-0123456789abcdef0

For wildcard-based automatic updates, name your AMIs with a pattern:

1
runs-on: runs-on=${{ github.run_id }}/image=my-custom-image-*

RunsOn automatically uses the latest AMI matching the pattern.

Repository configuration#

Create a .github/runs-on.yml file for repository-level defaults:

1
# .github/runs-on.yml
2
defaults:
3
runner: 4cpu-linux-x64
4
spot: true
5
6
images:
7
my-image:
8
ami: ami-0123456789abcdef0
9
10
runners:
11
large-build:
12
cpu: 16
13
ram: 64
14
family: c7i

Reference custom runners in workflows:

1
runs-on: runs-on=${{ github.run_id }}/runner=large-build

Stack configuration#

Configure organization-wide defaults via CloudFormation parameters:

ParameterDescription
DefaultRunnerTypeDefault runner when not specified
AllowedInstanceFamiliesRestrict available instance types
MaxConcurrentRunnersLimit concurrent EC2 instances
DefaultSpotEnable/disable spot by default
DefaultVolumeSizeDefault root volume size

Instance families#

Choose instance families based on workload characteristics:

FamilyOptimized ForUse Case
m7i, m7aGeneral purposeMost CI/CD workloads
c7i, c7aComputeCompilation, testing
r7i, r7aMemoryLarge datasets, caching
m7g, c7gARM64Cost-efficient builds
g5, p4dGPUML training, rendering

Combine families with + for flexibility:

1
runs-on: runs-on=${{ github.run_id }}/cpu=4/family=m7i+m7a+c7i

RunsOn selects the most cost-effective available instance.

Spot instances#

Spot instances provide 60-90% cost savings. RunsOn handles spot interruptions automatically:

  • Jobs are retried on a new instance if interrupted
  • On-demand fallback available for critical jobs
  • Interruption rate is typically under 5%

Disable spot for time-sensitive jobs:

1
runs-on: runs-on=${{ github.run_id }}/runner=8cpu-linux-x64/spot=false

Resource tagging#

Add AWS tags for cost allocation:

1
runs-on: runs-on=${{ github.run_id }}/runner=4cpu-linux-x64/tag:team=platform/tag:project=api

Tags appear on EC2 instances and related resources for cost tracking.

Next steps#