Skip to main content
The Orka GitHub runner provisions ephemeral macOS runners for GitHub Actions as Orka VMs. Runners scale up when jobs are queued and are torn down afterward, so you’re not paying for idle VMs between builds and every job starts from a known, clean image. The runner authenticates to GitHub as a GitHub App (or, for enterprise-level registration, a personal access token) and to Orka with a service account token. It runs as a standalone container, not a Jenkins-style plugin, so you deploy it as a long-running process with connectivity to both GitHub and your Orka cluster. New to Orka? See how teams use it for CI/CD.
This integration releases independently of Orka and is compatible with Orka 3.x. Check the releases page for the current version.

Prerequisites

Have all of these in place before step 1.

Setup steps

1. Create a service account and VM config

Save the token from the first command and the VM config name for step 3.

2. Set up your GitHub App

Follow Creating a GitHub App and note the App ID, installation ID, and private key. If you’re registering at the enterprise level instead, skip this and use a classic PAT with the admin:enterprise scope. Use a dedicated service account for it and rotate it on a schedule, since it’s long-lived and broadly privileged.

3. Configure environment variables

At minimum you need GitHub auth, GITHUB_URL, ORKA_URL, ORKA_TOKEN, ORKA_VM_CONFIG, and a RUNNERS definition:
The name in RUNNERS must match the runs-on label your workflows target. GITHUB_APP_PRIVATE_KEY_PATH is read inside the container, so it’s the path you mount the key to in step 4 (/secrets/github-app.pem in these examples), not the key’s location on your host. See the full variable reference below, and an example .env file here.
The GitHub App private key must be PKCS#1 RSA format. If your key doesn’t work, convert it with ssh-keygen -p -m pem -f <PATH_TO_KEY>.

4. Run the container

Either pass environment variables directly:
Or mount a .env file:
If you’re running this inside MacStadium, 2 vCPU / 15GB of Private Cloud x86 compute is enough to host the container itself, billed as part of your VPC services.

5. Run a test workflow

Point a workflow at the runner label from your RUNNERS config:
A successful run confirms the whole chain: GitHub auth, Orka connectivity, VM deployment, and job pickup.

Configuration reference

GitHub authentication

Orka connection

Runner behavior

Metrics (optional)

GitHub Enterprise Server (GHES)

Set GITHUB_URL to your enterprise instance (for example https://github.enterprise.com/my-org), and provide either a GITHUB_TOKEN with permission to pull the runner release from github.com, or pin GITHUB_RUNNER_VERSION to avoid contacting github.com at startup entirely. GHES is detected automatically from GITHUB_URL.

Multiple runners

Only one runner scale set is supported per running instance. For multiple scale sets, run multiple instances of the container, each with its own RUNNERS value and a unique runner name.

Beyond a single runner pool

A few things worth knowing about as your usage grows:
  • Observability. Set ENABLE_METRICS=true to get Prometheus metrics on scale-set state (available jobs, busy/idle runners) at METRICS_ADDR, useful for building dashboards or alerts on top of your runner fleet rather than guessing at capacity.
  • Custom VM images. ORKA_VM_CONFIG points at any VM config you’ve created with orka3 vmc create, so you’re not limited to a base image. Build one with your own tooling pre-installed to cut per-job setup time.
  • Image caching. If cold starts on a new image are slow, see Image Caching to pre-cache images on specific nodes ahead of time.
  • Burst capacity. If your fixed node pool isn’t enough during peak build periods, Orka Burst adds on-demand elastic capacity without a long-term hardware commitment.

Troubleshooting

Support

Open a ticket in the MacStadium Portal and include the runner container’s logs (LOG_LEVEL=debug if possible).