Build Cache

現在、この機能は、Incredibuild のEnterprise、および、Business Plans でのみ利用可能で、限定的に提供されています。詳しくは、カスタマーサクセスマネージャーにご相談ください。

概要

Build Cacheは、以前のビルドの一部を再利用することで、時間とリソースを節約します。ビルドを実行ごとに、その出力をキャッシュに保存します。今後ビルドを実行する際には、変更のない部分を再生成しないよう、キャッシュを確認します。

Build Cacheに保存された以前のビルドデータを再利用することで、帯域幅に影響を与えることなくビルド時間を大幅に短縮することが可能であるため、このキャッシングは作業の効率化に大きく影響します。

これを実現するために、Build Cache には特定のシステム要件対応ツール 含まれています。

メリットとユースケース

  • 場所を選ばずに、開発者の生産性を向上させる
    すでに別の場所でビルドされている場合でも、ブランチを切り替えるたびにゼロからビルドを実行ししないことをお勧めします。Build Cacheは、以前のビルドデータを自動的に保存し、ローカルビルド時間を大幅に短縮します。

  • スピードに影響を与えることなく、自宅からビルドすることが可能
    自宅での作業は、アップストリームの帯域幅が制限されるため、構築速度に影響します。Build Cacheは、下流の帯域幅に更に依存することができ、新しいビルドを開始する際に、より高速でより良いパフォーマンスを提供します。

  • CIビルドの間にキャッシュされたデータを使用する
    Build Cacheを使用して、ひとつのCIサーバーで生成されたビルドアーティファクトを別のCIサーバーと共有し、時間とリソースを節約します。CIに対する構築体験が逐次向上します。

  • CI結果を再利用して開発ビルドを高速化
    バージョン管理からビルドを再開する際に、変更点をすべて取り込む必要があります。しかし、Build Cacheを使うことで、以前のバージョンで作業していても、後のCIビルドやワークフローで生成されたアウトプットを再利用することが可能です。

ライセンスモデル

Build Cacheは、キャッシュ コアと呼ばれる特別なライセンスを使用します。Build Cacheを使用することで、ヘルパー コアの実行時間を1時間節約することができるたびに、1つのキャッシュ コアが消費されます。キャッシュコアは再利用可能で、1時間ごとにリフレッシュされます。

キャッシュ コアを使い切っても、データはキャッシュに書き込まれますが、キャッシュ コアがリフレッシュされるまでは読み取ることができません。ライセンス使用に関する情報は、エージェントリストの上部に表示されます。

オンプレミス ライセンスに加えて Incredibuild Cloud を使用している場合は、Incredibuild CloudでBuild Cacheを使用する を参照して、これらのライセンスの相互作用について理解を深めてください。

Build Cacheはどのように機能するのか?

Build Cacheは、各タスク(コンパイルまたはその他)を検査し、既存のキャッシュ コンテンツを使用できるか、また、タスクを実行する必要があるかどうかを判断します。タスクのインプット(ソースファイル、ヘッダーファイル、プリコンパイルされたヘッダーなど)に変更がなければ、結果の成果物(オブジェクトファイル、PDBなど)にも大きな変更はないと仮定しています。ほとんどのタスクは決定論的であり、ビルド全体も決定論的であるという前提があります。ビルドが決定論的でない部分は、ビルドのたびに再実行する必要があり、Build Cacheによって改善されることはありません。

決定論的ビルドとは、同じソースコードを同じビルド環境とビルド手順でビルドして、2つのビルドで同じバイナリを生成するプロセスのことで、マシンやビルドディレクトリ、ビルド名が異なっていても問題ありません。また、異なるフォルダからコンパイルしても同じバイナリが生成されることが保証されている場合は、再現可能ビルドや密封ビルドと呼ばれることもあります。

キャッシュの作成と管理

多くの場合、コード内の依存関係に基づき、ツリー状の構造でビルドが処理されます。レイヤー 1 のファイルはレイヤー 2 のファイルを作成するために、レイヤー 2 はレイヤー 3 のファイルを作成するため、と、最終的な出力が生成されるまで同様に使用されます。

ビルドが処理されると、Incredibuild は今後使用するためにプロセスの詳細を保存します。他のファイルから生成された各処理部分は、入力ファイルと出力ファイルのペアとしてキャッシュに保存されます。幾つかのファイルを変更してからビルドを実行した場合、Build Cacheは同一部分を再利用して、プロセスの一部を実行しないようにすることができます。

Build Cacheは、重複ファイルの削除や自動クリーンアップなど、さまざまな方法で最適化されます。

ソースコードの変更

ソース ファイルが変更された場合は、当然コンパイルを再実行する必要があります。Build Cacheは、ソース ファイルの内容がキャッシュのどこにも一致しないことを識別し、これを「キャッシュ ミス」と宣言します。この時点で、タスクはビルドの一部として再実行される必要があり、新しい結果は今後使用するためにBuild Cacheに保存されます。

ソース ファイルが含まれているヘッダー ファイルが変更されたり、ヘッダーによってヘッダーが含まれている場合でも、同様の現象が発生します。Build Cacheは、各タスクでどのファイルが読み込まれたかを正確に把握しており、それらが変更されていないか確認することが可能です。コードを変更すればするほど、Build Cacheが見つけるキャッシュヒットは少なくなります。

Build Cacheはプロジェクトのフォルダ構造を認識しています。しかし、プロジェクトのルートフォルダは、すべての イニシエータ 上で同一である必要はありません。あるイニシエータはプロジェクトを C:\Project に配置し、別のイニシエータは D:\Projectを使うことができます。これらのイニシエータは共有キャッシュを効率的に使うことができます。

Build CacheとHelper Cacheの違いについて

ヘルパーにタスクが与えられると、処理に必要な入力ファイル(ソースファイルやヘッダーファイルなど)はヘルパーキャッシュに保存されます。全く同じファイルが送られてきた場合でも、Helperは再度処理を行いますが、ファイルの再転送は必要ありません。

Build Cache では、 イニシエータは既に処理されたタスクを認識し、完全に省略されます。出力ファイル(オブジェクトファイルなど)を再転送する必要はなく、タスクを再実行する必要もありません。

対応ツール

  • ビルドシステム: Incredibuild がサポートするすべてのビルドシステム 。

  • コンパイラ: cl.exe(Visual Studio 2017以上)、clang-cl.exe(ベータ版)

  • リンカ: link.exe (Visual Studio 2017 以上)。Build CacheのLink.exeサポートはデフォルトで無効になっています。プロジェクトに多くのDLLや実行可能ファイルがあり、稀にしか変更されない場合は有効にしてください。

  • /Z7 に完全に対応しています。Build Cacheを使用すると、/Ziは自動的に/Z7に変換されます。