2026 マルチリージョンのリモート Mac:CocoaPods と SPM のソース
ミラー、再試行ポリシー、1TB/2TB ディスク閾値の手順書

約 22 分 · MACCOME

iOS/macOS のプラットフォームエンジニアと CI 運用者がビルドプールをシンガポール、日本、韓国、香港、米国東部、米国西部にまたがらせると、Xcode 以前に詰まることがよくあります。pod installpod repo updateswift package resolve は、誤ったソース、既定のタイムアウト、共有キャッシュ境界が重なるとキュー全体のインシデントになります。本稿は再現可能なクリーンビルドのガイドおよびGit と成果物の近接マトリクスと役割分担します。RCA に載せられる依存関係の痛み六類型、公式/ミラー/プライベートレジストリの対照表二つ、リージョン別エグレスと再試行の表、コピペ用コマンド、六段階の手順書、ダッシュボード向け指標三つをまとめ、1TB/2TB 拡張の判断に使うディスク閾値を同じレビュー表に載せます。

「ネットが悪い」以外に分ける:六つの根本原因クラス

プールされたリモート Mac はローテーションし、同時ジョブ間でキャッシュディレクトリを共有し、リージョンごとにエグレス方針が変わります。あらゆるタイムアウトを「不安定なネットワーク」とラベルすると、バーストのレンタル時間を浪費します。次のシグナルを変更チケットに記録し、ランナータグと契約マイルストーンの横でレビューしてください。

  1. ソース経路とロックファイルの意味合い:Podfile.lockPackage.resolved は解決結果を固定しますが、CI が開発者のノート PC と異なる spec エンドポイント、Git URL、レジストリホストに当たると、「同じラベル、ジョブごとに違う結果」になります。
  2. CDN やミラーがリージョンに合っていない:公式 CDN が地域で不安定なとき、エンタープライズミラーやプライベートキャッシュが無いと、ピーク時に curl 系のタイムアウトが集中し、CPU は遊んでキューだけが溜まります。
  3. 非対話とシークレットの欠落:無人のリモートに CI=true、キーチェーン契約、netrc パターンが無いと、GUI セッションでは通るプライベート pod や SPM リポジトリが CI だけで失敗します。
  4. 同時書き込みするキャッシュ:複数ジョブが一つの DerivedData や SPM キャッシュ接頭辞を共有すると、インデックス破損や古いロックが残り、ログはランダムな I/O エラーに見えますが、実際はパス方針の問題です。
  5. リージョン横断フェッチの既定タイムアウト:長尾の git や HTTP 操作には RTT を意識した上限が必要です。夜間ジョブに対話的な既定値をそのまま継承しないでください。
  6. ディスク圧力がダウンロードを増幅:1TB ホストで幅広いマトリクスを回すと、キャッシュとアーカイブで使用率がおおよそ 90% を超え、実際は inode や空き容量不足なのに TLS や展開エラーとして表れることがあります。

これらは再現可能ビルドの記事と重ねます。あちらはコンパイラと派生データの見え方を固め、本稿はresolver の経路とキャッシュ境界を固めます。成果物の近接は何を引くか、この手順書はどこから引くか、再試行がどうバックオフするか、キャッシュをどこに置くかを決めます。

表 1:公式ソース、エンタープライズミラー、プライベートレジストリ—設計レビュー用の言葉

万人向けの「最良」ソース戦略はありません。コンプライアンス、監査可能性、ロールバックに沿った戦略だけがあります。調達や設計レビューにそのまま貼り付けてください。

戦略シグナル利点リスク/契約上の注意
公式 trunk/既定の SPM 解決依存はほぼ公開で、ポリシーが直接インターネットを許す部品数が最少でコミュニティ既定と一致するリージョン差でジッターがありバックオフが無い。パイプラインにタイムアウトをコード化し、暗黙知に頼らない
エンタープライズミラーまたはプライベート spec/レジストリ監査証跡、固定スナップショット、規制されたエグレス再現可能な取得。公開経路を無効化できるメタデータが古いと「ローカルでは通るが CI では落ちる」になる。ミラー更新の SLA を定義する
公式+許可リストミラーのハイブリッドCDN 品質がリージョン間で不均一なマルチリージョンプール全面プライベート化より安くリージョンごとにテンプレを切り替えられるテンプレのドリフト。「リージョン→ソース対応表」をランナーラベルに結び付ける
ベンダー一式またはオフライン束エアギャップや一回限りの納品決定性が最大更新コストが高く、速いサイクルのセキュリティパッチには向きにくい

表 2:ビルドリージョンとレジストリリージョンがずれるとき—タイムアウトと再試行の埋め方

レンジは明示してください。プレースホルダは自社の mtr やパイプラインのパーセンタイルで置き換え、本番に盲目でコピーしないでください。マルチリージョンとレンタル条件のガイドと並べて読み、遅延と請求が同じマイルストーンを共有するようにします。

シナリオ典型的な症状最初の手ディスク/SKU との結び付き
リージョン A のビルダー、リージョン B に Git/レジストリの癖がある長尾の git fetch、断続的な SPM resolve依存のホットパスをビルダー近くへ寄せるかエッジキャッシュを足す。GIT_HTTP_LOW_SPEED_LIMIT を調整し並列度に上限を付けるCPU より先にネットワーク最適化。M4 Pro への段階的な引き上げの前にディスクは健全か確認する
CocoaPods CDN のジッタージョブ横断で curl タイムアウトが束になるミラーまたはプライベートキャッシュへフェイルオーバー。バックオフ付きのパイプライン再試行を足す同時ダウンロードで書き込み負荷が跳ねる—1TB ホストに注意する
認証が要るプライベート pod や SPM401/403、または CI だけでハングnetrc、SSH エージェント、OIDC トークンを標準化し、対話的 GUI に依存しないSSH と VNC のガイドに沿った専用 CI ユーザーとセットにする
破損キャッシュや古いロック手動パージ後に楽になるが、高並列で再発ジョブごとのキャッシュ接頭辞またはアカウント分離。自動クリーンアップのゲートマトリクス幅を絞ったうえでなければ 2TB や専用キャッシュノードは試さない
bash
# 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
warning

注意:ミラーは遅延を改善しますが、メタデータのずれを招くことがあります。Podfile.lockPackage.resolved とミラーのスナップショット時刻の両方をレビューし、遅れているミラーをアプリのリグレッションと誤ラベルしないでください。

六段階の手順書:「一台では動く」からマルチリージョンで安定した解決へ

ランナーとシークレットはセルフホストランナーのチェックリストに従っている前提です。分離できていなければ先にそちらを直してください。

  1. resolver 経路を固定する:許可する spec ソース、SPM のエントリ、禁止する一時 URL を文書化し、ロックファイルのレビュー規則に結び付けます。
  2. リージョン別ソーステンプレ:シンガポール、日本、韓国、香港、米国東部、米国西部ごとに、既定ミラーとフェイルオーバー順をブートストラップスクリプトまたはランナーラベルに記録します。
  3. キャッシュ位置を契約する:SPM/CocoaPods キャッシュと DerivedData にチーム接頭辞を付け、専用の監視を当てます。ディスク満杯のページだけの事後対応にしない。
  4. バーストホストのゲート:日次・週次レンタルで並列マトリクスを積む前に、スニペットを実行してロックファイルを比較し、不一致ならクローズします。
  5. 二週間のベースライン:pod install と resolve の P95、失敗分類(TLS、401、5xx、タイムアウト)、週次ディスク増分を追跡します。データ無しで新リージョンを足さない。
  6. レンタルを揃える:月次ベースラインはおおよそ 80% 負荷をカバーします。バーストホストは依存のホットパスと同じリージョン族に置き、安いマシンに高コストな resolver 経路を載せないようにします。

ダッシュボードと週次レビュー向けの指標三つ

これらは「ビルドが遅い」を実行可能なバケツに変え、ディスク監視と一緒にアラートに載せるべきです。

  1. resolver の P95 と失敗の内訳:CDN、Git、プライベートレジストリ、ローカルキャッシュヒットに分割します。タイムアウト比率が上がりヒット率が下がるなら vCPU ではなくテンプレが原因です。
  2. ディスクのホットゾーン:SPM キャッシュ、CocoaPods キャッシュ、DerivedData の週次 GB 増分待ち時間のパーセンタイルの横にプロットします。大規模な Apple Silicon リポジトリでは 2025〜2026 年型の負荷で CPU より先にディスクが飽和しがちです。
  3. ジョブ横断のキャッシュ一貫性:キャッシュルートを共有する並列ジョブ数と resolver の再試行回数を追跡します。相関して跳ねるなら、再試行を増やすのではなく接頭辞が必要です。

ビルダーリージョンが主 Git リージョンと一致しないかどうかの真偽値も保存し、長く false のままならヒーロー的な再実行ではなくレンタル配置の FinOps レビューを起票します。

参考枠組み(ベンチマークではありません):コールド解決と幅広いマトリクスでは週に数十 GB のキャッシュ増分があり得ます。無制限並列を受け入れる前に、1TB SKU では再利用方針を明示してください。

アドホック VPN スクリプトや一時ミラーがエンタープライズの依存統制でスケールしにくい理由

個人用スクリプトは監査に弱く、リージョンが変わると壊れます。無人プールでは「依存が入った」と「毎回同じ依存グラフ」が別 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 のダウンロード経路とキャッシュを選びます。同じ変更パッケージに両方を入れてください。