Skip to content
Latchkey

Build Cacheとは?

build cacheは各buildステップが生成したものを記憶するため、入力が変更されていなければ、ツールは再buildする代わりに結果を再利用します。

コンパイラやbuildツールは多くの反復作業を行います。同じソースファイルは変更されるまで同じオブジェクトファイルを生成します。build cacheはそれらの中間出力と最終出力を入力をキーとして保存し、再buildをルックアップに変えます。

Build cacheとdependency cacheの違い

dependency cacheはダウンロードしたサードパーティのパッケージを保存します。build cacheはあなた自身のbuildが生成したartifact - コンパイル済みオブジェクト、トランスパイルされたbundle、taskの出力 - を保存します。これらは異なるコストを解決し、しばしば一緒に動作します。

何を再利用するかをどう判断するか

ツールはステップの入力(ソースファイル、フラグ、ツールバージョン、依存関係)をハッシュ化します。一致するハッシュがcacheに存在する場合、ステップを実行する代わりに保存された出力を取得します。これはGradle、Bazel、Turborepo、sccacheなどのツールの背後にあるエンジンです。

小さな例

sccacheでコンパイラをラップすると、ファイルの最初のbuildはソースとフラグをキーとしてオブジェクトを計算し保存します。同じ入力での後のbuildは、再コンパイルする代わりにそのオブジェクトを取得します - しばしば数分の再buildを数秒に変えます。

ローカル vs リモート

ローカルのbuild cacheは同じマシン上に存在します。エフェメラルなCI runnerでは、そのマシンはjobの後に消えます。リモートbuild cacheは多くの実行やマシンが結果を共有できるようにし、これがCIでcachingを価値あるものにします。

正確性は入力に依存する

build cacheは、そのキーが出力に影響するすべての入力を捉えている場合にのみ安全です。1つでも忘れると(env var、コンパイラフラグ)、古いまたは誤ったartifactが生成されます - 古典的な「ローカルでは動くのにCIで壊れる」cachingバグです。

重要なポイント

  • build cacheは、入力をキーとして、あなた自身のbuild出力を再利用します。
  • dependency cacheとは別物ですが、しばしばペアで使われます。
  • リモートbuild cacheこそが、エフェメラルなrunnerでcachingを有用にするものです。

関連ガイド