ツリーごとのビルドルート · ランナーの境界 · 6 ステップ Runbook · 意思決定マトリックス
Mac メッシュの小規模プールでリリース、ホットフィックス、長寿命の機能を同時に運用するプラットフォームリードとモバイル Tech Lead は、CI と人間が同じチェックアウトを競合すること、DerivedData とパッケージ キャッシュがブランチ間で共有されること、およびワークツリー パスのないシート ロックという 3 つの障害クラスに直面し続けます。この記事では、Git worktree レイアウト、ツリーごとのビルドとキャッシュのルート、ツリーに名前を付けるリース フィールドを使用して、並列処理をレビュー可能なものにするという結論を示します。共有ビルド プールの SSH とランナー、シート ロックと TTL、影響を受けるビルドとキャッシュ キー、ゴールデン イメージのドリフト チェックリスト を組み合わせてください。
チームはリモート Mac をメッシュとして扱いますが、単一の作業コピーホストごとに。ホットフィックスと長命の機能をリリースしてから、同じチェックアウトをめぐって争います。以下の 5 つのパターンは 2026 チケットに常に表示されます。 README とランナー ドキュメントにそれらを書き込むことは、理由がわからない別のマシンを追加するよりも簡単です。
レーシングgit checkoutCI に対して:エンジニアがブランチを切り替えている間に、自己ホスト型ランナーが同じパスに設定されている別のオブジェクトをフェッチします。コンパイラは、書きかけのモジュール マップを読み取ります。テストではフィクスチャが欠落します。誰も木の小道を伐採しなかったため、死後解剖で幽霊のせいにする。
共有 DerivedData およびパッケージ キャッシュ:並列ブランチは引き続き、1 つの物理ルートで Xcode、SwiftPM、または CocoaPods キャッシュを指します。 1 つの積極的なクリーンは、別のブランチの増分状態をワイプします。
ワークツリー ID のないシート ロック:ミューテックス レコードはホスト名と PID をリストしますが省略されますworktree pathそして短いHEAD。キュー メトリクスは具体的なツリーに結合できないため、オンコール SSH を実行して推測します。
インタラクティブ セッションと重複するランナーのデフォルト パス:無人xcodebuildアーカイブおよびデバイス プロンプトと同じログイン セッションを共有します。 GUI の停止とヘッドレス ジョブが増大し、夜間のタイムアウトが発生します。
クロスリージョンフェッチとシートホールド:キャッシュ世代を固定せずにリモート コンパイルするメッシュ トポロジでは、シートが占有されている間、依存関係の再試行がバルーンになり、これは、「マージ レーンの枯渇」で説明されている状況を反映します。キューとランナーのラベルをマージするCPU がアイドル状態に見える場合でも。
税金を成果物にマッピングします。機械可読ワークツリー リスト、ツリーごとの派生ルートと依存関係ルート、ランナー チェックアウト許可リスト、ロック タプル (ホスト、ツリー パス、リース ID、ツールチェーン フィンガープリント)、および 1 つの最小限のクリーン複製と増分複製のペア。これらのアーティファクトがなければ、共有プールでの並列分岐は保証されません。
組織レンズの追加: ノードが共有インフラストラクチャである場合、レビューでは、変更後も次のエンジニアが別の登録済みツリーを構築できるかどうかを回答する必要があります。変更チケットには、影響を受けるパス、グローバル クリーンが暗黙的に含まれるかどうか、および単一ツリー モードへのロールバックが必要です。
並列処理を 1 つの変更可能なデフォルト ディレクトリの共有と同一視しないでください。ディスクプレッシャー下でも評価可能git worktreeフル クローンを 2 番目のリージョンに複製する前に、オブジェクト データベースを共有します。それ以外の場合は、競合を Git から rsync および tarball キャッシュに移動するだけです。とペアリングするアーティファクトのファンアウトとrsyncバイトがコンパイル ホストから出たとき。
税金の名前が決まると、チームはマルチクローンを作成するか、チェックアウトをチャーンするか、ワークツリーを採用するかを検討します。次のセクションでは、ディスク、フェッチ コスト、運用リスクを 1 ページで比較します。
普遍的な答えはなく、当てはまるものがあるだけですブランチ並列処理、ディスク バジェット、Git リテラシー。四半期のマトリックスを出力します。エスカレーション時にデフォルトを 1 つ選択し、文書化します。
| モード | それが合うとき | アップサイド | リスク |
|---|---|---|---|
| 単一ディレクトリ、頻繁なチェックアウト | ソロノード、シリアルリリース、CI と人間の重複なし | 認知負荷が最も低い。最小のディスク | ランナーや人間との際どさ。監査が難しい |
| 複数の完全なクローン | 並列性が低く、十分なディスクがあり、フックにはハード分離が必要です | 爆発範囲をクリアします。強力なコンプライアンスのストーリー | より高度なフェッチとドリフトのメンテナンス |
| オブジェクト ストアを共有する Git ワークツリー | 2 ~ 6 個のアクティブなブランチ、中程度のディスクには監査可能な並列処理が必要 | 共有.git/objects; 1 つのツリーを切り替えても、別の作業ツリーは破壊されません | パスとプルーン ポリシーは明示的である必要があります。初心者はダメージを与える可能性があります.git/worktreesメタデータ |
並列処理のニーズすべての書き込み可能なビルド アーティファクトが 1 つのツリーにマッピングされる;それ以外の場合、赤いビルドは運に起因すると考えられます。
ワークツリーを選択した場合は、ツリーを四倍: ベアまたはプライマリ リポジトリ パス、ツリーごとHEAD、派生データ ルート、依存関係キャッシュ ルート。 3行で書けなかったら終わりです。
最も安い小切手が最初です。失敗時に停止してログを保存します。ホスト エイリアスとランナー ラベルを揃える共有ビルド プール SSH とランナー オーケストレーション.
ベアリポジトリの場所を凍結します:オブジェクト権限としてベアまたはプライマリ作業コピーを 1 つ選択します。暗黙的に禁止するgit cloneランナー スクリプトからリストにないパスに移動します。
すべてのツリーを登録します。輸出git worktree list --porcelain内部リポジトリへ。フィールドにはパス、ブランチ、HEAD を含める必要があります。
派生ルートと依存関係ルートをバインドします。ツリーごとに設定OBJROOT, SYMROOT、DerivedData または SwiftPM キャッシュ ディレクトリ。クリーンなスクリプトが隣接スクリプトにヒットしないように、名前はブランチ スラグと短いハッシュをエンコードする必要があります。
ランナーのチェックアウトを分離します。ワークツリーまたはクローン ルートを CI ジョブ専用にします。次のようなあいまいなデフォルトを決して共有しないでください~/Projects/mainインタラクティブなセッションを使用します。
リースをメタデータに埋め込みます。シートロックを取るときは、ツリーのパス、ツールチェーンのフィンガープリント、および予想される継続時間を書き込みます。のフィールドに一致しますシートロックとTTLロックがぶら下がっているのを避けるため。
剪定と回収を実行します。ステージング、リハーサルgit worktree remove孤立スキャンにより、キューに入れられたジョブによってまだ参照されているディレクトリが削除されることはありません。
~/mesh/repos/acme.git # bare recommended ~/mesh/wt/acme-release-2a9f # worktree: release/* ~/mesh/wt/acme-hotfix-7c1e # worktree: hotfix/* ~/mesh/ci/acme-merge # dedicated runner root DerivedData example: ~/mesh/dd/acme--release--2a9f ~/mesh/dd/acme--hotfix--7c1e
注記:モノリポジトリの影響を受けるビルドがすでに配置されている場合は、ツリー パスをキャッシュ キーに折りたたむ影響を受けるビルドガイドしたがって、グラフの勝利はディスク上で取り消されません。
パス内で名前を指定し、フィールドをロックできるのはファクトのみです。主観的な Xcode の感触を避けます。イメージ バッチとスナップショット ロールバック言語の場合は、次を使用します。ゴールデンイメージドリフトチェックリスト.
xcodebuild cleanツリーごとの増分クリーンと比較。グローバル クリーン リストはツリーとジョブ ID 範囲に影響を与えます。警告:1 つのメンテナンス ウィンドウ内で、大きな Xcode バンプをロールしたり、DerivedData ルートを移動したり、ランナーを再タグ付けしたりしないでください。三角測量ブロックはロールバックを二分します。
並列処理をチェックボックスに変えます。いずれかのボックスに障害が発生した場合は、シリアル リリースに戻るか、容量を追加してください。このテーブルをキュー ポリシーとマージします。シートミューテックスガイド.
| シナリオ | デフォルト | 厳密な前提条件 | 故障信号 |
|---|---|---|---|
| 小規模なチーム、並列性が低く、重複なし | 単一のディレクトリとカレンダー | 専用ノードまたは明示的な予約 | ホットフィックス週間中の謎の赤色 |
| 小規模なチーム、中程度の並列性、オーバーラップ | 2 ~ 4 つのワークツリーと分離されたランナー ルート | ツリーごとの派生ルート。ロックにはツリーパスが含まれます | クリーンスクリプトは近隣アーティファクトを削除します |
| プラットフォーム チーム、高並列処理、マルチリージョン メッシュ | 専用の CI ファンアウトと人間のパーティション | ラベルのルーティング、シート キャップ、キャッシュ生成のアラインメント | CPU がアイドル状態にある間、キューの深さは増加します |
1 人のエンジニアのメンタル マップに依存すると、人が交代するときにリスクが集中します。ワークツリー リストとパス テーブルをチェックインすると、Mac Mesh がフォークロアではなくインフラストラクチャになります。
よくある間違い:すべてのレッドビルドでグローバルクリーンに到達します。まず、共有された DerivedData ルート、またはまだシートを保持している中途半端なジョブを確認します。
チケットのないアドホック ディレクトリは、どのツリーがどのディスクをいつ所有したかを尋ねる監査に耐えることはほとんどありません。並列分岐が必要な場合専用ノード、予測可能なリージョン、契約に優しい SLA、個人のラップトップや非公式の共有ホストでは不十分です。 iOS CI、ハンドオフ、座席分離の場合文書化できるクラウド Mac Mini の容量, 通常は、VpsMesh Mac Mini クラウド レンタルの方が適しています。: リージョンと仕様ごとにプールを拡張し、パス、ロック、ランナー全体で 1 つの操作言語を話します。見る価格設定, ヘルプセンター、 そして注文追加の CI 専用ノードが必要な場合。
通常は、単一の DerivedData ルート、単一の CocoaPods または SwiftPM キャッシュ、および対話型セッションと重複するランナー チェックアウトです。各ツリーにブランチスラッグを含む予測可能なサブパスを与え、フィールドを次のように配置します。シートロックメタデータ.
共有オブジェクトを介したディスクとフェッチ時間。より厳格なパス衛生とより高い Git リテラシーがその代償となります。展開前に意思決定表を確認します。とペアにする共有プール SSH ガイドランナー トポロジの場合。
キューとランナーのラベルをマージするトランク マージ不足に対処します。この記事では、単一ホストのワークツリーの分離とキャッシュの生成について説明します。同じ変更チケット内で両方をリンクします。