30秒で要点
- 根因:macOS beta はもはや「テスト用イメージ」ではなく、CI の実行レイヤーそのもの。
- 症状:同一 commit がローカル成功→CI失敗→再実行成功。flaky test として潰さない。
- 対策:本番 CI は安定版 macOS に固定。beta は専用 Mac mini で PASS/FAIL だけ返す。
1. 何が変わったか
WWDC 2026 以降、macOS 27 beta と Xcode 18 beta はセットで届きます。新 SDK を検証するには CI ホストも beta 列車に乗る必要があり、パイプラインはもはや:
code → build → test → artifact
ではなく、こう見えます:
code + Xcode beta + macOS beta + Simulator + Keychain → build
問題は diff ではなく、beta がランタイムになったこと。しかも beta は毎週変わる。
2. 4つの失敗パターン(WWDC 後)
| メカニズム | 現場で見えること |
|---|---|
| Xcode が macOS beta に拘束 | Runner で版固定できない。ローカル安定版と CI beta が一致しない |
| Simulator のジッター | コールド起動 +30–80%、UI テストがタイムアウト、カーネルスケジューリングが揺れる |
| 署名 / Keychain ドリフト | 間欠的な codesign 失敗が再実行で通る—— 署名ガイド |
| Swift ツールチェーンの厳格化 | 増分ビルドでファイル取りこぼし。clean build が必要 |
3. 見覚えのある症状
- 時間ドリフト:同一 commit で
xcodebuildが 18 分→37 分に跳ねる - 結果ドリフト:ローカル緑→CI 赤→再実行緑(環境ノイズでありテスト flakiness ではない)
- 偽の安心:CPU は暇、スタックトレースも薄いのにテストがランダム失敗
これは CI がローカルより 2–3 倍遅い理由 とは別件。あちらはキャッシュ調整、こちらは OS レベルの不確実性——YAML では直せない。
4. 対策:beta 実行分離
本番 CI に beta を入れない。捨てられる Mac mini で走らせ、結果だけ返す。
安定 CI(リリース macOS + Xcode)
↓
リモート Mac mini(beta のみ)
↓
PASS / FAIL + IPA を返す
4ステップ:
- beta 専用 Mac mini を用意(別ユーザー + Keychain)
- メイン Runner は安定版 macOS に固定(merge / release 用)
- 分離ノードに beta スタックを入れ、
[beta, ios]ラベルか夜間 SSH で起動 - 結果のみ返却——beta キャッシュを本番 Runner に載せない
Runner ラベルは Mac mini セルフホスト Runner ガイド。リリーススプリントの beta マトリクスは 一時ビルドマトリクス を参照。
5. どれを選ぶか
| アプローチ | 安定性 | 判定 |
|---|---|---|
| 日常 Mac に beta | ❌ Keychain 汚染、ロールバック困難 | ❌ |
| GitHub-hosted runner | ⚠️ キュー待ち + beta イメージ遅れ | ⚠️ 補助のみ |
| VM / スナップショット | ❌ Simulator GPU 不安定 | ❌ |
| リモート Mac mini beta ノード | ✅ 分離・使い捨て可能 | ✅ |
6. FAQ
macOS beta は CI に影響する?
はい。Simulator、ツールチェーン既定、署名が揺れ、同一 commit の結果が反転します。
日常 Mac で beta CI を回せる?
個人検証なら可。共有・本番ビルド機では避ける。
GitHub Actions だけで足りる?
キュー緩和には有効だが、beta の非決定性は消せない。
ベストプラクティスは?
専用 beta Mac mini + 本番 CI 固定。WWDC 後の本質は環境の制御不能であり「ビルド失敗」ではない。
任意
48時間で分離を検証
本番 Runner 固定 → 同一 commit で夜間 beta ノード → PASS 率比較。本線が安定・beta が揺れれば分離成功。 オンボーディングチェックリスト · プラン