Seven ways to host a GitLab CI runner in 2026, priced and compared
A comparison of home hardware, GitLab.com, AWS, ARM64 cloud, local AMD hardware, and Hetzner for a monorepo running 2,000 CI jobs a month.
Seven ways to host a GitLab CI runner in 2026, priced and compared
This comparison covers seven GitLab CI runner hosting options for a monorepo. The baseline is approximately 2,000 jobs per month, 127 hours of job runtime, a Docker executor with a host socket, an 8 GB memory limit per job, and concurrent=2. The prices and specifications below are the values collected for this comparison.
Note
Prices and availability are a July 2026 snapshot. AWS prices depend on region and usage, and provider listings can change. The AWS monthly estimates exclude data transfer, EBS, and scheduler charges. Benchmark figures are directional comparisons rather than workload measurements.
The workload
From a separate analysis using glab api, our monorepo runs ~2,000 CI jobs per month totaling ~127 hours of job runtime. The top consumers:
| Job template | Runs/month | Recorded minutes |
|---|---|---|
mobile-app:quality | 126 | 1,259 |
api-contracts:drift | 123 | 945 |
e2e-tests:quality | 92 | 687 |
mobile-app:fast | 103 | 610 |
renovate:run | 20 | 516 |
The setup
The current runner is a Lenovo ThinkCentre with an Intel i5-7500T (4c/4t @ 2.7 GHz, PassMark ~6,000), 27 GB RAM, and 98 GB of disk. It sits in a closet. Docker caps each job container at 8 GB RAM and runs at most 2 jobs concurrently. Host-mounted volumes provide persistent Maven/pnpm caches and Docker layer reuse. Monthly electricity: measured at ~9 kWh, roughly €1.70.
Option 1: Keep the home runner
| Closet ThinkCentre | |
|---|---|
| Monthly cost | ~€1.70 electricity |
| CPU | 4c/4t i5-7500T, ~6,000 PassMark |
| RAM | 27 GB |
| Concurrent jobs | 2 |
| Cache | Persistent, host disk |
| Availability | When your home internet works |
| Operations | Self-managed |
Assessment: The direct monthly cost is electricity. Operation, maintenance, and incident response remain self-managed. The runner supports the current workload but depends on the home internet connection.
Option 2: GitLab.com SaaS runners
| Runner size | Cost factor | Compute min/month | Plan fit |
|---|---|---|---|
| small (2 vCPU / 8 GB) | 1 | 7,620 | Free +$72 / Premium included |
| medium (4 vCPU / 16 GB) | 2 | 15,240 | Premium +$52 / Ultimate included |
| large (8 vCPU / 32 GB) | 3 | 22,860 | Ultimate required |
Our pipeline uses a privileged Docker socket, pull_policy: if-not-present, and host-mounted caches. These settings cannot transfer directly to SaaS runners. A move would require Docker-in-Docker or Kaniko, a different cache arrangement, and additional GitLab cache I/O.
Option 3: AWS EC2
| Instance | vCPU | RAM | On-demand/mo | CI-suitable? |
|---|---|---|---|---|
| t3a.xlarge | 4 | 16 GiB | $110 | Configured for concurrent=1; burst credits can deplete under builds. |
| t3a.2xlarge | 8 | 32 GiB | $219 | 32 GiB RAM; Unlimited mode may add charges. |
| r7i.xlarge | 4 | 32 GiB | $193 | 32 GiB RAM; non-burstable. |
With AWS Instance Scheduler (stopped nights and weekends), an r7i.xlarge + 150 GB EBS drops to ~$81/month. Docker layer cache on EBS is slower than local NVMe.
Option 4: ARM64 cloud (Oracle / Hetzner / netcup)
| Provider | vCPU | RAM | Storage | Monthly | Catch |
|---|---|---|---|---|---|
| Oracle Free Tier | 4 OCPU | 24 GB | 200 GB | €0 | Free forever, but cannot rely on a free tier for business CI |
| netcup VPS 3000 ARM | 12 | 24 GB | 768 GB | €19 | Ampere Altra Max. 28% CPU steal. Sold out. |
| Hetzner CAX31 | 8 vCPU | 16 GB | 160 GB | €22 | Shared vCPU. Two 8 GB jobs leave no RAM for the host. |
ARM64 cloud VPS prices are lower than comparable x86 options in this table, but availability varied between providers. Ampere Computing is the merchant ARM server chip vendor represented in these options. Its products are primarily used by hyperscalers, while smaller providers have fewer ARM capacity options. netcup’s ARM line was sold out when I checked it. ServeTheHome reported replacing its planned ARM servers with AMD EPYC in 2025.
Assessment: ARM64 cloud reduces the hourly price in some configurations. Provider availability and workload compatibility remain constraints.
Option 5: Local ARM64 hardware
| Device | CPU | RAM | Price | Docker? | Observed fit |
|---|---|---|---|---|---|
| Raspberry Pi 5 | 4× A76 | 8 GB | ~€100 | ✅ | Below current throughput |
| Orange Pi 5 Max | 8-core RK3588 | 16 GB | ~€170 | ✅ | Requires workload testing |
| MINISFORUM MS-R1 | 12-core CIX P1 | 64 GB | ~€560 | ✅ | Supports this workload |
| Geekom QS1 Pro | Snapdragon X Elite | 64 GB | ~€800 | ⚠️ | Linux support under evaluation |
The MINISFORUM MS-R1 is one local ARM64 option in this comparison. It has 64 GB RAM and similar measured throughput to the i5-7500T. Its listed price was approximately €560, so it adds memory capacity without increasing the measured throughput over the current runner. It can also build ARM64-native production images without emulation.
Option 6: A new local AMD x86 box
| Device | CPU | RAM | Price | PassMark |
|---|---|---|---|---|
| MINISFORUM UM790 Pro | Ryzen 9 7940HS | 32 GB | ~€730 | ~28,000 |
| Used Ryzen office PC | Ryzen 5 5600G | 32 GB | ~€350 | ~19,000 |
The listed MINISFORUM UM790 Pro benchmark is 4.5× the i5-7500T result. That PassMark comparison is directional; it does not predict this workload’s build time. The purchase price is approximately equivalent to 11 months of the listed Hetzner monthly cost.
Option 7: Hetzner dedicated server - Ryzen 5 3600, 64 GB
| Closet i5 | Hetzner Ryzen 5 3600 | |
|---|---|---|
| Monthly cost | ~€1.70 | €65.70 |
| CPU | 4c/4t, ~6,000 PassMark | 6c/12t, ~17,800 PassMark |
| RAM | 27 GB | 64 GB |
| Storage | 98 GB | 2×512 GB NVMe + 16 TB HDD |
| Concurrent jobs | 2 | 6–10 |
| Cache | Host disk | Host NVMe |
Same config.toml? | N/A | Yes |
Same .gitlab-ci.yml? | N/A | Yes |
| Availability | Home internet | Datacenter, 99.9% SLA |
| Operations | Self-managed | Datacenter hosting |
The Hetzner option uses the same CPU architecture, Docker executor, config format, and pipeline structure. The runner registration would use a different IP address. The existing persistent caches, pull_policy: if-not-present, and Docker socket mount can use the same configuration. The listed CPU benchmark is approximately 3× the closet runner’s result.
All seven options, side by side
| Option | Monthly | CPU vs i5 | RAM | Cache | Setup effort |
|---|---|---|---|---|---|
| Closet i5 | ~€2 | 1× | 27 GB | ✅ Host disk | Done |
| GitLab SaaS (small, Premium) | $87+ | ~0.5× | 8 GB/job | ⚠️ S3 | Pipeline rewrite |
| AWS r7i.xlarge + Scheduler | $81 | ~1× | 32 GB | ⚠️ EBS | 1 hour |
| Oracle Free ARM64 | €0 | ~0.8× | 24 GB | ⚠️ Cloud | 1 hour |
| Hetzner CAX31 ARM64 | €22 | ~0.7× | 16 GB | ⚠️ Cloud | 1 hour |
| MINISFORUM UM790 Pro | €0/mo (€730 upfront) | 4.5× | 32 GB | ✅ NVMe | 1 hour |
| Hetzner Ryzen 5 3600 | €65.70 | 3× | 64 GB | ✅ NVMe | 1 hour |
The Hetzner box is not the lowest-cost option. The Oracle Free Tier is listed at €0, and a used office PC is listed at €350 once. The Hetzner option provides 64 GB RAM, more CPU capacity than the closet runner, a datacenter location, and a compatible Docker executor configuration.
Decision
The comparison favors the Hetzner option because it preserves the current CPU architecture, Docker executor, cache mounts, and pipeline configuration while increasing CPU and memory capacity.
References
This post was written with AI assistance.