Skip to main content
instance_type is your cloud’s own name for a machine shape. Airship does not invent a size vocabulary of its own, so anything your account can launch, you can ask for.
Any EC2 instance type: c7i.xlarge, m8g.4xlarge, r7iz.metal-32xl, mac2-m2.metal, u7i-12tb.224xlarge.
A list tries each in order; see Fallbacks. That is the usual answer to a capacity shortage in one family.

Architecture is inferred, not declared

There is no arch field. Airship reads the architecture from the instance type and picks the matching default image, runner build and driver path: The runner registers with arm64 or x64 as a label, so a job can ask for one specifically:
A custom image built for the wrong architecture is refused at planning time rather than failing at boot. If you keep per-architecture images, give each one its own definition.

GPUs

gpu: means “this runner has a GPU”. It adds the gpu label, and on Ubuntu images that lack one it installs the NVIDIA driver. What the value means depends on the cloud:
The name is a flag — the instance type decides the hardware. Pick a GPU instance family and name the GPU you expect:
An image that already ships the driver — a deep-learning AMI, for instance — needs no installation; Airship detects one and leaves it alone.
GPU quotas are usually zero until you request an increase, and GPU stock is zonal — pin a zone so a shortage fails fast instead of walking a whole region. To turn a GPU off in a definition that inherits one, set gpu: false.

Host maintenance

On Google Cloud, extra_config.scheduling decides what happens when the host your runner sits on needs maintenance:
MIGRATE is the default for machines that can do it. TERMINATE is the default — and the only option — for GPUs and spot, so MIGRATE together with preemptible or a GPU is a config error rather than a launch Compute Engine would refuse.

How long a machine may live

Every machine schedules its own shutdown before anything else runs: eight hours by default. A runner that reaches it finishes as max_lifetime. A launched runner that no job arrives for within ten minutes finishes as idle — almost always a label mismatch.

Choosing a size

Start one size up from habit

CI is usually bound by one slow step. Doubling the cores on a make -j build is often cheaper per job, not more expensive, because the machine lives for half as long.

Then fix the disk

A fast instance on a default volume is disk-bound. Raise throughput and IOPS before reaching for more cores. Disks

Spot for everything repeatable

With an on-demand fallback behind it, spot costs a retry now and then. Fallbacks

Arm where your toolchain allows

Graviton and Arm families are usually the best price per unit of work, and the runner labels let you split a matrix across both.