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.

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 workloadGitHub Actions: price rankGitLab.com hosted runners: price rankboat: 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; boat 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 boat 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; boat has no GPUs.
Can't run itCan't run itCan'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; boat 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

FeatureGitHub ActionsGitLab.com hosted runnersboat
Kind of productCI service: jobs run from workflow files in a GitHub repositoryCI runners: jobs run from a GitLab project's .gitlab-ci.ymlSandbox API: create, stop, fork and reach machines from your code
IsolationNew VM per job on Azure (Linux, Windows) or GitHub's Mac cloud, with passwordless sudoNew VM per job on Google Compute Engine, deleted right after; Linux jobs run in a privileged Docker containerFull VM with its own kernel on dedicated AMD Ryzen 9 9950X hosts, with root and systemd
Job lengthUp to 6 hours per jobUp to 3 hours per job, whatever the project settingNo cap on paid plans; you set the time to live
Disk between runsFresh VM every job; files carry over only through cache, artifacts or custom imagesFresh VM every job; files carry over only through a shared cache (5 GB per archive, removed after 14 days unused) or artifactsDisk persists, saved every minute and on stop; a stopped sandbox costs nothing
ForkNo; custom images are a template for new runners, not a copy of a live oneNo; every job starts from a fresh VM and a container imageFork a running sandbox with its disk
Nested virtualizationYes on Linux runners, after adding the runner user to the KVM groupNot documented; privileged mode is described for Docker-in-Docker onlyYes, /dev/kvm for Android emulators and VMs
Inbound accessNone; GitHub says hosted runners never need inbound connectionsNone; inbound traffic is blocked and there is no web terminal on hosted runnersSSH, HTTPS URLs for up to 50 ports, raw TCP, dedicated IPv6 or IPv4
Desktop and computer useHeadless; browsers are preinstalled for testsHeadless; macOS runners do not support jobs that need UI interactionLinux desktop streamed at 60fps, Chromium, computer use API
Coding agentsCopilot cloud agent, plus Claude and Codex in public preview, on issues and pull requestsDuo Agent Platform runs Claude Code, Codex, Amazon Q and Gemini from issues and merge requests, on Premium and UltimateSeven agents preinstalled, driven from outside any program with a prompt, steer and events API
Keeping API keys out of the machineSecrets enter the job as environment variables and are hidden from logsGitLab-managed credentials for its Claude and Codex agents only; other secrets enter as CI/CD variablesCredentials proxy for model providers and any HTTPS API; switch a credential to another account when credits run out
Operating systems and GPUsLinux x64 and arm64, Windows x64 and arm64, macOS, and NVIDIA T4 larger runnersLinux x64 and Arm64, Windows (beta), macOS on Apple silicon (beta), and a Linux T4 runnerLinux x64, no GPUs
Jobs at once20 on Free, 40 on Pro, 60 on Team, 500 on Enterprise; macOS 5, or 50 on EnterpriseNo published limit on how many runner VMs run at onceOn the $2,000 plan, up to 600 starts an hour; starts above 90 a minute are queued
Regions and networkingAzure; larger runners can join your Azure network in the US, EU and APAC, with static IP rangesGoogle Cloud us-east1 by default for LinuxEU only (Germany, Finland, France), open internet
Self-hostingOpen-source runner under MIT; usage on self-hosted runners is freeOpen-source GitLab Runner under MIT; jobs on your own runners use no compute minutesNo
Every feature Battleships tracks (43)
FeatureGitHub ActionsGitLab.com hosted runnersboat
Full VM (own kernel)YesYesYes
Docker insideYesYesYes
Nested virtualizationYesNoYes
RootYesYesYes
SystemdNoNoYes
Desktop GUINoNoYes
BrowserYesYesYes
Computer-use APINoNoYes
SSHNoNoYes
Persistent diskNoNoYes
Pause/resumeNoNoYes
Automatic snapshotsNoNoYes
Fork/cloneNoNoYes
Live fork (no pause)NoNoYes
Memory forkNoNoNo
Custom image (Docker or snapshot)YesYesYes
≥24 h sessionsNoNoYes
Idle auto-stopYesYesNo
Wake on requestNoNoNo
HTTPS preview URLsNoNoYes
Raw TCP inboundNoNoYes
Public IPv4NoNoNo
Egress allowlistYesNoNo
Secret proxyNoYesYes
Secret proxy for any APINoNoYes
Preinstalled agentsYesYesYes
Agent harness APIYesYesYes
MCP serverYesNoNo
GPUYesYesNo
WindowsYesYesNo
Arm64YesYesNo
Self-hostingYesYesNo
BYOCNoNoNo
Open sourceYesYesNo
Scoped API keysNot publishedNot publishedYes
Spend limitsYesNot publishedYes
Usage per sandbox (API)YesNoYes
Audit logsYesYesNo
SSOYesYesNo
SOC 2YesYesNo
HIPAANoNoNo
EU data residencyYesNoYes
Zero data retentionNot publishedNot publishedYes

Performance

GitHub ActionsNot measured
GitLab.com hosted runnersNot measured
boat26.69 runs/s

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. boat 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.

ScenarioGitHub Actions, a monthGitLab.com hosted runners, a monthboat, 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; boat's $2,000 plan queues starts above 90 a minute.

ScenarioGitHub ActionsGitLab.com hosted runnersboat
One coding agent, workdays
  • Team: sessions capped at 6 h
  • missing persistent disk
  • different kind of product: CI runner
  • Premium: sessions capped at 3 h
  • missing persistent disk
  • different kind of product: CI runner
  • no persistent disk: files lost when it stops or sleeps
None that bite
One agent that never stops
  • Team: sessions capped at 6 h
  • missing persistent disk
  • different kind of product: CI runner
  • Premium: sessions capped at 3 h
  • missing persistent disk
  • different kind of product: CI runner
  • no persistent disk: files lost when it stops or sleeps
None that bite
50 agents in parallel
  • Team: sessions capped at 6 h
  • missing persistent disk
  • different kind of product: CI runner
  • Premium: sessions capped at 3 h
  • missing persistent disk
  • different kind of product: CI runner
  • no persistent disk: files lost when it stops or sleeps
None that bite
Sandboxes for your users
  • different kind of product: CI runner
  • different kind of product: CI runner
  • not confirmed: how many machines can run at once (you need 300; the typical published limit is 50)
  • egress price not published
None that bite
1,000 short jobs at once
  • Enterprise Cloud: max 500 concurrent
  • different kind of product: CI runner
  • different kind of product: CI runner
  • not confirmed: how many machines can run at once (you need 1,000; the typical published limit is 50)
  • egress price not published
  • max 2,400 starts/day (needs ~6,667)
  • max 600 starts/hour (needs ~1,000)
  • bursts above 90 starts/min are queued (a burst of 333 takes ~4 min to start)

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 boat 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. boat 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 boat.

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 boat 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. boat 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. boat drives seven agents from any program and keeps keys for any HTTPS API in a proxy.

Use boat 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: boat vs GitHub Actions and boat 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. boat 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 boat 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 boat 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 boat sandbox keeps its disk and saves it every minute.

Try boat

Install the CLI, then run boat new.

7-day free trial

More comparisons