Skip to main content
A cold machine takes a minute or two to boot, install the runner and register with GitHub. idle: removes that wait by keeping runners ready in advance.
airship.yaml
It is still one job per machine. A pool runner that takes a job is replaced straight away, so the pool stays at its size and no machine ever runs two jobs.
Do not use a --${{ github.run_id }} suffix with a pooled label. Idle runners exist before the run does, so they cannot carry its ID and a suffixed label will never match one.

Three shapes, pick exactly one

A fixed number, always.
The simplest and the most expensive: two machines are alive and billed around the clock. Right for the one repository everybody waits on.

What it costs

Idle machines are running machines: your cloud bills them while they wait. The levers:

How a pool is maintained

1

Read from the default branch

Unlike everything else in airship.yaml, idle: is read from the repository’s default branch — pools exist before any job, so there is no commit to read them from. A push to the default branch updates them within a reconcile pass.
2

Replaced halfway through their lifetime

An idle runner is replaced after half the maximum machine lifetime (four hours by default), so a job that takes one still has the other half before the machine’s own deadline.
3

Replaced the moment one is taken

A pool runner that gets a job is replaced immediately, so the pool is back at size before the next job arrives.
4

Paused when launches keep failing

Three failures and the pool pauses for ten minutes, so a bad definition or an exhausted quota does not spin.
A pool runner reserved for a queued job has its wait measured from the moment it was reserved, not from its launch — so a machine that has been warm for hours is not written off as idle the instant a job reserves it.

Organization-wide pools

Idle runners defined in airship.global.yaml are shared: they register on the organization, in a runner group named airship-<runner name> visible to every activated private repository — or only to the repositories that runner’s access policies name. Any such repository can take one.
airship.global.yaml
This needs the GitHub App’s organization Self-hosted runners write permission. See Organization-wide runners.

Where to see them

The Runners page shows pool runners alongside job runners, and the dashboard has a pools view with each pool’s target and current size. A pool that is persistently under its target is almost always a quota or a capacity problem — Events will have your cloud’s message.

Shorten the cold start too

A pool hides the cold start; a baked image removes most of it. Together, even an empty pool starts jobs in seconds.