2026 Mac クラウド CI:複数 Xcode・iOS SDK の共存と xcode-select、ディスク、ジョブ振り分け(Linux VPS では代替できない理由)
複数 Xcode を 1 台の Mac クラウドに載せるとディスク・キーチェーン・ログで静かに破綻します。判断表、xcode-select と DEVELOPER_DIR の 5 ステップ、DerivedData/シミュレータ閾値、並列の安全域、公証・TestFlight の切り方と Runbook 向け数値をまとめます。
目次
1. 痛み:複数 Xcode は apt-get ではない
Linux は alternatives やコンテナで切替容易だが、macOS は公式ツールチェーンとログインキーチェーンが強結合で負荷時にだけ症状が出る。
- ディスクとキャッシュ:各 Xcode は SDK、シミュレータランタイム、ドキュメント索引を同梱します。
DerivedDataをジョブ間で共有し保持ルールが無いと、活発なプールは 1 週間で数十 GB を消費し、コンパイラ不具合に見えるランダム失敗を招きます。 - 並列とログインキーチェーン:同一 macOS ユーザーで
xcodebuildを並列実行すると同じログインキーチェーンと署名コンテキストを奪い合います。メジャー Xcode を増やすと挙動差が増え、ログ先頭にアクティブな developer ディレクトリを出さない限り相関が取れません。 - 暗黙のパスドリフト:
/Applications/Xcode.app固定や GUI で最後に選んだ版任せは、ナイトリーとリリースで別コンパイラに流す原因になり再現性と性能比較を壊します。
対策はポリシーです。単一版をゴールデンイメージに焼くか、明示的な名前の複数バンドルを入れ、環境変数と Runner タグでジョブをロックし、developer ディレクトリはパイプライン版ごとに不変のダイジェスト同様に扱います。
2. 判断表:固定 vs 共存
アーキテクチャレビュー向けの表。
| 戦略 | 向く場面 | 主なリスク | 運用 |
|---|---|---|---|
| 単一 Xcode 固定(ゴールデンイメージ) | プロダクト一本、リリース列車が揃い、アップグレード窓を握れる | メジャー更新はメンテ窓か新プールが必要 | イメージマニフェストに xcodebuild -version を記録し未知スタックのジョブは拒否 |
| 二段(LTS + 最新 SDK) | 古い最低 OS ラインを出しつつ最新 SDK で試作 | ディスクとシミュレータ実質倍増 | Xcode_16.2.app 等で命名しジョブ毎に DEVELOPER_DIR |
| 三段以上 | 代理店・マルチテナント・レガシー長尾 | キューとトリアージ負荷が爆発 | タグ分割・並列上限・頻回スナップショット |
3. Linux クラウドでは代替できない理由
比較軸は vCPU 単価ではなく、Apple 公式ツールチェーンを合法に完走できるかです。
| 観点 | Linux VPS / 汎用クラウド | Apple Silicon Mac クラウド |
|---|---|---|
| 公式 Xcode / iOS SDK | フル Xcode・シミュレータ・デバイス署名を Apple 流に動かす支持経路が無い | ネイティブ xcodebuild、Simulator、署名、公証ツール |
| 挙動の忠実さ | クロスビルドや遠隔ハックでは macOS 限定の端が再現しにくい | デスク環境に近く「CI だけ赤」を減らす |
| 運用モデル | API とコンテナ向き | SSH、launchd、スナップショット、ゴールデンイメージが Linux 習慣に写せる |
4. 五歩:パス、環境変数、タグ、掃除、検証
- バンドル名を明示:
/Applications/Xcode_16.2.app形式で上書きを防ぎ、ライセンスは手順に沿って承認。 - developer ディレクトリ:CI は
DEVELOPER_DIRエクスポートを優先し並列競合を避ける。 - タグ整合:
xcode-16.2ラベルと GitHub/GitLab tags を固定。 - キャッシュ分離:
DERIVED_DATA_PATHをブランチまたはジョブ ID 単位にしオフピーク掃除、シミュレータは必要機種に限定。 - 検証:更新後は
-showsdks・クリーン・アーカイブのスモークと三つ組メタデータを記録してから本番キューを開く。
コマンド例(パスは置換):
5. 参照数値:ディスク、並列、テレメトリ
- ディスク余裕:ベースイメージにシミュレータと索引を含めた上で、追加メジャー Xcode ごとに概ね 35〜50 GB のバッファを見込む。空き 15 GB 未満は新規ジョブ停止と自動掃除の閾値にする。
- 並列ビルド:同一対話ユーザーで
xcodebuild同時実行は原則 2 以下。キーチェーンと IO を計測してから緩める。重い Archive と軽いユニットテストは時間帯をずらす。 - テレメトリ:ログ先頭 20 行以内に Xcode 版文字列、アクティブ developer パス、macOS 製品版を必ず出し、約 90 日保持して Apple リリースノートと突合。
- リズム:メジャー Xcode は四半期レビュー。マイナーはステージングプールで本番パイプライン一通り後に本番 Runner へ。シミュレータ取得のピークはオフピークや LAN キャッシュで吸収し、dSYM はツールチェーン三つ組で名前空間分離する。
6. FAQ:アップグレード、公証、TestFlight
CI は xcode-select だけで足りる? 足りません。複数ジョブ共有ホストではグローバル切替が脆い。ジョブ毎 DEVELOPER_DIR と Runner タグを推奨。
Xcode 更新直後に公証が壊れた:公証を独立層として API キー、entitlements、notarytool を先に確認し SDK 切替のせいにしない。内部の拒否分類 Runbook を使う。
複数スタックで TestFlight アップロードジョブは分ける? はい。コンパイル/アーカイブ、公証、アップロードを分け、それぞれ同一のツールチェーン三つ組をログに出す。
ノート PC はスリープやディスク枯渇を招き、Linux では合法な Xcode パイプラインを完走できません。並列・秘密・スナップショットを揃えた本番向き環境には VPSMAC の専用 Mac クラウドが向き、拡張時は構成ガイドと併読してください。