このページでは、気密性、気密性ビルドを使用するメリット、ビルド内の気密性のない動作を特定するための戦略について説明します。
概要
同じ入力ソースコードとプロダクト構成が指定された場合、気密性の高いビルドシステムは、ビルドをホストシステムの変更から分離することで、常に同じ出力を返します。
ビルドを分離するため、気密性の高いビルドでは、ローカルまたはリモートのホストマシンにインストールされているライブラリやその他のソフトウェアの影響を受けません。コンパイラなどの特定のバージョンのビルドツールと、ライブラリなどの依存関係に依存します。これにより、ビルド環境外のサービスに依存しないため、ビルドプロセスが自己完結型になります。
気密性には次の 2 つの重要な側面があります。
- 分離: 気密性の高いビルドシステムでは、ツールはソースコードとして扱われます。ツールのコピーをダウンロードし、管理対象ファイル ツリー内でストレージと使用を管理します。これにより、インストールされている言語のバージョンなど、ホストマシンとローカル ユーザーが分離されます。
- ソース ID: 気密型ビルドシステムは、入力の同一性を保証しようとします。Git などのコード リポジトリは、一意のハッシュコードを使用してコード変異のセットを識別します。気密性の高いビルドシステムは、このハッシュを使用してビルドの入力に対する変更を特定します。
利点
気密ビルドの主なメリットは次のとおりです。
- 速度: アクションの出力をキャッシュに保存できるため、入力が変更されない限り、アクションを再度実行する必要はありません。
- 並列実行: ビルドシステムは、指定された入力と出力に対してすべてのアクションのグラフを構築し、効率的な並列実行を計算できます。ビルドシステムはルールを読み込み、アクショングラフとハッシュ入力を計算してキャッシュに検索します。
- 複数のビルド: 同じマシンで複数の完全なビルドをビルドできます。各ビルドで異なるツールとバージョンを使用します。
- 再現性: ビルドを生成した正確な条件がわかるため、密閉型ビルドはトラブルシューティングに適しています。
気密性の欠如の特定
Bazel に切り替える準備をしている場合は、事前に既存のビルドの完全性を改善すると、移行が容易になります。ビルドの非気密性の一般的な原因は次のとおりです。
.mk
ファイルでの任意の処理- ファイルの作成が非確定的であるアクションまたはツール(通常はビルド ID またはタイムスタンプが関与)
- ホスト間で異なるシステム バイナリ(
/usr/bin
バイナリ、絶対パス、ネイティブ C++ ルールの自動構成用のシステム C++ コンパイラなど) - ビルド中にソースツリーに書き込む。これにより、同じソースツリーが別のターゲットに使用されるのを防ぐことができます。最初のビルドはソースツリーに書き込み、ターゲット A のソースツリーを修正します。その場合、ターゲット B のビルドが失敗する可能性があります。
気密性のないビルドのトラブルシューティング
ローカル実行から、ローカル キャッシュ ヒットに影響する問題が、非完全なアクションを明らかにします。
- null シーケンシャル ビルドを確認する:
make
を実行してビルドが成功した場合、ビルドを再度実行してもターゲットが再ビルドされないようにします。各ビルドステップを 2 回実行するか、異なるシステムで実行し、ファイルの内容のハッシュを比較して異なる結果が得られた場合は、ビルドを再現できません。 - さまざまなクライアント マシンからローカル キャッシュヒットをデバッグする手順を実行して、クライアント環境がアクションに漏洩しているケースをすべて検出します。
- チェックアウトされたソースツリーとホストツールの明示的なリストのみを含む Docker コンテナ内でビルドを実行します。ビルドの破損とエラー メッセージは、暗黙的なシステム依存関係を検出します。
- リモート実行ルールを使用して、気密性の問題を検出して修正します。
- ビルド内のアクションはステートフルで、ビルドまたは出力に影響する可能性があるため、アクション単位で厳格なサンドボックス化を有効にします。
- ワークスペース ルールを使用すると、デベロッパーは外部ワークスペースに依存関係を追加できますが、プロセス内で任意の処理を行うことができるほど豊富です。Bazel ワークスペース ルールで非完全性のある可能性があるアクションのログを取得するには、Bazel コマンドに
--experimental_workspace_rules_log_file=PATH
フラグを追加します。
Bazel による完全性
他のプロジェクトが Bazel で完全なビルドを使用して成功した方法について詳しくは、次の BazelCon の講演をご覧ください。
- Bazel を使用したリアルタイム システムの構築(SpaceX)
- Bazel リモート実行とリモート キャッシュ(Uber、TwoSigma)
- リモート実行とキャッシュ保存によるビルド時間の短縮
- Bazel の統合: 高速な増分ビルド
- リモート実行とローカル実行
- リモート キャッシュのユーザビリティの改善(IBM)
- Bazel を使用した自動運転車の構築(BMW)
- Bazel を使用した自動運転車の構築 + Q&A(GM Cruise)