Heata Runners: Client Onboarding Guide
Overview
Heata Runners are hosted GitHub Actions runners that execute your CI/CD workflows on Heata's infrastructure. Your jobs run in fully isolated, ephemeral runners that are created fresh for every job and destroyed immediately after.
Switching to heata takes about 10 minutes. Switching back to your previous set up takes just a few minutes.
Prerequisites
- A GitHub organisation (Free, Team, or Enterprise plan)
- Admin access to the organisation
- One or more repositories with GitHub Actions workflows
- Your runner label prefix (provided by Heata during onboarding)
Step 1: Install the Heata Runner App
- Go to https://github.com/apps/heata-runners/installations/new
- Select your GitHub organisation
- Choose which repositories the App can access:
- All repositories if you want all repos to be able to use Heata runners
- Only select repositories if you want to start with specific repos
- Click Install
- After installation, you'll be redirected to a page with a URL like:
https://github.com/organizations/yourorg/settings/installations/12345678Send the number at the end of this URL (your installation ID) to your Heata contact. We need it to connect your runners.
That's it. No API keys, no SSH keys, no tokens to manage. The GitHub App handles all authentication automatically.
What permissions does the App need?
The Heata Runner App requires: - Actions: Read-only (to see when workflows are queued) - Self-hosted runners: Read & write (to register ephemeral runners for your org)
The App does not have access to your code, secrets, issues, pull requests, or any other repository content. It can only manage runner registrations.
Step 2: Update your workflow files
Change the runs-on value in your workflow files from a GitHub-hosted runner to a Heata runner.
jobs:
build:
runs-on: yourprefix-heata-standard
steps:
- uses: actions/checkout@v4
- run: npm install
- run: npm test
Replace yourprefix with the label prefix we provided during onboarding.
Available runner sizes
For simplicity of getting started we provide three tiers. If you have specific needs, please talk to us about custom configurations.
| Tier | vCPU | RAM | Storage | Price/Min | GitHub Equiv. | Savings | Ideal Use Case |
|---|---|---|---|---|---|---|---|
| heata Slim | 2 | 5 GB | 30 GB | £0.0007 | ubuntu-slim |
~53% | Linting, small unit tests, and lightweight automation |
| heata Standard | 4 | 8 GB | 50 GB | £0.0030 | ubuntu-latest |
~32% | Docker builds and heavy integration tests |
| heata Large | 8 | 32 GB | 100 GB | £0.0059 | linux-4-core |
~34% | Large-scale data processing and monolithic builds |
Every tier offers double the vCPU compared to the equivalent GitHub-hosted runner. heata Large also doubles the RAM versus GitHub's 4-core runner.
Examples:
runs-on: yourprefix-heata-slim # lightweight jobs
runs-on: yourprefix-heata-standard # recommended — general purpose
runs-on: yourprefix-heata-large # resource-intensive jobs
You can use different sizes for different jobs in the same workflow:
jobs:
lint:
runs-on: yourprefix-heata-slim
steps:
- uses: actions/checkout@v4
- run: npm run lint
build:
runs-on: yourprefix-heata-large
steps:
- uses: actions/checkout@v4
- run: npm run build
test:
runs-on: yourprefix-heata-standard
steps:
- uses: actions/checkout@v4
- run: npm test
Step 3: Push and verify
- Commit and push the updated workflow file
- Go to the Actions tab in your repository
- You should see your workflow running on a Heata runner
- The runner name will appear as something like
heata-runner-a3f8in the job log
The first runs may take longer than usual while first downloads occur. Subsequent runs benefit from warm caches and should be faster.
That's it
There is no step 4. Your workflows now run on Heata's low-carbon infrastructure.
Optional: Faster caching
Heata runners include a high-speed local cache service on the same physical machine as your runners. To take advantage of it, you can replace actions/cache with our cache action:
Before
- uses: actions/cache@v4
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
After
- uses: heata-run/cache@v1
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
This is a drop-in replacement. Same syntax, same parameters. The difference is that cache data is stored on local storage rather than GitHub's servers, making cache save/restore significantly faster and with no 10 GB size limit.
Note: The standard
actions/cachestill works on Heata runners. Our cache action is an optional performance upgrade, not a requirement.
Switching back to GitHub-hosted runners
If you ever need to switch back, change runs-on back to a GitHub-hosted runner:
runs-on: ubuntu-latest
That's the only change needed. There are no dependencies, lock-in, or cleanup steps. Your workflows are standard GitHub Actions and work identically on any runner.
Pre-installed software
Heata runners come with the following pre-installed:
- OS: Ubuntu 24.04 LTS
- Docker: Docker Engine + Docker Compose + Buildx
- Node.js: Latest LTS (via nvm)
- Python: 3.11+ with pip
- Go: Latest stable
- Java: OpenJDK 17
- Build tools: make, cmake, gcc, g++
- CLI tools: git, curl, wget, jq, zip, unzip, gh (GitHub CLI)
Need something else? Additional tools can be installed in your workflow using standard apt-get, npm install -g, pip install, etc. - or let us know if you'd like something added to the base image.
FAQ
How are my workflows kept secure?
Each client's runners operate within their own dedicated, isolated virtual machine, fully separated from all other clients. Within that VM, every job gets a fresh, ephemeral runner that is: - Created from a clean image for each job - Completely destroyed after the job finishes - Unable to access any other client's workloads or data
Your secrets are injected by GitHub directly into the runner, just like with GitHub-hosted runners. Heata never has access to your repository secrets.
Can I use this across multiple repos?
Yes. When you install the GitHub App, you choose which repositories can use Heata runners. Any workflow in those repos can use your yourprefix-heata-* labels. No per-repo setup is needed.
What happens if a runner goes down mid-job?
GitHub will mark the job as failed, and you can re-run it from the Actions tab. The Heata orchestrator automatically cleans up the runner. This is the same behaviour as GitHub-hosted runners.
Is there a concurrency limit?
Yes, your organisation has a configurable maximum number of concurrent runners. Speak to your Heata contact to adjust this. Jobs that exceed the limit are queued and will start as soon as a slot becomes available.
How fast do runners start?
Runners typically boot and are ready to pick up a job within 15-30 seconds of the workflow being triggered. Subsequent runs benefit from local Docker image caching, package manager caching, and warm build caches.
Can I keep using some workflows on GitHub-hosted runners?
Absolutely. You can mix and match. Some jobs can use runs-on: ubuntu-latest (GitHub-hosted) while others use runs-on: yourprefix-heata-standard (Heata) in the same workflow file.
What regions are runners available in?
Heata runners are hosted in the UK and can be used from anywhere in the world. GitHub Actions traffic routes over GitHub's own network, so your workflows will work regardless of where your team is located.
Support
If you have questions or run into issues:
- Email: techsupport@heata.co
- Slack: We can set up a shared channel with your team
- Response time: Within 4 business hours for production issues