iOS/macOS のプラットフォームエンジニアと CI 運用者がビルドプールをシンガポール、日本、韓国、香港、米国東部、米国西部にまたがらせると、Xcode 以前に詰まることがよくあります。pod install、pod repo update、swift package resolve は、誤ったソース、既定のタイムアウト、共有キャッシュ境界が重なるとキュー全体のインシデントになります。本稿は再現可能なクリーンビルドのガイドおよびGit と成果物の近接マトリクスと役割分担します。RCA に載せられる依存関係の痛み六類型、公式/ミラー/プライベートレジストリの対照表二つ、リージョン別エグレスと再試行の表、コピペ用コマンド、六段階の手順書、ダッシュボード向け指標三つをまとめ、1TB/2TB 拡張の判断に使うディスク閾値を同じレビュー表に載せます。
プールされたリモート Mac はローテーションし、同時ジョブ間でキャッシュディレクトリを共有し、リージョンごとにエグレス方針が変わります。あらゆるタイムアウトを「不安定なネットワーク」とラベルすると、バーストのレンタル時間を浪費します。次のシグナルを変更チケットに記録し、ランナータグと契約マイルストーンの横でレビューしてください。
Podfile.lock や Package.resolved は解決結果を固定しますが、CI が開発者のノート PC と異なる spec エンドポイント、Git URL、レジストリホストに当たると、「同じラベル、ジョブごとに違う結果」になります。curl 系のタイムアウトが集中し、CPU は遊んでキューだけが溜まります。CI=true、キーチェーン契約、netrc パターンが無いと、GUI セッションでは通るプライベート pod や SPM リポジトリが CI だけで失敗します。git や HTTP 操作には RTT を意識した上限が必要です。夜間ジョブに対話的な既定値をそのまま継承しないでください。これらは再現可能ビルドの記事と重ねます。あちらはコンパイラと派生データの見え方を固め、本稿はresolver の経路とキャッシュ境界を固めます。成果物の近接は何を引くか、この手順書はどこから引くか、再試行がどうバックオフするか、キャッシュをどこに置くかを決めます。
万人向けの「最良」ソース戦略はありません。コンプライアンス、監査可能性、ロールバックに沿った戦略だけがあります。調達や設計レビューにそのまま貼り付けてください。
| 戦略 | シグナル | 利点 | リスク/契約上の注意 |
|---|---|---|---|
| 公式 trunk/既定の SPM 解決 | 依存はほぼ公開で、ポリシーが直接インターネットを許す | 部品数が最少でコミュニティ既定と一致する | リージョン差でジッターがありバックオフが無い。パイプラインにタイムアウトをコード化し、暗黙知に頼らない |
| エンタープライズミラーまたはプライベート spec/レジストリ | 監査証跡、固定スナップショット、規制されたエグレス | 再現可能な取得。公開経路を無効化できる | メタデータが古いと「ローカルでは通るが CI では落ちる」になる。ミラー更新の SLA を定義する |
| 公式+許可リストミラーのハイブリッド | CDN 品質がリージョン間で不均一なマルチリージョンプール | 全面プライベート化より安くリージョンごとにテンプレを切り替えられる | テンプレのドリフト。「リージョン→ソース対応表」をランナーラベルに結び付ける |
| ベンダー一式またはオフライン束 | エアギャップや一回限りの納品 | 決定性が最大 | 更新コストが高く、速いサイクルのセキュリティパッチには向きにくい |
レンジは明示してください。プレースホルダは自社の mtr やパイプラインのパーセンタイルで置き換え、本番に盲目でコピーしないでください。マルチリージョンとレンタル条件のガイドと並べて読み、遅延と請求が同じマイルストーンを共有するようにします。
| シナリオ | 典型的な症状 | 最初の手 | ディスク/SKU との結び付き |
|---|---|---|---|
| リージョン A のビルダー、リージョン B に Git/レジストリの癖がある | 長尾の git fetch、断続的な SPM resolve | 依存のホットパスをビルダー近くへ寄せるかエッジキャッシュを足す。GIT_HTTP_LOW_SPEED_LIMIT を調整し並列度に上限を付ける | CPU より先にネットワーク最適化。M4 Pro への段階的な引き上げの前にディスクは健全か確認する |
| CocoaPods CDN のジッター | ジョブ横断で curl タイムアウトが束になる | ミラーまたはプライベートキャッシュへフェイルオーバー。バックオフ付きのパイプライン再試行を足す | 同時ダウンロードで書き込み負荷が跳ねる—1TB ホストに注意する |
| 認証が要るプライベート pod や SPM | 401/403、または CI だけでハング | netrc、SSH エージェント、OIDC トークンを標準化し、対話的 GUI に依存しない | SSH と VNC のガイドに沿った専用 CI ユーザーとセットにする |
| 破損キャッシュや古いロック | 手動パージ後に楽になるが、高並列で再発 | ジョブごとのキャッシュ接頭辞またはアカウント分離。自動クリーンアップのゲート | マトリクス幅を絞ったうえでなければ 2TB や専用キャッシュノードは試さない |
# CocoaPods: 非対話フラグと CDN ソース(URL はポリシーに合わせて置換) export COCOAPODS_DISABLE_STATS=true export CI=true pod install --verbose --no-repo-update # repo 更新は専用ジョブで—マトリクス各シャードのたびに走らせない # pod repo update trunk # SPM: 解決トレースとキャッシュ占有(Xcode/SwiftPM のパスを確認) swift package resolve -v 2>&1 | tail -n 50 du -sh ~/Library/Caches/org.swift.swiftpm 2>/dev/null du -sh ~/Library/Developer/Xcode/DerivedData 2>/dev/null # Git の長尾: スロットル例(RTT に合わせて調整。成果物ガイドと併用) export GIT_HTTP_LOW_SPEED_LIMIT=1000 export GIT_HTTP_LOW_SPEED_TIME=60
注意:ミラーは遅延を改善しますが、メタデータのずれを招くことがあります。Podfile.lock/Package.resolved とミラーのスナップショット時刻の両方をレビューし、遅れているミラーをアプリのリグレッションと誤ラベルしないでください。
ランナーとシークレットはセルフホストランナーのチェックリストに従っている前提です。分離できていなければ先にそちらを直してください。
pod install と resolve の P95、失敗分類(TLS、401、5xx、タイムアウト)、週次ディスク増分を追跡します。データ無しで新リージョンを足さない。これらは「ビルドが遅い」を実行可能なバケツに変え、ディスク監視と一緒にアラートに載せるべきです。
ビルダーリージョンが主 Git リージョンと一致しないかどうかの真偽値も保存し、長く false のままならヒーロー的な再実行ではなくレンタル配置の FinOps レビューを起票します。
参考枠組み(ベンチマークではありません):コールド解決と幅広いマトリクスでは週に数十 GB のキャッシュ増分があり得ます。無制限並列を受け入れる前に、1TB SKU では再利用方針を明示してください。
個人用スクリプトは監査に弱く、リージョンが変わると壊れます。無人プールでは「依存が入った」と「毎回同じ依存グラフ」が別 SLA です。契約レベルの Apple Silicon CI には、ソーステンプレ、ディスクテレメトリ、請求書を一枚のワークシートに載せられる専用ベアメタル、マルチリージョン配置、組み合わせ可能なレンタル条件が必要です。
キャッシュ分離やソースマップのない短期貸与は、resolver の長尾を本流プール全体に広げます。安定したエグレス、監査可能なキャッシュ方針、バーストに耐える規模が欲しいチームは、場当たりハードよりプロ用 Mac クラウドの方が勝ちやすいことが多いです。MACCOMEはシンガポール、日本、韓国、香港、米国東部、米国西部でMac mini M4/M4 Proのベアメタルノードを柔軟な条件で提供しています。Git とレジストリの習慣に合わせたベースライン層とバースト層として使い、レンタル料金とリージョン別ページで確定してください。
パイロットの型:リポジトリが既にある場所で短期レンタルし、ヘルス用ブロックと二週間ベースラインを回してから月次条件や 2TB を決めます。「安いリージョン」へのすり替えで resolver グラフが読めなくなる買い方は避けます。
FAQ
再現可能なクリーンビルドの記事との違いは何ですか?
あちらは Xcode/CLT/DerivedData/キーチェーンの見え方を固定します。本稿は CocoaPods/SPM のソース、ミラー、キャッシュ境界を固定します。予算の話はレンタル料金とマルチリージョンガイドを同じマイルストーンで開いてください。
先にミラーですか、ディスクですか?
失敗がタイムアウトや 5xx に束なるならソースと再試行を整えます。衛生後も使用率がおおよそ 85% を超え続けるなら 1TB→2TB または専用キャッシュホストを計画します。詳細はヘルプセンターをご覧ください。
成果物の近接性とどう組み合わせますか?
成果物の近接はレジストリと Git のリージョンを選びます。本手順書は pod/SPM のダウンロード経路とキャッシュを選びます。同じ変更パッケージに両方を入れてください。