2026年 独占リモート Mac CI:Xcode テストプランと並列テストのセルフホスト Runner 上の資源争奪——xcresult 集約、Simulator 並列度、SSH ヘッドレス flaky 再現の意思決定マトリクス+FAQ
1 台の専用リモート Mac をセルフホスト CI の Runner にするとき、「並列テスト」は無償のスループットではありません。共有される CPU・メモリ・I/O・CoreSimulator・キーチェーン/署名の直列化です。本稿では Xcode テストプラン、並列 XCTest、Simulator の同時起動、.xcresult の集約を一枚の再現可能な意思決定マトリクスにまとめ、SSH ヘッドレスで flaky を追うチェックリストと FAQ を付けます。リモート Mac 上の iOS 開発パイプライン全体の整理は
2026年最高のiOS開発加速ソリューション:遠隔Mac mini M5を利用した高性能SPMキャッシュサーバとvisionOS自動化パイプラインの構築、証明書と署名の境界は
iOS証明書と署名を安全に管理するには?独占物理Mac miniによる2026年のベストプラクティス
を参照してください。
1. 1 台のセルフホスト Mac で実際にぶつかるもの
Runner ホストは次のホットスポットを持つ 単一プールとして扱います。
- CPU/メモリ圧力:並列テストワーカーや複数 Simulator が、コンパイル・インデックス・Swift concurrency と奪い合います。
- Simulator のライフサイクル:ブート・クローン・後始末のコストが短いテストでは支配的になります。
CoreSimulatorやcom.apple.CoreSimulator.CoreSimulatorServiceはバースト並列で詰まりやすいです。 - ディスクと APFS:
DerivedData、シミュレータデータ、xcresultは容量が大きく、並列ジョブは fsync やスナップショットの揺れを増幅します。 - 署名とキーチェーン:codesign やキーチェーンアクセスはテストが「並列」でも直列化しがちです。並列 Job 向けのセキュリティ runbook とセットで考えます。
- GUI セッション前提:SSH ヘッドレスはログイン GUI とペーストボード・権限・一部 Simulator の挙動が異なります。flaky はこの差に乗ることが多いです。
2. Xcode テストプラン:CI で固定すべきこと
テストプラン(.xctestplan)は構成・ターゲット・フィルタを束ねます。自動化では再現性が IDE の利便性より優先です。
- プラン名を固定:
xcodebuild -testPlan <Name>と、プランを参照するスキームをセットで固定します。 - スモークとフルを分離:別プランまたは別ターゲットにし、PR パイプラインがナイトリーと同じタイムアウト/並列度を継承しないようにします。
- 環境変数と引数:プラン側で CI 変数を揃えるか、flake 切り分け時は
-only-testing/-skip-testingで外科的に絞ります。 - 診断:添付やクラッシュ収集をプランで一貫させ、リトライ間の
xcresult比較が意味を持つようにします。
3. 並列テストのつまみ(xcodebuild/XCTest/Simulator)
レイヤーは積み重なります。1 層だけ調整しても、別の層で詰まりが隠れることがあります。
- 並列 XCTest ワーカー:スキーム設定と
xcodebuildフラグ(例:-parallel-testing-enabled YES)で制御。Xcode バージョンごとに確認し、CI では「最後に IDE が保存したスキーム任せ」より明示フラグを優先します。 - Simulator の最大同時数:RAM と I/O が許す範囲でキャップ。多すぎるとブート嵐とスワップが増えます。
- デスティネーション行列:OS バージョンやデバイス種別を混ぜるほどストレージと取得物が増えます。単一テナントでもチーム横断で重い行は直列化を検討します。
- Runner の同時実行:1 ホスト 1 Runner プロセスが典型です。隔離なしで同一ホストに複数パイプラインを重ねると争奪が跳ね上がるため、ラベル・キュー・第 2 ノードを先に検討し、ジョブ内並列度の引き上げは後回しにします。
4. 再現可能な意思決定マトリクス(専用 1 台)
| 目的 | 優先する方針 | 注意/緩和 |
|---|---|---|
| PR の速い信号・小さめスイート | 並列 XCTest+1 系統の Simulator、温かい DerivedData |
タイミング依存テストは時間予算を固定。コンパイルと並列テストを同一ステップで CPU 飽和させない。 |
| 大規模 UI・多デスティネーション | デスティネーションでシャードするか、プランをジョブ分割。ジョブあたりの並列は控えめに | Simulator ブート嵐。段階的に起動するかデバイスをプール化。古い sim は定期クリーンアップ。 |
| 壁時計より安定性 | 並列ワーカーを下げる、デスティネーションは直列、順序を決定的に | パイプラインは長くなる。SLA を共有し、広さはナイトリーへ。 |
| 資源争奪が疑わしい | ステージごとに sample、状況に応じて powermetrics、空き容量、メモリ圧のログを取る |
スパイクはまずスケジューリング問題として扱い、アプリのせいにしない。 |
5. xcresult の集約:ジョブごと 1 バンドル、ダッシュボード用にマージ
各 xcodebuild test は、管理する 結果バンドルパス(例:-resultBundlePath でシャードごとに一意ディレクトリ)へ書き出します。監査に耐える運用の例です。
- 成果物レイアウトの安定:バンドルまたは
xcresulttoolからの JUnit 等を、相対パスを揃えて CI 成果物に載せます。 - マージ:結合対象のバンドルに対して
xcresulttool mergeを使います。形式が合わないものやクラッシュで欠けたバンドルを混ぜない。マージの終了コードをパイプラインで検証します。 - リトライ:flaky リトライで上書きか追記かを方針化し、「緑」の意味がレポートと Xcode で一致するようにします。
- 秘密情報:共有ストレージに
xcresultを出す前にログからトークンを除去します。
6. SSH ヘッドレスでの flaky 再現:チェックリスト
ローカルでは通るが CI では不安定、あるいは SSH 経由だけ、というときの順序です。
| 症状 | 最初に見るもの | 典型の手当て |
|---|---|---|
| ランダムタイムアウト/Simulator 未準備 | ホストのメモリ圧、同時 sim ジョブ、画面ロックと SSH セッションの差 | 並列デスティネーションを減らす。simctl bootstatus に沿った待機。GUI とヘッドレスの前提を揃える。 |
| キーチェーン/署名が CI のみ失敗 | ジョブ実行ユーザーと対話ログイン、キーチェーン ACL、CI ユーザー分割 | codesign runbook の同一性とパーティションに合わせる。1 つのログインキーチェーンを並列ジョブで踏みにじらない。 |
| 選ばれる Xcode が違う | ジョブシェルと SSH 双方の xcode-select -p |
Runner 環境で Xcode パスを固定。GUI 専用の切り替えに依存しない。 |
| 並列のときだけ不安定 | ディスク上の共有可変状態、グローバルシングルトン、時間依存テスト | ワーカーごとにテンポラリを分離。そのターゲットは並列を切る。テスト衛生を直す。 |
7. FAQ
Q1: 速さのため常に並列テストを有効にすべき?
ホストに余裕があり、テストが独立している場合に限ります。メモリや Simulator サービスを逼迫する並列は、壁時計とフレークを増やすことがあります。
Q2: xcresult は 1 つにまとめる? 複数?
xcodebuild 呼び出しごとに 1 バンドルが明快です。ダッシュボード用には各入力が完全なことを確認してから xcresulttool merge します。
Q3: SSH 自体がテスト失敗の原因になる?
直接というより、環境・セッション種別・キーチェーン文脈の差です。Runner と同じユーザー・シェル・env・Xcode パスで再現してください。
Q4: Simulator の並列度はどう決める?
保守的に始め、ブート時間とスワップを測ってから上げます。XCTest ワーカーを上げる前に並列デスティネーションをキャップしてください。複数 OS ランタイムを載せた Apple Silicon Mac mini では、Simulator が先に限界になりがちです。
このマトリクスに合うのは専用リモート Mac mini です
テストプラン、並列 XCTest、xcresult のエクスポートは、ディスク配置の再現性・ツールチェーンの安定・インタラクティブな監視なしで常時稼働できるマシンを前提にします。Apple Silicon の Mac mini は多コア性能と低い待機電力のバランスがよく、常時 CI に向きます。macOS なら Xcode・Simulator・Unix 系ツールチェーンをネストした仮想化税なしで揃えられます。複数 Simulator と Swift concurrency が重なる場面ではユニファイドメモリの帯域も効きます。Gatekeeper・SIP・FileVault により、CI アカウントとオペレータのノート PC をきれいに分けやすいです。
コンパイル・テスト・アップロードを月をまたいでも予測可能に保ちたいなら、2026 年の現実的な基準として専用リモート Mac mini M4 が依然として有力です。プランとランナーラベル、インシデント手順に本文の方針を載せ替える場合は、トップページのプランもあわせてご確認ください。