Apple Silicon CI のスループットを壊す最速の方法は、キャッシュをGit ブランチ名で付けることだ。ブランチキーは Package.resolved、Podfile.lock、Gemfile.lock が静かに変わったコミット間でもグラフを再利用し、「ランダム」な赤とさらに悪いファントムグリーンを生む。2026 年は依存キャッシュをコンテンツアドレスストレージとして扱う:lockfile をハッシュし、ツールチェーンのビルド番号を固定し、キャッシュミスが健全である理由をポリシーで共有しよう。
運用コンテキスト:ディスクと成果物の保持、worktree とクリーンクローン、Runner アフィニティ。香港、日本、韓国、シンガポール、米国でより隔離された Mac mini M4 が必要なら 料金 を比較し、SSH/VNC のパターンは ヘルプ を参照。
lockfile ハッシュがブランチラベルに勝つ理由
ブランチラベルは「この開発ライン上のすべてが状態を共有する」と暗示する。依存グラフはラインに従わず、正確な解決結果に従う。1 つのマージでアプリのソースに触れずに推移的バージョンが上がり、バイナリは無効でもブランチ名は変わらない。lockfile をハッシュするとキャッシュヒットは証明義務になる:ハッシュが一致すれば、ツールチェーンを除いてリゾルバ出力が同一である証拠がある。
- 再現性:監査人は緑ビルドを特定の lockfile ダイジェストと相関できる。
- 並行 PR:同じブランチ名の 2 つの PR(fork ワークフロー)が静かに衝突しなくなる。
- ディスク経済:ハッシュ上の LRU は「ブランチフォルダごと削除」より成長を抑えやすい。
マトリクス A:エコシステム別キー設計
| エコシステム | ロック入力 | 推奨パス接尾辞 |
|---|---|---|
| SwiftPM + Xcode | Package.resolved + Xcode build |
spm/<sha256(resolved)>/xc<build> |
| CocoaPods | Podfile.lock + Ruby バージョンファイル |
pods/<sha256(lock)>/ruby<ver> |
| Bundler | Gemfile.lock |
bundle/<sha256(lock)> |
| npm / pnpm | package-lock.json または pnpm-lock.yaml |
js/<sha256(lock)>/node<major> |
マトリクス B:共有キャッシュが依然として危険な場合
lockfile ハッシュが完璧でも、リストア中に post-install スクリプトが走れば救えない。スクリプト実行をサンドボックスし復元成果物を検証しない限り、これらのジョブはコールドパスとして扱う。
| シグナル | 方針 | 緩和 |
|---|---|---|
post_install が Pods を変更 |
ジョブ間でリストアを共有しない | 毎ビルドでフックを実行し、ダウンロード blob のみキャッシュ |
| チェックサム未検証のバイナリ Pod | 信頼できない入力として扱う | リポジトリでコンテンツハッシュ付き vendor を固定 |
| Fork PR ビルド | キャッシュ名前空間を分離 | 内部モノレポのキャッシュパスを再利用しない |
監査に耐える数値デフォルト
- ハッシュアルゴリズム:正規化した lockfile バイト列の SHA-256(CI では CR/LF 差を除去)。
- LRU 幅:ホスト・エコシステムごとに直近 12 ハッシュを保持。
- 最大経過:LRU に関わらず 14 日ヒットなしなら追放。
- アラート:キャッシュボリュームが専用 CI ディスクの 70% を超えたらページ。
セキュリティ注記:キャッシュはサプライチェーンの一部だ。侵害された lockfile が共有 tarball を汚染し得るなら、盲目的な再利用より一時ダウンロード+検証を優先する。
8 つのロールアウト手順
- 棚卸し:lockfile がコミットされていないリポジトリを特定——存在するまでキャッシュを禁止。
- ダイジェスト出力:すべてのビルドで後から相関できるよう CI アーティファクトとして。
- キャッシュマウント:SPM 解決には高速 APFS ボリュームへ。ネットワーク共有は避ける。
- メトリクス配線:ヒット率、リストア秒数、追放回数。
- 文書化:CONTRIBUTING.md にコールドキャッシュ期待を記載。
- Fork ワークフローを明示テスト——信頼ティアで名前空間を分ける。
- チェックアウト方針とペア(worktree ガイド)で二重共有を避ける。
- ハードウェア拡張:追放スラッシング時は NodeMac がリージョンごとに専用 M4 を追加——調達遅延なし。
FAQ
ブランチ名キャッシュがファントムグリーンを招くのはなぜ?
lockfile 変更をまたいでバイナリを再利用するから。lockfile をハッシュし、ヒットはリゾルバ出力の一致を意味させる。
SPM と DerivedData は同じキー?
いいえ——関心の分離。SPM は解決、DerivedData はコンパイル索引でジョブやツールチェーン次元を含める。
剪定の頻度は?
上限付き LRU と最大経過追放。常にディスクアラートと結びつける。