Here’s a GitHub Self-Hosted Runners FAQ you can use as a quick reference or to share with your team:
GitHub Self-Hosted Runners – FAQ
1. What is a self-hosted runner?
A self-hosted runner is a machine you set up and maintain that runs GitHub Actions workflows. Unlike GitHub-hosted runners (ephemeral, managed by GitHub), self-hosted runners give you full control over hardware, OS, network, and installed tools.
2. Why use a self-hosted runner?
- Custom environments – install specific tools, SDKs, or dependencies.
- Private networking – access to internal systems (databases, APIs).
- Cost optimization – avoid GitHub’s per-minute billing on hosted runners.
- Performance – use faster hardware, GPUs, or larger memory machines.
- Compliance/security – keep builds and data within your controlled environment.
3. Where can I install self-hosted runners?
- On-prem servers
- VMs (AWS, Azure, GCP, etc.)
- Kubernetes clusters (via Actions Runner Controller – ARC)
- Even edge devices (Raspberry Pi, ARM systems, etc.)
4. How do I register a self-hosted runner?
- Go to your GitHub repository / org / enterprise → Settings → Actions → Runners.
- Click New self-hosted runner, select OS/arch, and copy the registration token + command.
- Run the commands on your machine:
./config.sh --url https://github.com/<org>/<repo> --token <TOKEN> ./run.sh - (Optional) Install as a service for automatic startup.
5. Are self-hosted runners shared across repos?
- Repository-level – runner only available for that repo.
- Organization-level – available to all repos in the org.
- Enterprise-level – available to all orgs in an enterprise account.
6. Do self-hosted runners scale automatically?
- By default, no – each runner is static.
- For scaling, use:
- Actions Runner Controller (ARC) on Kubernetes.
- Cloud autoscaling scripts (start/stop VMs).
- Third-party solutions (Terraform modules, GitHub Actions Runner Scale Sets).
7. How do I secure self-hosted runners?
- Run in ephemeral mode (one job per runner, auto-cleanup).
- Use network isolation (VPC, firewall rules).
- Regularly patch OS and dependencies.
- Restrict access via labels (only trusted workflows can target runners).
- Store secrets in GitHub Secrets or HashiCorp Vault, not on the runner itself.
8. What OS and architectures are supported?
- Linux (x64, ARM64, ARM32)
- Windows (x64)
- macOS (x64, ARM64/Apple Silicon)
- Experimental: custom builds for other archs
9. Can I use Docker with self-hosted runners?
Yes. Options:
- Run jobs inside Docker containers on the runner.
- Run the runner itself inside a container.
- Use Kubernetes + ARC for containerized scaling.
10. How does billing work?
- No runner usage fees from GitHub.
- You pay only for the infrastructure where the runner runs (your VM, on-prem server, etc.).
- Still subject to GitHub Actions limits (e.g., job concurrency per plan).
11. What happens if a runner goes offline?
- GitHub marks it as offline.
- Jobs targeting that runner will stay queued until it comes back, or until another matching runner picks them up.
- Use monitoring (Prometheus, Datadog, GitHub webhooks) for health checks.
12. Best practices?
- Use ephemeral runners for untrusted repos.
- Tag runners with labels (
linux,gpu,arm,prod). - Automate runner lifecycle with IaC (Terraform, Ansible).
- Keep secrets & credentials external.
- Monitor and auto-replace unhealthy runners.
When you ask, “What are the status of GitHub self-hosted runner”, you’re likely curious about what runner statuses exist and how to check or interpret them.
Runner Status Types
GitHub supports three main statuses for self-hosted runners:
- Idle – Runner is connected to GitHub and is ready to take on jobs.
- Active – Runner is currently executing a job.
- Offline – Runner is not connected (e.g. machine down, runner application stopped, or communication issue) (GitHub Docs).
These statuses are visible in the GitHub UI under Settings → Actions → Runners, whether at the repository, organization, or enterprise level (GitHub Docs).
How to Check Status via GitHub REST API
You can also retrieve runner status programmatically using GitHub’s REST API:
- For a repository –
GET /repos/{owner}/{repo}/actions/runners
The response includes each runner’sstatus(e.g.,online,offline) along with details likeid,name,os, and whether it’sbusy(GitHub Docs, Orchestra). - For an organization –
GET /orgs/{org}/actions/runners
Returns similar details across all runners in the organization (GitHub Docs, Orchestra).
The REST API status field may use slightly different terminology (e.g. online or offline) but maps directly to the UI’s Idle, Active, or Offline states.
Health & Connectivity Checks
To further troubleshoot or check connectivity:
- Run the runner’s config script with
--check, supplying--urland--pat, to validate network access to GitHub and seePASS/FAILoutputs (GitHub Docs). - On the runner machine:
- Linux/systemd:
sudo journalctl -u actions.runner.<org>-<repo>.<runnerName>.service -f - **macOS/**launchd or Windows/PowerShell: use system service tools to check the service state or logs (GitHub Docs).
- Linux/systemd:
Summary Table
| Status Source | Status Value | Meaning |
|---|---|---|
| GitHub UI | Idle | Runner connected and ready |
| GitHub UI | Active | Runner currently executing a job |
| GitHub UI | Offline | Runner disconnected or unreachable |
REST API (status) | online/offline | Corresponds to Idle or Offline |
| Runner service tools/logs | – | Indicate if the runner service is running or encountering errors |
I’m a DevOps/SRE/DevSecOps/Cloud Expert passionate about sharing knowledge and experiences. I have worked at Cotocus. I share tech blog at DevOps School, travel stories at Holiday Landmark, stock market tips at Stocks Mantra, health and fitness guidance at My Medic Plus, product reviews at TrueReviewNow , and SEO strategies at Wizbrand.
Do you want to learn Quantum Computing?
Please find my social handles as below;
Rajesh Kumar Personal Website
Rajesh Kumar at YOUTUBE
Rajesh Kumar at INSTAGRAM
Rajesh Kumar at X
Rajesh Kumar at FACEBOOK
Rajesh Kumar at LINKEDIN
Rajesh Kumar at WIZBRAND