No results found.

Run unlimited CI jobs. Pay nothing per minute.

Self-hosted GitHub Actions and Bitbucket runners that register themselves, accept jobs, and exit cleanly. No Kubernetes required.

docker service scale ci-runners=10 Read the docs on GitHub bitbucket-pipeline-runner

GitHub Actions and Bitbucket Pipelines, on Docker Swarm or Compose. No Kubernetes cluster required.

docker service scale ci-runners=10 10 listening
runner-a1b2c3github actions, myorglistening
runner-d4e5f6github actions, myorglistening
runner-g7h8i9bitbucket pipelineslistening
runner-j1k2l3job finishedexiting

Runners register themselves on start and deregister on exit, so scaling down leaves nothing behind in the CI settings.

£0 per-minute cost once the containers are yours
2 platforms, GitHub Actions and Bitbucket
No Kubernetes cluster to maintain
GitHub Hosted Runners
Self-Hosted (This Tool)
Monthly cost (high volume)
£1,000+/month
Compute cost only ~100% savings
IP-restricted deployments
VPN required
Native support
Infrastructure required
None (GitHub manages)
Docker only
Kubernetes required
No
No
Scale mechanism
GitHub concurrency limits
docker service scale

How it works

  1. 1

    Deploy the runner container with your token

    Pass your GitHub organisation name and a runner registration token as environment variables. The container self-registers with GitHub on startup.

    docker run -d \
      -e GITHUB_ORG=myorg \
      -e RUNNER_TOKEN=xxx \
      ghcr.io/samjuk/github-actions-runner:latest
  2. 2

    Scale up or down as your workload demands

    Run as many instances as you need. Each container registers as a separate runner and picks up jobs independently. Use Docker Swarm, Compose, or plain Docker.

    docker service scale github-runners=10
  3. 3

    Runners clean up after themselves

    When a container stops, whether you scale down or the orchestrator terminates it, it deregisters from GitHub automatically. No stale runners, no manual cleanup.

Common questions

Is this the same as GitHub Actions Runner Controller (ARC)?

No. ARC is a Kubernetes operator, which is powerful but requires a Kubernetes cluster. This is a plain Docker image designed for teams running Docker Swarm or Compose who want self-hosted runners without the Kubernetes overhead.

What happens if a runner container crashes mid-job?

GitHub will re-queue the job for another available runner. The container's shutdown hook attempts deregistration, but GitHub also handles stale runners automatically after a timeout.

Does each job get a clean environment?

Yes, runners operate in ephemeral mode by default. Each container picks up exactly one job then exits, preventing any environment pollution between builds.

Does this work for Bitbucket Pipelines too?

Yes, there is a separate image for Bitbucket with identical register and deregister behaviour. Both images are maintained and share the same approach.

What compute do I need to run this?

Anything with Docker installed. A single VM, a Docker Swarm cluster, or a few Compose instances, whatever you already have. The runner image itself is lightweight; the compute requirement depends entirely on what your CI jobs do.

Your CI costs shouldn't scale with your team.

Self-host your runners with one Docker command. Bitbucket and GitHub both supported.