GitHub Actions vs GitLab.com hosted runners
Both are CI services that give each job a fresh VM and throw it away when the job ends. GitHub Actions runs jobs from GitHub repositories for up to 6 hours, while GitLab.com hosted runners run jobs from GitLab projects for up to 3 hours.
The companies and products
GitHub Actions
GitHub Actions is GitHub's CI/CD service: workflows in your repository run as jobs on runners that GitHub hosts or that you host yourself.
GitHub Actions is a CI service, not a sandbox API. Each job on a GitHub-hosted runner gets a new VM, Linux and Windows on Azure and macOS on GitHub's own Mac fleet, with passwordless sudo, and the VM is gone when the job ends. It is built for building, testing and deploying the code in a repository, and GitHub's own Copilot cloud agent and the Claude and Codex agents on GitHub also run on Actions runners.
- Job length
- Each job can run for up to 6 hours
- Self-hosted runners
- Open-source runner under MIT; usage on self-hosted runners is free
GitLab.com hosted runners
GitLab.com hosted runners are the machines that run GitLab CI/CD jobs for projects on GitLab.com, paid for in compute minutes.
This is a CI service, not a sandbox API. Each job gets a new VM on Google Cloud (Linux and Windows) or on AWS Mac hardware (macOS), with passwordless sudo, and the VM is deleted right after the job. It is built for building, testing and deploying the code in a GitLab project, and GitLab's Duo Agent Platform also runs Claude Code and Codex agents as CI/CD jobs on these runners.
Which use cases each one fits
For each use case, Battleships prices every sandbox provider on the same workload and sorts them from the cheapest monthly bill up. “100th cheapest of 377” means 99 of the other 376 providers run that workload, with every feature it needs, for less. “With limits” means the provider runs it but misses something, so it is listed after every full match. Open a use case for its whole ranking and what each provider misses.
| Use case and its workload | GitHub Actions: price rank | GitLab.com hosted runners: price rank | bochka: price rank |
|---|---|---|---|
| Software factory 100 at once · 4 vCPU / 8 GB · 2,200 sessions of 8 h a month A software factory needs agents that keep their checkout and Docker cache between tasks, which neither a 6-hour nor a 3-hour fresh CI job gives you. | 298th of 367, with limits $5,853 a month | 347th of 367, with limits $14,454 a month | 3rd cheapest of 367 $634 a month |
| Always-on AI employees 50 machines 24/7 · 2 vCPU / 4 GB An assistant that lives on its machine all month cannot fit in jobs that end after 6 hours on GitHub or 3 hours on GitLab. | 333rd of 366, with limits $10,692 a month | 353rd of 366, with limits $21,858 a month | 5th cheapest of 366 $657 a month |
| Code interpreter bursts 100 at once · 1 vCPU / 2 GB · 200,000 sessions of 1 min a month | 294th of 345, with limits $721 a month | 320th of 345, with limits $1,896 a month | 186th of 345, with limits $2,000 a month |
| Sandboxes for your users 300 at once · 2 vCPU / 4 GB · 30,000 sessions of 23 min a month Neither takes inbound traffic, and GitHub's terms rule out offering Actions as a service, so neither is built to hand machines to your users. | 308th of 361, with limits $2,892 a month | 331st of 361, with limits $6,133 a month | Cheapest of 361 $209 a month |
| RL rollouts 1,000 at once · 2 vCPU / 4 GB · 1,000,000 sessions of 3 min a month | 304th of 360, with limits $14,721 a month | 318th of 360, with limits $29,762 a month | 34th of 360, with limits $2,000 a month |
| Agent evals 250 at once · 4 vCPU / 8 GB · 15,000 sessions of 20 min a month | 303rd of 364, with limits $1,962 a month | 330th of 364, with limits $4,758 a month | 10th cheapest of 364 $200 a month |
| CI runners 40 at once · 8 vCPU / 16 GB · 6,000 sessions of 12 min a month Both fit, and the right one is usually the one where your code lives; bochka ranks 4th here for CI that wants a warm disk or jobs past 3 or 6 hours. | 100th cheapest of 377 $1,012 a month | 128th cheapest of 377 $2,089 a month | 4th cheapest of 377 $86 a month |
| 24/7 dev boxes 1 machine 24/7 · 4 vCPU / 8 GB A dev box needs SSH, open ports and a disk that stays; hosted runners on both services have none of these. | 279th of 368, with limits $159 a month | 358th of 368, with limits $805 a month | 18th cheapest of 368 $26 a month |
| Computer-use agents 50 at once · 4 vCPU / 8 GB · 20,000 sessions of 15 min a month Runners on both are headless, while bochka gives each agent a desktop streamed at 60fps with computer use built in. | 292nd of 369, with limits $1,768 a month | 342nd of 369, with limits $4,278 a month | 6th cheapest of 369 $200 a month |
| Browser-use agents 50 at once · 2 vCPU / 4 GB · 30,000 sessions of 10 min a month | 135th of 367, with limits $942 a month | 144th of 367, with limits $2,118 a month | 7th cheapest of 367 $200 a month |
| Scraping & bots (startup scale) 50 at once · 1 vCPU / 2 GB · 100,000 sessions of 3 min a month | 134th of 346, with limits $1,184 a month | 143rd of 346, with limits $2,854 a month | 6th cheapest of 346 $90 a month |
| Mass scraping & bots (undetectable) 1,000 at once · 1 vCPU / 2 GB · 3,000,000 sessions of 2 min a month | 301st of 338, with limits $28,971 a month | 319th of 338, with limits $58,429 a month | 71st of 338, with limits $1,800 a month |
| Parallel red teaming 200 at once · 2 vCPU / 4 GB · 5,000 sessions of 30 min a month | 70th of 360, with limits $467 a month | 87th of 360, with limits $1,383 a month | 2nd cheapest of 360 $200 a month |
| GPU eval jobs 10 at once · 8 vCPU / 32 GB · 500 sessions of 30 min a month Both offer a Linux runner with an NVIDIA T4, which on GitLab needs Premium or Ultimate; bochka has no GPUs. | Can't run it | Can't run it | Can't run it |
| macOS agents 5 at once · 4 vCPU / 8 GB · 1,000 sessions of 20 min a month Both host macOS runners on Apple silicon, with GitLab's in beta and limited to Premium and Ultimate; bochka runs Linux only. | 25th of 36, with limits $1,178 a month | 24th of 36, with limits $1,069 a month | Can't run it |
Key features
| Feature | GitHub Actions | GitLab.com hosted runners | bochka |
|---|---|---|---|
| Kind of product | CI service: jobs run from workflow files in a GitHub repository | CI runners: jobs run from a GitLab project's .gitlab-ci.yml | Sandbox API: create, stop, fork and reach machines from your code |
| Isolation | New VM per job on Azure (Linux, Windows) or GitHub's Mac cloud, with passwordless sudo | New VM per job on Google Compute Engine, deleted right after; Linux jobs run in a privileged Docker container | Full VM with its own kernel on dedicated AMD Ryzen 9 9950X hosts, with root and systemd |
| Job length | Up to 6 hours per job | Up to 3 hours per job, whatever the project setting | No cap on paid plans; you set the time to live |
| Disk between runs | Fresh VM every job; files carry over only through cache, artifacts or custom images | Fresh VM every job; files carry over only through a shared cache (5 GB per archive, removed after 14 days unused) or artifacts | Disk persists, saved every minute and on stop; a stopped sandbox costs nothing |
| Fork | No; custom images are a template for new runners, not a copy of a live one | No; every job starts from a fresh VM and a container image | Fork a running sandbox with its disk |
| Nested virtualization | Yes on Linux runners, after adding the runner user to the KVM group | Not documented; privileged mode is described for Docker-in-Docker only | Yes, /dev/kvm for Android emulators and VMs |
| Inbound access | None; GitHub says hosted runners never need inbound connections | None; inbound traffic is blocked and there is no web terminal on hosted runners | SSH, HTTPS URLs for up to 50 ports, raw TCP, dedicated IPv6 or IPv4 |
| Desktop and computer use | Headless; browsers are preinstalled for tests | Headless; macOS runners do not support jobs that need UI interaction | Linux desktop streamed at 60fps, Chromium, computer use API |
| Coding agents | Copilot cloud agent, plus Claude and Codex in public preview, on issues and pull requests | Duo Agent Platform runs Claude Code, Codex, Amazon Q and Gemini from issues and merge requests, on Premium and Ultimate | Seven agents preinstalled, driven from outside any program with a prompt, steer and events API |
| Keeping API keys out of the machine | Secrets enter the job as environment variables and are hidden from logs | GitLab-managed credentials for its Claude and Codex agents only; other secrets enter as CI/CD variables | Credentials proxy for model providers and any HTTPS API; switch a credential to another account when credits run out |
| Operating systems and GPUs | Linux x64 and arm64, Windows x64 and arm64, macOS, and NVIDIA T4 larger runners | Linux x64 and Arm64, Windows (beta), macOS on Apple silicon (beta), and a Linux T4 runner | Linux x64, no GPUs |
| Jobs at once | 20 on Free, 40 on Pro, 60 on Team, 500 on Enterprise; macOS 5, or 50 on Enterprise | No published limit on how many runner VMs run at once | On the $2,000 plan, up to 600 starts an hour; starts above 90 a minute are queued |
| Regions and networking | Azure; larger runners can join your Azure network in the US, EU and APAC, with static IP ranges | Google Cloud us-east1 by default for Linux | EU only (Germany, Finland, France), open internet |
| Self-hosting | Open-source runner under MIT; usage on self-hosted runners is free | Open-source GitLab Runner under MIT; jobs on your own runners use no compute minutes | No |
Every feature Battleships tracks (43)
| Feature | GitHub Actions | GitLab.com hosted runners | bochka |
|---|---|---|---|
| Full VM (own kernel) | Yes | Yes | Yes |
| Docker inside | Yes | Yes | Yes |
| Nested virtualization | Yes | No | Yes |
| Root | Yes | Yes | Yes |
| Systemd | No | No | Yes |
| Desktop GUI | No | No | Yes |
| Browser | Yes | Yes | Yes |
| Computer-use API | No | No | Yes |
| SSH | No | No | Yes |
| Persistent disk | No | No | Yes |
| Pause/resume | No | No | Yes |
| Automatic snapshots | No | No | Yes |
| Fork/clone | No | No | Yes |
| Live fork (no pause) | No | No | Yes |
| Memory fork | No | No | No |
| Custom image (Docker or snapshot) | Yes | Yes | Yes |
| ≥24 h sessions | No | No | Yes |
| Idle auto-stop | Yes | Yes | No |
| Wake on request | No | No | No |
| HTTPS preview URLs | No | No | Yes |
| Raw TCP inbound | No | No | Yes |
| Public IPv4 | No | No | No |
| Egress allowlist | Yes | No | No |
| Secret proxy | No | Yes | Yes |
| Secret proxy for any API | No | No | Yes |
| Preinstalled agents | Yes | Yes | Yes |
| Agent harness API | Yes | Yes | Yes |
| MCP server | Yes | No | No |
| GPU | Yes | Yes | No |
| Windows | Yes | Yes | No |
| Arm64 | Yes | Yes | No |
| Self-hosting | Yes | Yes | No |
| BYOC | No | No | No |
| Open source | Yes | Yes | No |
| Scoped API keys | Not published | Not published | Yes |
| Spend limits | Yes | Not published | Yes |
| Usage per sandbox (API) | Yes | No | Yes |
| Audit logs | Yes | Yes | No |
| SSO | Yes | Yes | No |
| SOC 2 | Yes | Yes | No |
| HIPAA | No | No | No |
| EU data residency | Yes | No | Yes |
| Zero data retention | Not published | Not published | Yes |
Performance
There is no comparable measurement for GitHub Actions or GitLab.com hosted runners in the hpc-sandbox-benchmarks CPU test, so this page makes no speed claim between them. bochka did 26.69 runs per second on it at 4 vCPU / 8 GB, on dedicated AMD Ryzen 9 9950X hosts.
Node.js build-and-test loop at 4 vCPU / 8 GB, higher is better. Measured with the open hpc-sandbox-benchmarks suite. GitHub Actions and GitLab.com hosted runners have no published run in this suite yet, so there is no like-for-like number to compare.
Pricing in five scenarios
Each bill is priced from the providers' public price lists by the open Battleships engine, with the cheapest plan that runs the scenario.
| Scenario | GitHub Actions, a month | GitLab.com hosted runners, a month | bochka, a month |
|---|---|---|---|
| One coding agent, workdays 4 vCPU / 8 GB, 50 GB disk, 8 hours a day, 22 days a month, files kept between days | $80 · Team · with limits | $119 · Premium · with limits | $20 · $20/mo |
| One agent that never stops 4 vCPU / 8 GB, 50 GB disk, running 24/7 all month | $354 · Team · with limits | $805 · Premium · with limits | $26 · $20/mo |
| 50 agents in parallel 50 machines of 4 vCPU / 8 GB at once, 8-hour sessions, 1,100 sessions a month, Docker inside | $3,814 · Team · with limits | $9,491 · Premium · with limits | $317 · $20/mo × 3 seats |
| Sandboxes for your users 2 vCPU / 4 GB, 30,000 sessions of 10 minutes a month, up to 300 at once | $1,092 · Enterprise Cloud · with limits | $2,658 · Premium · with limits | $200 · $100/mo × 2 seats |
| 1,000 short jobs at once 2 vCPU / 4 GB, 1,000 at once, 3 minutes each, 200,000 jobs a month | $2,721 · Enterprise Cloud · with limits | $5,896 · Premium · with limits | $2,000 · $2000/mo · with limits |
GitHub Actions: GitHub bills per minute per job, rounding each job up to the next whole minute, from $0.006 a minute for 2-core Linux. Plans include monthly minutes (2,000 on Free, 3,000 on Team, 50,000 on Enterprise Cloud) for standard runners only.
GitLab.com hosted runners: Each job uses compute minutes equal to its run time times a cost factor, from 1 for small Linux up to 12 for the biggest machines. Plans include 400 minutes on Free, 10,000 on Premium ($29 per user a month, billed yearly) and 50,000 on Ultimate, and extra minutes cost $10 per 1,000, bought ahead of time.
GitLab.com hosted runners: Plans start at $20 a month, and the whole fee is usage credit. You pay per second while a sandbox runs, and a stopped sandbox costs nothing and keeps its disk.
Limits in those scenarios
Neither fits any of the five agent scenarios: both are CI services, nothing on the disk survives to the next job, and jobs end after 6 hours on GitHub and 3 hours on GitLab. For 1,000 short jobs at once, GitHub Enterprise Cloud stops at 500 concurrent jobs, and GitLab publishes no limit on how many runner VMs run at once, so the 300 and 1,000 machine scenarios are not confirmed there. On GitLab, new jobs stop when a group's minutes run out until you buy more or the month resets; bochka's $2,000 plan queues starts above 90 a minute.
| Scenario | GitHub Actions | GitLab.com hosted runners | bochka |
|---|---|---|---|
| One coding agent, workdays |
|
| None that bite |
| One agent that never stops |
|
| None that bite |
| 50 agents in parallel |
|
| None that bite |
| Sandboxes for your users |
|
| None that bite |
| 1,000 short jobs at once |
|
|
|
Which one should you use?
Use GitHub Actions when
your code is on GitHub, when jobs need up to 6 hours, KVM for Android emulators or Windows arm64, or when you want larger runners inside your Azure network.
- Longer jobs. A GitHub Actions job can run for up to 6 hours, twice the 3-hour cap on GitLab.com hosted runners.
- KVM and more OS choices. Teams running Android emulators or building for Windows arm64 get KVM and arm64 Windows on GitHub-hosted runners.
- Your own network and clear limits. Larger runners can join your Azure network with static IP ranges, and each plan states how many jobs run at once.
Use GitLab.com hosted runners when
your code is on GitLab.com, when you want big Linux machines up to 32 vCPU, a hard minutes quota, or Claude Code and Codex agents with GitLab-managed keys.
- Native CI for GitLab projects. If your code lives on GitLab.com, hosted runners are on by default for every project, with nothing extra to wire up.
- Agent keys kept out for Claude and Codex. GitLab's Claude Code and Codex agents use GitLab-managed credentials through an AI Gateway, so those model keys stay out of the job.
- Big Linux machines and a hard quota. Premium and Ultimate offer Linux runners up to 32 vCPU and 128 GB, and a hard minutes quota stops surprise overage.
Where bochka fits
If what you are really running is agents, not CI jobs, both services get in the way: each job is a fresh VM that ends after 6 hours on GitHub or 3 hours on GitLab, with no way in from outside. bochka gives each agent a full VM that keeps its disk, runs as long as you want and can be reached over SSH and HTTPS. Keep your CI where your code lives, and run the agents on bochka.
A machine that stays
On both services every job starts clean, so an agent reclones the repo and reinstalls its tools each time; caches help but GitLab caps an archive at 5 GB. A bochka disk is saved every minute and survives a free stop.
Reach it from outside
Neither GitHub nor GitLab lets traffic into a hosted runner, so a preview, a webhook or a live look at the agent needs a third-party tunnel inside the job. bochka gives SSH, HTTPS on 50 ports, raw TCP and a 60fps desktop.
Agents driven from outside, keys kept out
Both start agents from issues and pull or merge requests, and other tokens sit inside the VM as variables, where one prompt injection can read them. bochka drives seven agents from any program and keeps keys for any HTTPS API in a proxy.
Use bochka when what you run is agents rather than CI jobs: each one needs its own machine that keeps its disk, runs past 3 or 6 hours, takes inbound traffic, shows a desktop and keeps real API keys out of reach. Compare it one to one: bochka vs GitHub Actions and bochka vs GitLab.com hosted runners.
Questions people ask
Is GitHub Actions cheaper than GitLab.com hosted runners?
In this page's scenarios GitHub Actions comes out lower every time, for example $354 against $805 a month for one 4 vCPU machine running 24/7, though neither actually fits that job. For plain CI, the minutes in your plan matter most: 2,000 a month on GitHub Free against 400 on GitLab Free.
Which is faster, GitHub Actions or GitLab runners?
Neither has a comparable measurement in the hpc-sandbox-benchmarks CPU test, so there is no fair speed number between them. bochka did 26.69 runs per second on that test at 4 vCPU / 8 GB.
How long can a job run on each?
Up to 6 hours on GitHub-hosted runners and up to 3 hours on GitLab.com hosted runners, whatever timeout the project sets. A bochka sandbox has no session cap on paid plans.
Can GitHub Actions and GitLab runners run Docker?
Yes. GitHub-hosted Linux runners run Docker, and GitLab's Linux jobs run in a privileged container that supports Docker-in-Docker. GitHub also exposes KVM for Android emulators, which GitLab does not document.
Can I SSH into a GitHub or GitLab hosted runner?
No. Neither accepts inbound connections to hosted runners, and GitLab's interactive web terminal works only on runners you host yourself. You can SSH into a bochka sandbox and open HTTPS URLs on up to 50 ports.
Do files persist between jobs?
Not on the runner, on either service. Each job gets a fresh VM, and files carry over only through a cache, artifacts or, on GitHub, a custom image. A bochka sandbox keeps its disk and saves it every minute.
Try bochka
Install the CLI, then run bochka new.
Product preview
More comparisons
- bochka vs GitHub Actions
- bochka vs GitLab.com hosted runners
- GitHub Actions vs CircleCI
- GitHub Actions vs Blacksmith
- GitHub Actions vs Depot
- GitHub Actions vs WarpBuild
- GitHub Actions vs Buildkite
- GitHub Actions vs Bitrise
- GitHub Actions vs Codemagic
- GitHub Actions vs RunsOn
- GitHub Actions vs Ubicloud
- CircleCI vs GitLab.com hosted runners