2026 マルチリージョンのリモート Mac モノレポ:スパースチェックアウト、部分クローン、変更検知 Runbook

約 15 分 · MACCOME

想定読者:APAC と米国など複数リージョンでリモート Mac 上の CI を回しており、すでにGit と Docker レジストリの再試行 Runbookを適用したあとも、コンパイル開始前にオブジェクトデータベースの転送フルモノレポのマトリクスで分を消費しているチームです。成果:リンク調整は再試行 Runbook に残しつつ、部分クローン(blobless/treeless)、スパースチェックアウト、変更検知で作業ツリーとビルドグラフを縮め、M4/M4 Pro の分をコンパイラ側へ寄せます。構成:典型的な誤読六つ、戦略マトリクス、コマンド断片、六段階 Runbook、ダッシュボード向けの硬い指標三つ、締めの運用指針です。

浅いクローンと帯域が揃っても、2026 年のモノレポはなぜ詰まるのか

Apple Silicon は計算の天井を押し上げますが、モノレポではしばしばオブジェクトの実体化とワークスペースのインデックス化がボトルネックになります。単一ジョブが巨大なコミットグラフを取得し、数千ディレクトリを展開したうえで、既定では全体を走査するビルドツールへ渡る、という流れです。地域間のリンク調整は転送の尾部を短くしますが、そもそも不要だったオブジェクトの無駄までは消せません。本節では本番トリアージで繰り返し見る誤読を六つに整理します。

  1. --depth=1 を万能視する:浅い履歴は助けになりますが、既定パスではツリーと巨大 blobが作業ツリーに入り得ます。ビルドの入口がリポジトリ全体を歩くなら、無関係な設定解析で CPU が遊びます。
  2. 部分クローンの意味を無視する:--filter=blob:none(blobless)と--filter=tree:0(treeless)は、チェックアウト、スパースのコーン、Git LFS との相互作用が異なります。オンデマンド取得の挙動を文書化せずに混在させると、リモートビルダーに隠れたオンデマンド取得のスパイクが出ます。
  3. スパースのコーンが狭すぎる/広すぎる:共有 proto や SwiftPM のルートが欠けると解決が壊れ、広すぎるコーンはスパースの効果を打ち消します。再現ビルドのチェックリストに沿ったディレクトリ契約が無いと、共有マシンでドリフトが増幅します。
  4. 変更検知がリポジトリ全体のハッシュに留まる:パスフィルタやパッケージ単位の影響ロジックが無いと、ドキュメントのみの差分でもフル iOS/Android/Web マトリクスが走り、ディスクとキューを埋めます。
  5. クリーンジョブと永続ワークスペースで同一スクリプトを再利用する:永続ランナーはインデックスや中途半端なサブモジュールが蓄積し、増分ジョブの監査が難しくなります。キャッシュマウントのないクリーンジョブは、WAN 上でオブジェクト取得を繰り返します。
  6. DerivedData だけを見て .git を見ない:1TB/2TB 級のホストでも、.git の肥大化と層状のキャッシュで、コンパイル前にディスクが尽きます。閾値はマルチリージョンのレンタルガイドと同じストレージレビューに結び付けてください。

これらの制御はセルフホストランナーのガイドと組み合わせます。ランナーはどのマシンがジョブを受けるかを決め、再試行 Runbook は pull を安定させ、本稿はどれだけ取得し何をコンパイルするかを決めます。三つを同一レビューパケットで出荷してください。

マトリクス:フルクローン/部分クローン/スパースチェックアウト

リポジトリの形、オンデマンド取得への耐性、オフライン再現性の要件から、パイプライン設計レビューでコマンドを選びます。個人の慣れではなく、これらの制約を優先してください。

戦略向いているケース主な利点リスク/コスト
フルクローン+フルツリー小さめのリポジトリ、厳格なオフライン再現、初回監査挙動が最も単純で、トリアージ経路が短い巨大モノレポではオブジェクト転送とワークスペース IO が地域横断で重い
Blobless(--filter=blob:none深い履歴が要るが CI は現在のツリー中心初期 blob ダウンロードを大きく削減し、浅いクローンと相性が良いチェックアウト/ビルド中のオンデマンド blob 取得。取得率を監視する
Treeless(--filter=tree:0極端に大きいツリー、単一コミット視点ツリー実体化を先送りできるツールチェーン互換の検証が要る。トリアージの複雑さが上がる
スパースチェックアウト(コーン)サブツリーの境界が明確なマルチアプリリポジトリワークスペース IO とインデックス負荷を下げ、コーン違いの並列ジョブが可能コーン誤設定はファイル欠落を静かに招く。コーンをバージョンしレビューする
変更検知+最小マトリクスnpm/yarn/pnpm、Gradle、Bazel 風のグラフ影響閉包にコンパイルグラフを限定できるパスマップとベースライン規則の維持。取りこぼしはカナリアビルドで捕捉する

実行可能な断片:コーンとフィルタを CI に焼き込む

パスは自社のモノレポのルートに置き換えてください。treeless は単一ジョブでカナリアしてからフリートへ展開します。オンデマンド取得の尾部を抑えるため、地域横断 Runbook の GIT_HTTP_LOW_SPEED_* は維持してください。

bash
# 1) Blobless + shallow + single branch (common CI baseline)
git clone --filter=blob:none --depth=1 --single-branch \
  --branch "${BRANCH}" "https://example.com/org/monorepo.git" repo
cd repo

# 2) Sparse cone: store the list in git and require CODEOWNERS review
git sparse-checkout init --cone
git sparse-checkout set apps/ios libs/shared-contracts

# 3) Change detection sketch (implement via git diff, path prefixes, or tooling)
# BASE_SHA=$(git merge-base origin/main HEAD)
# git diff --name-only "$BASE_SHA"..HEAD | awk -F/ '{print $1"/"$2}' | sort -u

# 4) Avoid: enabling treeless globally without Xcode/SwiftPM canary jobs
warning

注意:部分クローンとスパースのコーンを併用したあと、LFS ポインタや大きなバイナリがコーン外に残ることがあります。リソースパスをコーンに足すか成果物キャッシュを使わないと、後段で「ファイル欠落」に見える不安定な失敗が出ます。

六段階 Runbook:「動く」から監査可能なテンプレまで

シークレットとランナーラベルはすでに分離されている前提です。キャッシュボリュームと .git の権限が分かれていない場合は、先にランナーガイドと再現ビルドのガイドで整えてください。

  1. モノレポのグラフを描く:iOS/Android/Web のルート、共有コントラクト、ツールチェーン用スクリプト、CI の入口を印し、作業ツリーに存在しなければならないパスを列挙します。
  2. クローンモードを実験で選ぶ:カナリアランナーでフル対 blobless、必要なら treeless を比較し、クローン時間、ディスクピーク、フルビルド成功を測ります。失敗の指紋(オンデマンド取得の嵐、欠落パス、LFS)をログに残します。
  3. スパース設定をバージョン管理する:コーン生成物を git に入れ、コーン変更時はカナリアビルドを必須にし、ローカルの ~/.gitconfig にだけ魔法の引数を置くことを禁止します。
  4. 変更検知の規則を実装する:既定ブランチとリリースブランチのベースラインを定義し、ドキュメントのみの差分では重いマトリクスを省略し、共有ライブラリ変更時は閉包を広げます。
  5. 並列度とディスク閾値:.git、ビルドキャッシュ、DerivedData を別々にアラートし、コーンが異なる複数ジョブが同一ワークスペースを共有しないようにします。
  6. 隔週レビュー:P95 が依然としてチェックアウト/インデックス支配なら、ツリーを暗黙に広げたスクリプトを探し、リージョン移動とコーン修正を同一チケットにまとめます。

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

再試行 Runbook のリンク KPI の横に置き、取得の安定性とワークスペース肥大を切り分けられます。

  1. チェックアウトからコンパイルまでの差分:クローン終了から最初のコンパイル起動までの時間です。RTT が平坦なのに上がるなら、コーン退行やインデックス肥大を疑います。
  2. オンデマンド blob 取得の件数とバイト:blobless/treeless 後は必須です。同期したスパイクは、コーンが狭すぎるか、広いパスを歩くスクリプトが原因のことが多いです。
  3. 変更検知の精度:偽陰性(取りこぼしビルド)と偽陽性(省略できたフルビルド)を追跡し、リスクが高いところはカナリアパイプラインや二重実行で守ります。

現場メモ(オーダー・オブ・マグニチュードでありベンチマークではありません):2025〜2026 年、パスが数万規模のモノレポでは、コンパイル前にワークスペース展開だけで十分単位を要することがあります。レビュー済みのスパースコーンと影響マトリクスを揃えると、同一ハードウェアでも壁時計のうちコンパイラが占める割合が上がりやすいです。したがってレンタルの経済性は CPU 層だけでなくチェックアウト方針も含めて評価してください。

ビルダーを Git のホームリージョンから恒久的に遠ざけるチームは、帯域だけでは構造的な無駄を解消しにくいです。リンク調整とコーン/検知の方針を揃えることは、主要リポジトリに macOS CI を寄せる組織の動きと一致します。夜間の「ランナーを再起動」ループを避けるため、運用マニュアルの同じ章に両方の軌道を書いてください。

レビューのたびに「とりあえずフルビルドで様子を見る」に戻ると、スパースと検知の投資が帳簿に現れません。ダッシュボードの三指標を四半期目標に結び、コーン変更と検知ルール変更を同一変更管理に載せると、リージョン移動やディスク拡張の判断が静かになります。オンデマンド取得が許容範囲を超えたら、まずコーンとスクリプトの走査範囲を疑い、帯域やマシン台数は二次です。

アドホック短期レンタルと手書きコーンでは、チーム規模のモノレポがなぜ破綻しやすいか

個人用スクリプトと単発ホストには、コーン変更の監査、キャッシュ契約、マルチリージョンでの一貫性がありません。エンジニア A のスパース設定はローカルでは通る一方、エンジニア B のクリーン CI は失敗します。リージョンを動かすと取得経路とディスク閾値が無効化されます。本番級の Apple Silicon CI には、専用ベアメタル、グローバルなリージョン選択、ベースとバーストのレンタル組み合わせが必要で、Git 方針、チェックアウト方針、コストを一枚に載せるべきです。

エグレスとディスクのヘッドルームが読めない断片化ベンダーは、チームを「フルビルドにマシンを足す」方向へ押しやすいです。再現可能なディレクトリ境界、リージョン横の水平拡張、本番に近い CI のシークレットモデルが要るチームは、短期ホストのローテーションよりプロフェッショナルな Mac クラウドに落ち着きやすいです。MACCOMEはシンガポール、日本、韓国、香港、米国東部、米国西部でMac mini M4/M4 Proのベアメタルノードを柔軟な条件で提供し、ビルダーを主要リポジトリとコーン戦略に沿わせられます。公開のレンタル料金から始め、各地域ページで確定してください。

パイロット案:主要リポジトリのリージョンに揃えたビルダーを短期レンタルし、本 Runbook を二周レビューしてから月次/四半期や 2TB 移行を決めます。「安いリージョン+フルモノレポチェックアウト」による長期請求を避けてください。

FAQ

Git/レジストリの再試行 Runbook との境界は?

再試行 Runbook はリンクパラメータを、本稿はオブジェクト量とワークスペースの範囲を担当します。取得は安定しているのに遅いなら、まず本マトリクスを開いてください。発注前にレンタル料金を確認し、必要ならヘルプセンターで運用フローをたどってください。

スパースチェックアウトと変更検知、どちらを先にしますか?

多くの場合は両方です。スパースはマシンあたりの負荷を下げ、検知はマトリクスを縮めます。コーンがまだバージョン管理されていないなら、まず影響ビルドを締め、欠落パスによる静かな失敗を避けます。詳細はヘルプセンターも参照してください。

treeless は本番に載せられますか?

非リリースブランチでカナリアし、オンデマンド取得の挙動をログに残し、Xcode/SwiftPM の検証と組み合わせてからフリートへ展開してください。条件整理はレンタル料金ページと併せて確認すると、ディスクと期間の見積りが揃いやすいです。