How to Scale Self-Hosted Runners to Zero When Idle
Scaling to zero means paying for compute only while jobs run, which is the biggest lever on self-hosted CI cost.
With ephemeral runners you can drop to zero capacity when the queue is empty and spin back up on the next job. In ARC set minRunners: 0. For VM-based fleets, set a short idle timeout so an unused instance terminates itself. The tradeoff is cold-start latency on the first job after idle.
Steps
- For Kubernetes: set
minRunners: 0on the ARC scale set. - For VMs: give each idle runner a short idle timeout so it self-terminates.
- Accept a small cold-start delay, or keep a tiny warm pool for latency-sensitive queues.
ARC scale-to-zero
values.yaml
minRunners: 0 # no warm pods when the queue is empty
maxRunners: 50 # burst ceiling when jobs arriveGotchas
- Scale-to-zero saves the most money but adds cold-start latency to the first job after an idle period.
- A managed self-healing runner service can absorb this scale-to-zero pattern for you; keep evaluation neutral and measure the cold-start impact on your queues.
Related guides
How to Control Self-Hosted Runner CostKeep self-hosted runner bills predictable with an idle timeout, a hard max-runners ceiling, spot instances, a…
How to Use a Warm Pool to Cut Runner Cold StartsKeep a small warm pool of idle runners ready so jobs start immediately instead of waiting for a machine to bo…