https://github.com/runs-on/runs-on
Self-hosted GitHub Actions runners made simple. For AWS. 10x cheaper, up to 2x faster, and unlimited caching. Best alternative to Actions Runner Controller.
https://github.com/runs-on/runs-on
aws ci cicd cloudformation continuous-delivery continuous-deployment continuous-integration ec2-spot github-actions github-runners on-premise self-hosted self-hosted-runners
Last synced: 2 days ago
JSON representation
Self-hosted GitHub Actions runners made simple. For AWS. 10x cheaper, up to 2x faster, and unlimited caching. Best alternative to Actions Runner Controller.
- Host: GitHub
- URL: https://github.com/runs-on/runs-on
- Owner: runs-on
- License: mit
- Created: 2023-12-09T12:44:10.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2026-11-06T15:41:50.000Z (7 days ago)
- Last Synced: 2026-11-09T17:17:03.682Z (4 days ago)
- Topics: aws, ci, cicd, cloudformation, continuous-delivery, continuous-deployment, continuous-integration, ec2-spot, github-actions, github-runners, on-premise, self-hosted, self-hosted-runners
- Homepage: https://runs-on.com
- Size: 2.95 MB
- Stars: 1,409
- Watchers: 9
- Forks: 52
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
- Security: SECURITY.md
Awesome Lists containing this project
- awesome-runners - runs-on/runs-on - on/runs-on.svg)](https://github.com/runs-on/runs-on/blob/master/LICENSE) [](https://github.com/runs-on/runs-on/graphs/contributors/) [](https://github.com/runs-on/runs-on/stargazers/) [](https://GitHub.com/runs-on/runs-on/issues/) [](https://GitHub.com/runs-on/runs-on/issues?q=is%3Aissue+is%3Aclosed) | AWS EC2 | ✅ | Repo, Dynamic Labels | On-demand | ✅ | x86, AMD64, ARM64 | ✅ | No PAT, only JIT token | Auto-cleanup | No runtime privilege | GitHub App exposed | AllInOne and custom images possible | yes (Actions Workflow) | $15/month | (The matrix (might be better readable on [GitHub pages](https://jonico.github.io/awesome-runners/)) / A word about self-hosted action runner images / virtual environments and how to test locally)
- stars - runs-on/runs-on - Self-hosted GitHub Actions runners made simple. For AWS. 10x cheaper, up to 2x faster, and unlimited caching. Best alternative to Actions Runner Controller. \[*MIT License*\] (⭐️1367) (Unknown)
README
# RunsOn
**Cut CI spend, speed up builds, and keep your runner infrastructure fully under your control.**
RunsOn is the self-hosted GitHub Actions control plane for AWS. It launches an isolated EC2 runner for every job with full GitHub Linux runner-image compatibility.
You keep IAM, networking, images, caches, and the AWS bill under your control. RunsOn handles the runner lifecycle—without an ARC cluster, a homegrown runner platform, or a SaaS execution plane in the job path.
[Install RunsOn](https://runs-on.com/installation/flex/) · [See the calculator](https://runs-on.com/calculator/) · [Read the docs](https://runs-on.com/docs/)
## Proven at production scale
> **2.13M jobs in one day**
>
> RunsOn customers launched **24.7 fresh runners per second**, sustained across the day. [Read the scale report.](https://runs-on.com/blog/2130k-jobs-per-day/)
Published cost and performance comparisons:
- **7× lower 2-vCPU Linux cost:** $0.0009/min on c8a.large versus $0.0060/min on GitHub-hosted Linux.[^benchmarks]
- **Up to 13× lower T4 GPU cost:** $0.0041/min on g4dn.xlarge versus $0.0520/min on GitHub-hosted GPU.[^benchmarks]
- **Up to 89% higher single-thread CPU performance:** m8azn runners score 4,299 versus 2,269 for GitHub-hosted Linux.[^benchmarks]
[^benchmarks]: Prices are US East spot comparisons with a 30 GB gp3 root volume. CPU figures are PassMark single-thread scores. AWS prices change; use the [live calculator](https://runs-on.com/pricing/#runners) for your region and workload.
## Why RunsOn
- ✅ **Faster.** Choose high-frequency EC2 families instead of accepting the fixed CPUs behind GitHub-hosted runners.
- ✅ **Cheaper.** Pay spot or on-demand AWS rates with no per-minute markup—often 5–13× less than GitHub-hosted runners.
- ✅ **Simpler.** Deploy one CloudFormation stack or Terraform module. RunsOn launches a fresh runner for every job and scales back to zero.
- ✅ **Compatible.** Use [Linux AMIs built from GitHub's full runner images](https://runs-on.com/docs/runners/platforms/#linux), refreshed every 15 days, so existing actions and toolchains keep working. Bring your own AMI when needed.
## Why platform teams choose RunsOn
- **Keep AWS as the policy boundary.** The control plane, runners, cache, and GitHub credentials stay in your account, under your IAM and network controls.
- **Standardize without constraining.** Publish approved runner shapes for common workloads while preserving access to specialized hardware and images.
- **Make CI cost observable.** Export telemetry with OpenTelemetry, inspect per-job costs, and enforce AWS budgets.
## Choose who owns your runner control plane
### RunsOn: own the AWS boundary
Keep the control plane, runners, cache, credentials, and bill in your AWS account. RunsOn handles the runner lifecycle without adding a Kubernetes cluster, controller, autoscaler, or runner-image pipeline.
### ARC: own a Kubernetes runner platform
ARC fits Kubernetes-first teams that want runner pods beside other cluster workloads. Your team operates the cluster, controller, autoscaling, and runner images.
### Hosted runner SaaS: let the provider own it
A hosted runner service operates the platform for you. In return, you accept its hardware catalog, billing model, and execution trust boundary.
[Compare RunsOn and ARC in detail.](https://runs-on.com/alternatives-to/actions-runner-controller/)
## Choose who controls runner selection
Use **Flex** when workflow authors should choose the runner for each job. Use **Fleet** when the platform team should publish an approved runner catalog.
Flex and Fleet use separate control-plane deployments. They can run in the same AWS account and share one license. Standardize common workloads with Fleet, then use Flex where a job needs something different. [Compare Flex and Fleet.](https://runs-on.com/docs/flex-vs-fleet/)
### Flex: describe the runner in the workflow
A Flex label can select compute, image, storage, networking, and optional capabilities for one job:
```yaml
# .github/workflows/ci.yml
jobs:
build:
runs-on: runs-on=${{ github.run_id }}/family=c8a+m8a/cpu=4/ram=8+16/image=ubuntu24-full-x64/extras=s3-cache/volume=100gb:gp3
steps:
- uses: actions/checkout@v7
- run: make test
```
This job requests 4 vCPUs, 8–16 GB of RAM, either the c8a or m8a family, a GitHub-compatible full Ubuntu image, S3 caching, and a 100 GB gp3 volume. Other jobs can request a GPU, ARM64, a custom AMI, a static IP, or private networking in the same way.
[See every Flex label.](https://runs-on.com/docs/runners/labels/)
### Fleet: publish an approved catalog
The platform team defines named runner shapes and capacity limits as Terraform inputs:
```hcl
# fleet.auto.tfvars
runners = {
linux-build = {
cpu = 4
ram = [8, 16]
family = ["c8a", "m8a"]
image = "ubuntu24-full-x64"
extras = ["s3-cache"]
}
}
fleets = {
linux-build = {
timezone = "UTC"
runner = "linux-build"
runner_group = "platform"
max_runners = 200
}
}
```
Workflow authors select the published fleet by name:
```yaml
# .github/workflows/ci.yml
jobs:
build:
runs-on: runs-on/fleet=linux-build/env=production
steps:
- uses: actions/checkout@v7
- run: make test
```
Only the Terraform catalog can change the fleet's CPU, image, cache, runner group, or capacity. Fleet is in early access; pin an exact Terraform module version before rolling it out broadly.
[See the Fleet installation guide.](https://runs-on.com/installation/fleet/)
## Get started
Choose who should control runner shapes, then move one workflow:
1. **Choose the operating model.** Use Flex when workflows should choose their own labels, or publish a Fleet catalog for centralized control.
2. **Deploy into your AWS account.** Install [Flex with CloudFormation](https://runs-on.com/installation/flex/) or the [Terraform/OpenTofu module](https://registry.terraform.io/modules/runs-on/runs-on/aws/latest), or deploy Fleet through the [Fleet installation guide](https://runs-on.com/installation/fleet/).
3. **Connect GitHub and move one job.** Complete the private GitHub App setup—or the enterprise PAT setup for Fleet—then update the workflow's `runs-on` value.
## Built for real CI
- **Match the hardware to the workload.** Run [Linux](https://runs-on.com/docs/runners/platforms/#linux), [Windows](https://runs-on.com/docs/runners/platforms/#windows), ARM64, and [GPU](https://runs-on.com/docs/runners/platforms/#gpu) jobs.
- **Cut compute costs without making jobs fragile.** Use [spot instances with on-demand fallback](https://runs-on.com/docs/costs/spot-pricing/).
- **Skip runner-image maintenance—or keep your own.** Use public runner-image AMIs or [bring your own AMI](https://runs-on.com/docs/runners/custom/).
- **Reuse expensive build work.** Choose the built-in [S3 cache](https://runs-on.com/docs/performance/caching/actions/), Docker pull-through cache, EFS, or EBS sticky disks.
- **Observe usage and control spend.** Export [telemetry with OpenTelemetry](https://runs-on.com/monitoring/opentelemetry/), use CloudWatch, inspect per-job cost estimates, and enforce AWS budgets.
- **Fit your network and access model.** Use private networking, multi-AZ deployment, [static IPs](https://runs-on.com/docs/runners/capabilities/static-ips/), and controlled SSH access.
## Pricing and licensing
RunsOn offers a **15-day commercial trial**, **free non-commercial use**, and a **flat annual license from €300/year**. EC2, EBS, and S3 stay on your AWS bill, at cost. [Review pricing and licensing.](https://runs-on.com/pricing/)
This public repository contains MIT-licensed CloudFormation assets and supporting files. The RunsOn server and agent are commercially licensed. See [SPONSORSHIP.md](SPONSORSHIP.md) and [current pricing](https://runs-on.com/pricing/) for source-access terms.
[Start a 15-day trial.](https://runs-on.com/pricing/)