2026年グローバルチームの iOS/macOS パイプライン:プライベートレジストリと依存ミラーは「マルチリージョンの物理 Mac と同区」か「開発者と同区」か?取得の長尾、コンプライアンス上のデータ所在地、Runner ルーティングの閾値意思決定マトリクス+コピペ可能なタイムアウト一覧+FAQ
プラットフォームチームは「読み取り専用ミラーをリージョン別物理 Mac Runner の横に置く」案と「開発者オフィス WAN 側に置く」案の間で揺れがちです。本記事では取得の長尾・データ所在地・ルーティングの 3 つの承認向け閾値マトリクス、7 ステップの展開 Runbook、Git/curl/SPM 周辺のコピペ用タイムアウト、FAQ、およびキューとミスマッチの隠れコストをまとめます。
1. ペインポイント
- パスのミスマッチ: Runner は東京だがプライベートコンテナレジストリと Git LFS は us-west にあり、キューは空いていても resolve/取得が壁時計の 40% 超を食う──「国は合っているのに遅い」状態になります。
- コンプライアンスと性能: データ所在地で EU ビルドと成果物が必須なのに、npm/CocoaPods キャッシュが本社 1 拠点──ポリシー違反か、全ジョブが越境 tarball 取得の二択になります。
- 見えにくい安定性: タイムアウトを上げると輻輳や DNS のジッターを隠し、30 分ジョブが「たまに通る」状態に。リージョン+能力のルーティングが無いと、カナリアと本番が誤った上流ミラーを共有します。
キャッシュ統制や依存の隣接論点は iOS ビルドキャッシュと Derived Data のリージョン戦略 と併読すると一貫します。ボトルネックが依存取得ではなく Apple 向けアップロード脚なら 2026年 TestFlight 自動アップロード:Runner 同区と ASC 近接の切り分け と対照してください。
2. プライベートリポ/ミラー:Runner 同区 vs 開発者同区
「開発者同区」はオフィス WAN、VPN、本社 IDC の入口を指すことが多いです。「Runner 同区」は xcodebuild/archive を実行する物理 Mac と同じクラウドリージョンまたはメトロです。CI ホットパス上の読み取り専用依存とインデックスミラーは Runner に従うのが既定。ソース閲覧用の厚いクライアントは開発者側に残せます。
| シグナル/指標 | 優先:マルチリージョン物理 Mac Runner と同リージョン | 優先:開発者ネットワーク近傍(または二系統入口) |
|---|---|---|
| resolve/取得が壁時計に占める割合 | ログに大洋横断 RTT があり ≥35% | <15%、コンパイルとテストが支配的 |
| 成果物トラフィックの向き | Runner が GB 級バイナリ/LFS を繰り返し取得 | エンジニアのローカル pod install/SPM resolve が主 |
| 変更頻度 | CI が同一キャッシュ名前空間を時間あたり何十回も叩く | 社内ドキュメントや低頻度 spec リポ(日次更新) |
| 監査の焦点 | ビルダーが依存で外向きイグレスしないことを証明する必要 | エンジニアが SSO を迂回して公開上流に触れないこと |
3. 取得長尾の閾値:レプリカ、プライベートリンク、タイムアウト?
「遅い」を構造的(距離・帯域)とエピソード的(輻輳、証明書、プロキシ)に分けます。前者はトポロジー、後者は再試行・並列上限・低速検知で扱います。
| 観測(P95) | 第 1 アクション | 第 2 アクション |
|---|---|---|
| Runner→レジストリ RTT 80〜150ms で安定 | 同リージョン読み取り専用レプリカ+コンテンツアドレスキャッシュ | クラウドのプライベートリンクまたはピアリング |
| RTT は低いが稀に 10× スパイク | 同時取得数の上限、Git 低速検知の有効化 | 企業プロキシまたは透過プロキシのタイムアウト調査 |
| SPM/CocoaPods の解決失敗率 >2%/週 | インデックスミラーの版固定とロールバック | 解決実験専用のステージングキュー |
| コンプライアンスゾーンがビルダーの外向きインターネットを禁止 | ゾーン内フルミラー+人間によるプロモーション経路 | 「タイムアウトだけ」は有効な修正ではない |
4. コンプライアンス(データ所在地)× Runner ルーティング
コンプライアンスは多くの場合、ビルド成果物・ログ・鍵素材を境界内に留めることであり、「全開発者が EU VPN するか」ではありません。ポリシーをキュー規則に翻訳し、リージョンラベルで Runner・ミラー・成果物バケットを束ね、ジョットが漂流しないようにします。
| コンプライアンス目標 | ミラー/成果物の置き場所 | Runner ルーティングの注意 |
|---|---|---|
| ビルドと署名を EU に留める | EU 読み取り専用ミラー+ EU オブジェクトストレージ | region=eu と notary=eu キューは非 EU Runner を除外 |
| ソースを信頼できない法域に永続させない | Git と企業 KMS は本社側、CI は短命トークン | エフェメラルワークスペース+ビルド後ワイプ |
| APAC の R&D は公開コンポーネント利用可 | APAC キャッシュは公開座標とスクラブ済み tarball のみ | 顧客データを含む社内パッケージを APAC キャッシュへ同期しない |
5. 7 ステップ展開 Runbook
- パイプラインログを Git fetch、SPM resolve、pod install、archive、テスト、アップロードなどのフェーズに分割し、各フェーズの P95 が壁時計に占める割合を見積もる。
- 各バックボーン経路で Runner→プライベートレジストリ/Git/オブジェクトストレージの RTT と TLS ハンドシェイクを測定し、企業プロキシ内の二重 TLS を除外する。
- §2 のマトリクスを適用:CI 読み取り専用ミラーは Runner にコロケーション、開発者向け SSO 入口は人間が必要な場所に残す。
- リージョンごとに Xcode マイナーと Swift ツールチェインでコンテンツアドレスキャッシュ名前空間を分け、バケット間のハードリンクを禁止する。
regionとxcodeラベルを追加し、ミラー URL は読み取り専用設定で注入し個人スクリプトに依存しない。- カナリア:同リージョンレプリカ有効化後、resolve フェーズの P95 が下がるか確認。スパイクだけ改善なら DNS/プロキシ切り分けへ。
- §6 の低速・タイムアウト値を IaC、launchd、GitHub Actions の環境変数としてチェックインし、変更は PR レビュー必須にする。
6. コピペ用タイムアウトチェックリスト
以下は健全なリンクを想定した既定値です。無闇に上げないでください。ジョブが上限に張り付くなら §3 に戻りトポロジーを変え、タイムアウトだけで逃げないでください。
Git(HTTP/S)
export GIT_HTTP_LOW_SPEED_LIMIT=1000 export GIT_HTTP_LOW_SPEED_TIME=600 # 巨大 clone: git -c http.postBuffer=524288000 clone ...
curl(プローブ/ヘルスチェック)
curl -fsSL --connect-timeout 10 --max-time 120 "$URL"
CocoaPods(CDN または社内 spec git)
# CocoaPods は内部で Git/curl を使う—先に GIT_* とプロキシのタイムアウトを揃える pod install --verbose # 社内 git spec: git config http.lowSpeedLimit / lowSpeedTime と併用
SwiftPM/Xcode の解決
# xcodebuild -resolvePackageDependencies を CI で timeout/gtimeout で包む # 自前レジストリ: Runner と同じリージョンの DNS・証明書チェーン・MTU を揃える
npm/yarn(ハイブリッドのフロント系)
npm config set fetch-timeout 300000 npm config set fetch-retries 5
7. 引用用閾値とコストの目安
- 35%: resolve/取得がジョブ壁時計のこの割合を超えるなら、コンパイルコアを増やす前に Runner―ミラーのコロケーションを評価する。
- P95 80ms: Runner→プライベートレジストリ RTT がこの帯で持続する場合、大洋横断経路を疑い同リージョン読み取りレプリカを計画する。
- 2%/週: 依存解決失敗率がこれを超えるならインデックスミラーの固定と二重復号プロキシを疑う。
- コストの目安: 越境イグレス($/GB)× 日次 CI ヒットは、リージョン別読み取り専用ストレージとしばしば同桁──勘ではなく請求で決める。
8. Mac mini クラスでの運用
「リージョンキャッシュ+キューラベル」は macOS 上が最も安価に着地します。AFP/SMB、NFS、オブジェクトストレージマウントがネイティブで、コンテナ化ビルダー向けの別ドライバ行列が要りません。Apple Silicon Mac mini は統合メモリ帯域が高く、アイドル電力はおおよそ 4W 級──長寿命の読み取り専用依存エッジを温存する用途に向きます。macOS のクラッシュ率は低く、Gatekeeper・SIP・FileVault により、汎用 PC へレジストリ資格情報を散らすよりセキュリティレビューに通りやすいです。
地理ごとに同一フォームファクタ・同一イメージ系譜・同一監査ストーリーが必要なら、リージョン別物理 Mac プールの実務標準は Mac mini ノードです。
iOS/macOS CI を「動く」から「リージョン SLO に署名できる」へ進めるなら、Mac mini M4 は優れた入口構成です──レンタルまたはスケールでリージョン別物理 Mac 容量を確保し、プライベートリポとミラーを Runner の真正横に置きましょう。
9. FAQ
プライベート npm/PyPI 形式のバイナリや CocoaPods spec リポジトリは Runner と同じリージョンに置く必要がありますか?
CI ホットパス上の読み取り専用依存と spec インデックスは、物理 Mac Runner と同じクラウドリージョンまたはメトロに既定で読み取り専用ミラーを置きます。開発者ノート PC はオフィス SSO から同一論理リポジトリに届けて構いませんが、Runner が単一プライマリへ大洋横断する構成は避けます。
コンプライアンスで EU ビルドが必須だが開発者は APAC にいます。ミラーはどこに置きますか?
Runner と読み取り専用ミラーを EU に置きます。APAC エンジニアにはスクラブ済みまたは公開のみのキャッシュを渡し、ソースとシークレットは統制システムに残します。ポリシーで許されるメタデータ層だけ越境レプリケーションします。
リージョンレプリカを増やすか、タイムアウト調整か、どう選びますか?
安定した P95 でスパイクだけなら並列を下げ Git/curl の低速設定を調整。P95 が高く Runner→レジストリ RTT がログ上で解決時間のおおよそ 35% 超を支配するなら、同リージョンレプリカやプライベートリンクを追加し、タイムアウトを無限に伸ばさない。
Runner ラベルで「依存のローカリティ」をどう表現しますか?
リージョンと能力タグを併用します。例:region=us-west、registry-mirror=internal、xcode-16.2。ラベル付きジョブが誤リージョンの Runner に落ちないようキューを配線します。
マルチリージョンの物理 Mac で iOS/macOS CI を回していますか?
Runner とプライベートミラーをコロケーションし、resolve の長尾を圧縮。リージョン別ビルドプールをオンデマンドで立ち上げられます。