awesome-runners 🏃
A curated list of awesome self-hosted GitHub Action runner solutions in a large comparison matrix
Purpose
The purpose of this repository is to provide an overview on self-hosted runner solutions for GitHub Actions compared by various criteria. There is no rating implied as the importance of the various categories differ from use case to use case. Data can be out of date, so if a certain feature is told to be missing, please double check whether this is still the case.
General collection of self-hosted runner best practices
During my research, I stumbled over dduzgun-security/github-self-hosted-runners with ✨ tips ✨ on what to consider when using self-hosted runners by yourself.
A word about self-hosted action runner images / virtual environments and how to test locally
The virtual environments provided by GitHub Action managed runners like ubuntu-latest
contain a LOT of pre-installed tools already. If all of those tools were installed in your self-hosted runner, this would result in images > 18 GB. In many cases where you have a better picture for which purposes/platforms you will use your self-hosted runners, this is probably not what you want for performance and maintenance reasons. All of the self-hosted solutions compared allow to define custom images with custom tooling.
If you like to test your custom images with your Actions workflows locally before you expose them to your end users at large scale, you can use nektos/act to specify your own Docker image for a specific runner label using the -P option, see a more complex example here.
The matrix (might be better readable on GitHub pages)
Solution name | Runtime | GHES | RegScope | Scaling | AutoScaling | Architecture | AutoDereg | PATInRunner | CleanUp | Privileged | Exposed | AllInOne | SelfService | IdleCosts |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
actions/actions-runner-controller | k8s | ✅ | Enterprise, Org, Repo, Labels, RunnerGroups | k8s manifests & dynamic scaling | ✅ (pending + running jobs or percentage runners already busy, check run events, scale up/down and flapping prevention parameters) | x86, AMD64, ARM, ARM64 | ✅ | no | yes (if ephemeral option is used) | yes (install time, optional DinD) | only if github-webhook autoscaler is used | no | yes (IssueOps project available) | actions-runner controller + at least one pod per org runner |
philips-labs/terraform-aws-github-runner | AWS EC2/Lambda for Linux and Windows VMs | ✅ | Org, Repo, Labels, RunnerGroups | Terraform config & dynamic scaling | ✅ (pending jobs in org/repo, scale up/down and flapping prevention parameters) | x86, AMD64, ARM, ARM64 | ✅ | no | yes (if ephemeral option is used) | no | yes (GitHub check_run events) | yes (at least intended this way) | yes (IssueOps project available) | no (only Lambdas, KMS, queue service, API gateway) |
myoung34/docker-github-actions-runner | Docker | ✅ | Org, Repo, Labels, RunnerGroups | docker-compose, Nomad & k8s examples | ❌ | x86, ARM64, ARM | ✅ | yes | no | yes (DinD) | no | no | no | no |
evryfs/github-actions-runner-operator | k8s | ✅ | Organization, Repo | yes (k8s manifests define max and min) | ✅ scales up to min runners ASAP, then adds one runner at a time up to max if all current runners are busy, scales down idle runners up to min | x86 | ✅ | no | yes (ephemeral from v0.10.0) | yes (install time, optional DinD) | no | no | no | actions-runner controller |
MonolithProjects/ansible-github_actions_runner | bare metal/VM | ✅ | Organization, Repo, Labels | based on Ansible playbook | ❌ | x86, AMD64, ARM, ARM64 | explicitly in playbook | no | no | install Ansible agents | Ansible agents | possible | no | Ansible agents |
SanderKnape/github-runner | Docker | ❌ | Org, Repo, Labels | k8s manifest example | ❌ | x86 | ✅ | yes | no | no | no | no | no | no |
machulav/ec2-github-runner | AWS EC2 | ❌ | Repo | GitHub Actions workflow params | ✅ (1 runner per workflow run that requests it) | x86 | part of Actions workflow | no | yes (ephemeral) | no | embedded in GitHub Action workflow | possible | yes (Actions Workflow) | no |
terraform-google-modules/terraform-google-github-actions-runners | k8s (GKE), Docker, VMs (GCE) | ❌ | Repo | Terraform config/k8s manifests | only on k8s, based on generic pod CPU consumption (HPA metric) | x86 | only worked for Docker | yes | no | no | no | VMs could be configured like this | no | at least one idle runner to allow HPA to kick in based on CPU consumption |
github-developer/self-hosted-runners-anthos | k8s (Anthos GKE) | ❌ | Repo | Terraform config/k8s manifests | only on k8s, based on generic pod CPU consumption (HPA metric) | x86 | ✅ | yes | no | yes, for DinD (can be turned off) | no | no | no | at least |