密閉型

このページでは、密閉性、密閉ビルドを使用するメリット、ビルドで非密閉動作を特定するための戦略について説明します。

概要

同じ入力ソースコードとプロダクト構成が指定された場合、密閉型ビルドシステムは、ホストシステムの変更からビルドを分離することで、常に同じ出力を返します。

ビルドを分離するために、ハーメチック ビルドはローカルまたはリモートのホストマシンにインストールされているライブラリやその他のソフトウェアの影響を受けません。コンパイラなどのビルドツールや、ライブラリなどの依存関係の特定のバージョンに依存します。これにより、ビルド環境の外部のサービスに依存しないため、ビルドプロセスが自己完結型になります。

密閉性には次の 2 つの重要な側面があります。

  • 分離: 密閉型ビルドシステムはツールをソースコードとして扱います。ツールをコピーしてダウンロードし、管理対象のファイルツリー内でストレージと使用量を管理します。これにより、ホストマシンとローカル ユーザー(インストールされている言語のバージョンを含む)が分離されます。
  • ソース ID: 密閉型ビルドシステムは、入力の同一性を確保しようとします。Git などのコード リポジトリは、一意のハッシュコードでコード変更のセットを識別します。密閉型ビルドシステムは、このハッシュを使用してビルドの入力の変更を特定します。

利点

密閉ビルドの主なメリットは次のとおりです。

  • 速度: アクションの出力はキャッシュに保存できます。入力が変更されない限り、アクションを再度実行する必要はありません。
  • 並列実行: 指定された入力と出力に対して、ビルドシステムはすべての操作のグラフを構築し、効率的な並列実行を計算できます。ビルドシステムはルールを読み込み、アクション グラフとハッシュ入力を計算して、キャッシュで検索します。
  • 複数のビルド: 同じマシンで複数の密閉型ビルドをビルドできます。各ビルドでは、異なるツールとバージョンが使用されます。
  • 再現性: 密閉型ビルドは、ビルドを生成した正確な条件がわかっているため、トラブルシューティングに適しています。

非ハーメティシティの特定

Bazel への切り替えを準備している場合は、既存のビルドの密閉性を事前に改善しておくと、移行が容易になります。ビルドの非ハーメチック性の一般的な原因は次のとおりです。

  • .mk ファイルでの任意の処理
  • 通常はビルド ID やタイムスタンプを含む、非決定論的にファイルを作成するアクションまたはツール
  • ホスト間で異なるシステム バイナリ(/usr/bin バイナリ、絶対パス、ネイティブ C++ ルールの自動構成用のシステム C++ コンパイラなど)
  • ビルド中にソースツリーに書き込む。これにより、同じソースツリーが別のターゲットに使用されるのを防ぐことができます。最初のビルドはソースツリーに書き込み、ターゲット A のソースツリーを修正します。この場合、ターゲット B のビルドが失敗する可能性があります。

非ハーメチック ビルドのトラブルシューティング

ローカル実行から始めると、ローカル キャッシュ ヒットに影響する問題から非ハーメチック アクションが明らかになります。

  • null 順次ビルドを確認する: make を実行してビルドが成功した場合、ビルドを再度実行してもターゲットは再ビルドされません。各ビルドステップを 2 回実行するか、異なるシステムで実行して、ファイル コンテンツのハッシュを比較し、異なる結果が得られた場合、ビルドは再現できません。
  • さまざまなクライアント マシンからローカル キャッシュ ヒットをデバッグする手順を実行して、クライアント環境がアクションに漏洩するケースを確実にキャッチします。
  • チェックアウトされたソースツリーとホストツールの明示的なリストのみを含む Docker コンテナ内でビルドを実行します。ビルドの破損とエラー メッセージによって、暗黙的なシステムの依存関係が検出されます。
  • リモート実行ルールを使用して、密閉性の問題を検出して修正します。
  • ビルド内のアクションはステートフルで、ビルドや出力に影響を与える可能性があるため、アクションごとに厳格なサンドボックス化を有効にします。
  • ワークスペース ルールを使用すると、デベロッパーは外部ワークスペースに依存関係を追加できますが、プロセス内で任意の処理を実行できるほど柔軟性があります。Bazel コマンドに --experimental_workspace_rules_log_file=PATH フラグを追加すると、Bazel ワークスペース ルールで非ハーメチックな可能性のあるアクションのログを取得できます。

Bazel による密閉性

他のプロジェクトで Bazel を使用した密閉型ビルドがどのように成功したかについて詳しくは、次の BazelCon の講演をご覧ください。