What Are the Best Self-Hosted CI Runners for GitHub Actions?
There are several ways to self-host GitHub Actions runners. Run GitHub's runner application on your own machines, run Actions Runner Controller (ARC) on your own Kubernetes cluster, run RunsOn in your own AWS account, or use managed self-hosting such as WarpBuild BYOC, which runs the runners in your own AWS, GCP or Azure account.
Last verified:
GitHub Actions runners can be self-hosted in several ways. GitHub's runner application fits a few machines you manage. Actions Runner Controller (ARC) fits teams that run their own Kubernetes. RunsOn fits teams on AWS that want to run the runner stack themselves. Managed self-hosting, such as WarpBuild BYOC, fits teams that want runners in their own AWS, GCP or Azure account without running the fleet.
What are the main ways to self-host GitHub Actions runners?
The main options are GitHub's self-hosted runner application, Actions Runner Controller (ARC), RunsOn, and managed self-hosting (BYOC). They differ in who operates the machines. In each one, the runners are machines you own or rent, and GitHub Actions sends jobs to them through the runs-on label.
- GitHub's self-hosted runner application. You install the runner application on a machine and register it with a repository, organization or enterprise. Your team keeps the machine, its operating system and its tools up to date (GitHub docs on self-hosted runners).
- Actions Runner Controller (ARC). ARC is a Kubernetes operator that orchestrates and scales self-hosted runners for GitHub Actions (GitHub docs on ARC). Your team runs the cluster, the controller and the runner container images.
- RunsOn. RunsOn runs self-hosted runners in your own AWS account. Your team deploys it as a CloudFormation stack, and its control plane also runs in your account. Each job gets a new EC2 instance that is destroyed when the job ends (RunsOn).
- Managed self-hosting (BYOC). BYOC means "bring your own cloud". It counts as self-hosting because the runner machines are in your own cloud account. In WarpBuild BYOC, the machines are operated for you. When GitHub requests a runner, WarpBuild boots a standby disk or creates a new VM in your account for the job (standby disks docs). On AWS, each job runs on a new instance that is terminated after the job (AWS security docs).
For the basic difference between GitHub's own runners and runners you host, see GitHub-Hosted vs Self-Hosted Runners.
How do the self-hosting options compare?
The table below compares the options, and the WarpBuild feature matrix lists BYOC features in more detail.
| GitHub's runner application | Actions Runner Controller (ARC) | RunsOn | WarpBuild BYOC | |
|---|---|---|---|---|
| Who runs the machines | Your team | Your team runs the cluster and the controller | Your team deploys the stack. Its control plane runs in your AWS account | Managed for you. You own the account, quotas and network |
| Where they run | Any machine you manage, on-premises or in a cloud | Your own Kubernetes cluster | Your own AWS account | Your own AWS, GCP or Azure account |
| Scaling | You add or remove machines | ARC scales runner pods on your cluster | A new EC2 instance for each job. Spot instances by default with on-demand fallback, and optional warm pools | A new VM for each job. Optional standby disks for faster boot, or spot instances (standby disks do not support spot) |
| Image upkeep | Your team keeps the OS and tools updated | GitHub publishes a minimal runner container image. Your team extends it or builds its own | Images built from GitHub's runner image templates, or your own AMIs | You can use your own custom VM images |
| OS support | The OS of the machines you register | The container images your cluster runs | Linux x64 and arm64, and Windows | Linux x86-64 and arm64 on AWS, GCP and Azure. Windows on AWS and Azure |
| Network and static IPs | Your own network setup | Your own cluster network setup | Optional private subnets. Static IPs through a NAT gateway | Runners in a VPC in your account. Static IPs through a NAT gateway |
| Cost model | Your machines plus the engineering time to run them | Your cluster plus the engineering time to run it | Your AWS bill plus a RunsOn license | $0.002 per runner minute, plus compute, storage and data transfer on your own cloud bill |
Which self-hosting option fits which team?
Pick the option by how much of the fleet your team wants to run. Each one works with the same GitHub Actions workflows.
- GitHub's runner application fits a small number of fixed machines, special hardware, or Macs you already own. Your team handles upgrades, cleanup between jobs and capacity.
- ARC fits teams that already run Kubernetes and have people to own the controller, the runner images and cluster scaling. WarpBuild vs Actions Runner Controller (ARC) compares the two in detail, and Actions Runner Controller (ARC) Alternatives lists other options.
- RunsOn fits teams on AWS that want to deploy and run the runner stack in their own account without Kubernetes, and need Linux or Windows runners.
- WarpBuild BYOC fits teams that must keep runners and caches in their own cloud account, want to use cloud discounts they already have, or want runners inside a VPC in their own account, but do not want to run the fleet themselves. Choosing Between Hosted and BYOC Runners covers when BYOC is worth it compared with hosted runners.
If you need macOS runners, BYOC does not cover them. Use WarpBuild Cloud macOS runners (cloud runners docs) or GitHub's runner application on your own Macs.
What does WarpBuild BYOC set up in my cloud account?
WarpBuild BYOC sets up a stack in one region of your cloud account. A stack is a group of resources such as a VPC, subnets and an object storage bucket (BYOC docs). The bucket stores the cache, container image layer cache, logs and other workflow artifacts.
Setup has three steps:
- Connect your cloud account. This creates an IAM role or service account with the permissions WarpBuild needs.
- Create a WarpBuild stack. Choose the cloud account and region, and create a new VPC or, on AWS, use an existing one.
- Create a custom runner. Choose the instance types, disk and IP settings, then use its
warp-custom-label inruns-on.
Static IPs need extra care. Turning them on puts the runners in private subnets behind a NAT gateway, which can add outbound data transfer costs, NAT gateway data processing fees, and data transfer costs between the private subnets and the NAT gateway. Use static IPs only where you need them. Without static IPs, runners start in public subnets and avoid NAT gateway costs (BYOC docs).
For an AWS walkthrough, see BYOC Runners on AWS for GitHub Actions. For the term itself, see BYOC (Bring Your Own Cloud).
Is WarpBuild BYOC secure enough for a security review?
WarpBuild is SOC 2 Type 2 certified (Security, Availability, Confidentiality). See the trust center. On BYOC in AWS, each job runs on a new EC2 instance that is terminated after the job completes, so no state is shared between jobs (AWS security docs). The runners, cache and logs stay in your own cloud account.
FAQ
What are the best self-hosted runners for GitHub Actions?
It depends on who should run the fleet. GitHub's self-hosted runner application fits a few fixed machines you already manage. Actions Runner Controller (ARC) fits teams that already run Kubernetes and want to operate scaling themselves. RunsOn fits teams on AWS that want to deploy and run the runner stack in their own account without Kubernetes. Managed self-hosting such as WarpBuild BYOC fits teams that want runners in their own AWS, GCP or Azure account without running the fleet.
Is BYOC the same as self-hosted runners?
BYOC is a kind of self-hosting. The runner machines are in your own cloud account, as with any self-hosted runner. The difference is who operates them. With BYOC, WarpBuild starts and stops the runner VMs in your account. With GitHub's runner application or ARC, your team does that work.
How much does WarpBuild BYOC cost?
WarpBuild charges $0.002 per minute for BYOC Linux runners and for BYOC Windows runners on AWS and Azure, and cache is free. The compute, disks, storage and data transfer that the runners use are billed by your own cloud provider.
Can I run macOS runners with WarpBuild BYOC?
No. WarpBuild BYOC supports Linux x86-64 and arm64 runners on AWS, GCP and Azure, and Windows runners on AWS and Azure. For macOS, use WarpBuild Cloud macOS runners, or run GitHub's self-hosted runner application on Macs you manage.
Do self-hosted runners give me static IP addresses?
They can. With GitHub's runner application or ARC, the IP addresses depend on how you set up your own network. WarpBuild BYOC supports static IPs on AWS, GCP and Azure by placing runners in private subnets behind a NAT gateway. This can add data transfer and NAT gateway processing costs on your cloud bill.
Start with $10 in free credits
Change the runner label in your workflow and keep the rest of your GitHub Actions setup. Runner time is billed per minute.