Figment.so
Mac hostingWebsite hostingGuidesHow to usePricing

CI Build Minutes or a Monthly Mac: Model the Bill

If you build iOS on GitHub Actions, a Figment monthly Mac often wins before 200 builds a month

GitHub Actions charges $0.062 per macOS build-minute according to its billing documentation. A Figment M-series Mac starts at $95/month, which buys 1,532 GitHub macOS minutes (95 ÷ 0.062) before the per-minute platform is more expensive. For a 10-minute average build, that is 153 builds a month. Teams opening several pull requests a day cross that line quickly. On Bitrise, whose M4 Medium rate is $0.0072/min per its pricing page, the break-even moves to 13,194 minutes — about 1,319 ten-minute builds — so Bitrise usually stays cheaper until you run very high volume. The decision turns on your real rate and your real build minutes, not a marketing figure.

Figment's $95/month M-series tier is an entry price; exact chip, RAM and disk are confirmed when you request the configuration. A separate $29/month virtual Intel macOS VM (2 vCPU, 8 GiB, 80 GiB) can run compatible Intel Xcode 26-or-earlier toolchains for cross-compiling and signing, but ARM-only execution, Xcode 27 and GPU work need the M-series tier.

How per-minute macOS CI billing actually adds up

Three inputs drive the bill:

  • Rate per minute. Rates differ by an order of magnitude between providers. GitHub Actions charges $0.062/min for its macOS runner; Bitrise charges $0.0072/min for M4 Medium and $0.0096/min for M4 Large (both verified on the linked pricing pages above).
  • Wall-clock build duration. This covers runner spin-up, checkout, dependency install, compile, test, archive and upload — not only compile time. Measure your own project; durations in vendor docs are not a substitute.
  • Concurrency, retries and failures. A flaky suite that retries three times triples billed minutes. Parallel PR jobs multiply again. A build that fails at minute 18 still bills 18 minutes on every per-minute platform we checked.

The build-cost worksheet

Monthly cost = builds per month × average build duration (minutes) × rate per minute.

The table compares GitHub Actions ($0.062/min) and Bitrise M4 Medium ($0.0072/min) against a Figment M-series Mac from $95/month and the Managed Build Mac at $249/month. A * flags rows where the monthly Mac beats the per-minute option.

Builds/moAvg minGitHub ActionsBitrise M4 MedFigment M-series $95Managed Build $249
5010$31.00$3.60$95$249
10010$62.00$7.20$95$249
15310$94.86 (≈break-even)$11.02$95$249
20010$124.00 *$14.40$95 *$249
30010$186.00 *$21.60$95 *$249
50010$310.00 *$36.00$95 *$249 *
5020$62.00$7.20$95$249
10020$124.00 *$14.40$95 *$249
20020$248.00 *$28.80$95 *$249 *
40020$496.00 *$57.60$95 *$249 *
1,32010$818.40 *$95.04 (≈Bitrise break-even)$95$249

Reading the worksheet. At 200 ten-minute builds a month, GitHub Actions is $124 versus $95 for the Figment M-series entry — $29/month, $348/year. At 300 builds, the gap is $91/month or $1,092/year. Bitrise's break-even sits near 1,320 ten-minute builds because its per-minute rate is roughly 8× cheaper than GitHub's.

What the worksheet intentionally does not include:

  • Hosted-runner provisioning time per job, which still counts as billed minutes on per-minute platforms.
  • Queue time under free-plan concurrency limits.
  • Artifact and cache storage, which are billed separately on most platforms.
  • The admin cost of a self-hosted runner: disk space, Xcode updates and agent upgrades. Choose the Managed Build Mac ($249/month, one M-series Mac, CI setup, backups, monitoring, 30 minutes monthly support) if you want that handled.

Measure your real build duration before you commit

Estimates are unreliable. Time a clean build on the actual target machine, using your own project's scheme and workspace, then plug the average into the worksheet:

#!/usr/bin/env bash
# Time a clean build of YOUR project. Replace the scheme/workspace with yours.
# Requires Xcode installed locally. This is an example, not a benchmark.
set -euo pipefail

SCHEME="${SCHEME:?set SCHEME to the project scheme}"
WORKSPACE="${WORKSPACE:?set WORKSPACE to your .xcworkspace path}"
DESTINATION="${DESTINATION:-generic/platform=iOS}"

DERIVED_DATA="$(mktemp -d -t figment-build-timing)"
trap 'rm -rf "$DERIVED_DATA"' EXIT
echo "Using fresh DerivedData for this timing run."

echo "Build start: $(date -u +%FT%TZ)"
/usr/bin/time -p xcodebuild \
  -workspace "$WORKSPACE" \
  -scheme "$SCHEME" \
  -destination "$DESTINATION" \
  -configuration Release \
  -derivedDataPath "$DERIVED_DATA" \
  clean build
echo "Build end:   $(date -u +%FT%TZ)"

Run it three times from a cold DerivedData, average the wall-clock real output and only count successful runs. A build that exits non-zero at minute two is a broken build, not a two-minute build. Confirm your installed flags with xcodebuild -help on the same machine; the available destinations and export methods depend on your Xcode version.

What a Figment monthly Mac gives you that per-minute runners do not

  • Warm caches across jobs. DerivedData, SwiftPM, CocoaPods, Homebrew and Fastlane state persist between builds. Measure on your codebase; cache benefit varies by module structure.
  • Pinned toolchain. Install a specific Xcode and hold it. Hosted images roll on a vendor schedule you do not control.
  • Predictable concurrency. One agent, one build at a time unless you register more agents. No surprise throttling, no shared-pool queues.
  • One line item. Flat monthly cost, so a flaky suite that retries three times does not multiply the invoice.

Tradeoffs are real: you pay the same rate on a quiet sprint, and you own patching, disk management and Xcode updates on the unmanaged plan. The Managed Build Mac shifts the setup and monitoring work to Figment.

Spiky vs steady build volume

If traffic is uneven — a release sprint followed by a quiet fortnight — keep per-minute macOS runners for burst overflow and run the steady base load on the Figment Mac. Register both in your CI service and label the self-hosted runner so routine PR jobs route to it while release matrix jobs can still fan out to the hosted pool.

Move to a monthly runner in a week

  1. Pull the last 30 days of macOS minutes from your CI provider's usage export.
  2. Run the timing script above three times on a representative branch; average the successful real values.
  3. Multiply builds × duration × per-minute rate and compare to $95. If you are over, request the configuration quote.
  4. Request a Figment M-series Mac at /mac-hosting/start. Confirm chip, RAM, disk, region and Xcode version in the quote.
  5. Install your CI service's self-hosted agent. The agent dials out to the CI service; update only the allowlists you control (artifact stores, deploy targets, internal package registries) — there is no generic Apple CI IP range to add.
  6. Mirror one real pipeline, run ten builds, compare real times and failure rate to the per-minute baseline.
  7. Once a full week is stable, route the rest of your macOS jobs to the self-hosted label.

Start at Figment → · Mac hosting overview

Related reading:


Subscribe for Figma design and website publishing guides.


Figment.so

Contact

Twitter

Website pricing

Compute index

About

Privacy

Terms