密閉性

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

概要

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

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

密閉性には重要な 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 講演をご覧ください。