Free — no signup required

The Specific Hell of Mac Runners

3 min read

The Apple Tax in CI

Apple's End User License Agreement (EULA) prohibits running macOS on non-Apple hardware. This is not a technical limitation — it is a legal one. Cloud providers cannot simply install macOS on their standard x86 server racks. They must physically purchase Apple hardware (typically Mac Minis or Mac Pros), rack it in their data centers, and virtualize macOS on top of it. You are renting time on a real Mac, not a software-defined container.

This creates three compounding problems:

1. Cost
A standard Linux runner on GitHub Actions costs roughly $0.008 per minute. A macOS runner costs $0.08 per minute — a 10x premium. A pipeline that runs for 30 minutes costs $0.24 on Linux and $2.40 on macOS. At scale, a team running 100 builds per day hits $240/day just for CI compute. Annual CI costs for a mid-sized mobile team can easily exceed $80,000.

2. Boot Time and Throughput
macOS virtualization is significantly slower than Linux container startup. A fresh Linux container is ready in under a second. A fresh macOS VM can take 2–5 minutes to boot and reach a usable state. This means a developer who pushes a commit waits several minutes before their pipeline even starts executing the first step.

3. State Leakage
Because booting a fresh VM for every build is slow and expensive, some CI providers partially reuse VMs between builds — wiping user data but preserving the OS state. This creates "state leakage": a previous build installs a dependency, the cleanup misses it, and the next build silently depends on it. Your pipeline appears to work until it runs on a truly clean machine and fails. The fix is to always explicitly install every dependency in your pipeline and never assume anything is pre-installed.

The Self-Hosted Build Farm Trade-off
Many large mobile teams bypass cloud Mac runners entirely by purchasing Mac Minis and running them as self-hosted CI agents in their office or a co-location facility. A Mac Mini M2 costs roughly $600. At $0.08/minute cloud pricing, that hardware pays for itself after about 125 hours of CI usage. The trade-off: you save money but take on hardware maintenance, network configuration, OS updates, and physical security. Teams with dedicated platform engineers often find this worthwhile; smaller teams usually prefer the operational simplicity of cloud runners despite the cost.

Interview Tip

Interviewers at companies with mobile apps often ask: "How would you reduce CI costs for our iOS pipeline?" A strong answer addresses multiple levers: caching derived data and CocoaPods/SPM dependencies between runs, parallelizing test suites across multiple runners, using self-hosted Mac Minis for high-volume builds, and running expensive device farm tests only on merge to main rather than every PR. Mentioning only one lever signals shallow experience.

This is one of 18 chapters

Every chapter is free — Kubernetes, Terraform, SRE, distributed systems, and more — with fast daily review built in.

Sign up free