2026 Mac クラウド CI:複数 Xcode・iOS SDK の共存と xcode-select、ディスク、ジョブ振り分け(Linux VPS では代替できない理由)

複数 Xcode を 1 台の Mac クラウドに載せるとディスク・キーチェーン・ログで静かに破綻します。判断表、xcode-selectDEVELOPER_DIR の 5 ステップ、DerivedData/シミュレータ閾値、並列の安全域、公証・TestFlight の切り方と Runbook 向け数値をまとめます。

Mac クラウド CI で複数バージョンの Xcode を扱うパイプラインのイメージ

目次

1. 痛み:複数 Xcode は apt-get ではない

Linux は alternatives やコンテナで切替容易だが、macOS は公式ツールチェーンとログインキーチェーンが強結合で負荷時にだけ症状が出る。

  1. ディスクとキャッシュ:各 Xcode は SDK、シミュレータランタイム、ドキュメント索引を同梱します。DerivedData をジョブ間で共有し保持ルールが無いと、活発なプールは 1 週間で数十 GB を消費し、コンパイラ不具合に見えるランダム失敗を招きます。
  2. 並列とログインキーチェーン:同一 macOS ユーザーで xcodebuild を並列実行すると同じログインキーチェーンと署名コンテキストを奪い合います。メジャー Xcode を増やすと挙動差が増え、ログ先頭にアクティブな developer ディレクトリを出さない限り相関が取れません。
  3. 暗黙のパスドリフト/Applications/Xcode.app 固定や GUI で最後に選んだ版任せは、ナイトリーとリリースで別コンパイラに流す原因になり再現性と性能比較を壊します。

対策はポリシーです。単一版をゴールデンイメージに焼くか、明示的な名前の複数バンドルを入れ、環境変数と Runner タグでジョブをロックし、developer ディレクトリはパイプライン版ごとに不変のダイジェスト同様に扱います。

2. 判断表:固定 vs 共存

アーキテクチャレビュー向けの表。

戦略向く場面主なリスク運用
単一 Xcode 固定(ゴールデンイメージ)プロダクト一本、リリース列車が揃い、アップグレード窓を握れるメジャー更新はメンテ窓か新プールが必要イメージマニフェストに xcodebuild -version を記録し未知スタックのジョブは拒否
二段(LTS + 最新 SDK)古い最低 OS ラインを出しつつ最新 SDK で試作ディスクとシミュレータ実質倍増Xcode_16.2.app 等で命名しジョブ毎に DEVELOPER_DIR
三段以上代理店・マルチテナント・レガシー長尾キューとトリアージ負荷が爆発タグ分割・並列上限・頻回スナップショット
経験則:Xcode 追加は Runner プールかオーナーを付ける。Store のクリック増はキャパ案件。

3. Linux クラウドでは代替できない理由

比較軸は vCPU 単価ではなく、Apple 公式ツールチェーンを合法に完走できるかです。

観点Linux VPS / 汎用クラウドApple Silicon Mac クラウド
公式 Xcode / iOS SDKフル Xcode・シミュレータ・デバイス署名を Apple 流に動かす支持経路が無いネイティブ xcodebuild、Simulator、署名、公証ツール
挙動の忠実さクロスビルドや遠隔ハックでは macOS 限定の端が再現しにくいデスク環境に近く「CI だけ赤」を減らす
運用モデルAPI とコンテナ向きSSH、launchd、スナップショット、ゴールデンイメージが Linux 習慣に写せる

4. 五歩:パス、環境変数、タグ、掃除、検証

  1. バンドル名を明示/Applications/Xcode_16.2.app 形式で上書きを防ぎ、ライセンスは手順に沿って承認。
  2. developer ディレクトリ:CI は DEVELOPER_DIR エクスポートを優先し並列競合を避ける。
  3. タグ整合xcode-16.2 ラベルと GitHub/GitLab tags を固定。
  4. キャッシュ分離DERIVED_DATA_PATH をブランチまたはジョブ ID 単位にしオフピーク掃除、シミュレータは必要機種に限定。
  5. 検証:更新後は -showsdks・クリーン・アーカイブのスモークと三つ組メタデータを記録してから本番キューを開く。

コマンド例(パスは置換):

xcode-select -p sudo xcode-select -s /Applications/Xcode_16.2.app/Contents/Developer export DEVELOPER_DIR=/Applications/Xcode_16.2.app/Contents/Developer xcodebuild -version xcodebuild -showsdks

5. 参照数値:ディスク、並列、テレメトリ

6. FAQ:アップグレード、公証、TestFlight

CI は xcode-select だけで足りる? 足りません。複数ジョブ共有ホストではグローバル切替が脆い。ジョブ毎 DEVELOPER_DIR と Runner タグを推奨。

Xcode 更新直後に公証が壊れた:公証を独立層として API キー、entitlements、notarytool を先に確認し SDK 切替のせいにしない。内部の拒否分類 Runbook を使う。

複数スタックで TestFlight アップロードジョブは分ける? はい。コンパイル/アーカイブ、公証、アップロードを分け、それぞれ同一のツールチェーン三つ組をログに出す。

ノート PC はスリープやディスク枯渇を招き、Linux では合法な Xcode パイプラインを完走できません。並列・秘密・スナップショットを揃えた本番向き環境には VPSMAC の専用 Mac クラウドが向き、拡張時は構成ガイドと併読してください。