iOS
iOS CI on GitHub Actions
Xcode builds from scratch and code signing is fragile in CI.
18m → 4m
Incremental build
26m → 8m
UI test suite
Xcode builds from scratch and code signing is fragile in CI.
Why it happens
DerivedData is discarded between runs and signing assets have to be imported into a fresh keychain each time.
What to change
- Persist DerivedData between runs — this is the single biggest win
- Use a dedicated CI keychain and import the certificate once per job
- Pin the Xcode version explicitly with xcode-select
- Shard UI tests across simulators rather than running them serially
iOS on runnerhut
yaml
jobs: ios: runs-on: runnerhut-macos-15-m4 steps: - uses: actions/checkout@v4 - run: sudo xcode-select -s /Applications/Xcode_16.4.app - run: | xcodebuild test \ -scheme App \ -destination 'platform=iOS Simulator,name=iPhone 16' \ -derivedDataPath ~/Library/Developer/Xcode/DerivedDataThe only runnerhut-specific line is `runs-on: runnerhut-macos-15-m4`. Everything else is standard GitHub Actions — the same actions, the same secrets and the same permissions model you use today.
Your next build could be twice as fast, at half the price
Start free. Migrating away is the same one line, and we publish that diff too.
Related
React NativeEvery build recompiles native iOS and Android dependencies from source.AndroidGradle re-resolves dependencies and the emulator has no hardware acceleration.FlutterThe Flutter SDK and pub cache download on every run, for every platform.FastlaneFastlane lanes spend most of their time on bundle install and signing setup.