Skip to main content
This walks the shortest path to a green job: AWS, one machine type, no caching. Everything here applies to Google Cloud and Azure too — only the credential differs.
You need admin on a GitHub organization (to install the app and activate a repository) and permission to create a credential in a cloud account. Those are often two different people.

Install the GitHub App

Sign in at app.airshipci.com and install the Airship app on your organization. Grant it one repository to start — you can add more later without reinstalling.The app asks to read airship.yaml, to read job and runner metadata, and to register and remove runners. It never gets your Actions secrets. What each permission is for.

Create a cloud credential

In AWS, create an IAM user with an access key. The quick version is AmazonEC2FullAccess:
Keep the output. You paste it once and Airship never shows it again.
In an account shared with production workloads, use the scoped policy in Amazon Web Services instead. Its terminate permission is conditioned on Airship’s own tag, so the credential cannot destroy a machine it did not create.

Connect the cloud

Open Cloud → AWS in the dashboard, paste the access key ID and secret, and pick the default region — where runners launch when a definition names none.Airship verifies the credential with the cloud before storing it, and shows you the account ID and principal it belongs to so you can confirm it is the one you meant.

Activate the repository

Open Repositories and switch your repository on.This is deliberately separate from installing the app: an airship.yaml in a repository nobody activated launches nothing, so a config file can never start spending money on its own.

Commit a runner definition

Add airship.yaml to the repository root:
airship.yaml
Then point a job at it:
.github/workflows/ci.yml
The --${{ github.run_id }} suffix makes the runner register under a label unique to that workflow run, so GitHub can only hand it a job from that run. Use it everywhere except with idle runners, which exist before a run does.
Repositories has a config checker that validates a file and shows the machines it would plan. Cheaper than a push.

Push, and watch it happen

The first job in a repository usually waits a minute or two for the machine to boot and register. Idle runners remove that wait; a custom image shortens it.

If the job stays queued

The Jobs page says why in plain words — Not activated, No cloud, No runner serves the labels, Config problem. Each reason and its fix is in Troubleshooting. The Events page carries your cloud’s own error message when a launch fails.

Worth doing in the first week

Set a concurrency cap

max_runners is the one number that bounds total spend. Set it below your cloud’s vCPU quota.

Cancel a job mid-run

Then check that no machine survives it. That behaviour is what everything else rests on.

Turn on cache acceleration

One line of config, and actions/cache starts reading from a bucket in your account.

Add spot with a fallback

Try spot first, fall back to on-demand, and let Airship walk the list.