密閉型

問題を報告する ソースを表示 夜間 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

概要

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

密閉型のビルドは、ビルドを分離するため、ライブラリや ローカルまたはリモート ホストマシンにインストールされている、他のソフトウェア。依存関係 ビルドツールの特定のバージョン(コンパイラ、依存関係など)が 使用できます。これにより、ビルドプロセスがリソースに依存することなく、自己完結型になります。 ビルド環境外のユーザーに サービスを提供しています

密閉性の 2 つの重要な側面は次のとおりです。

  • 分離: 密閉型のビルドシステムでは、ツールをソースコードとして扱います。。 ツールのコピーをダウンロードし、ストレージを管理し、マネージド ファイル内で使用できる 学習します。これにより、ホストマシンとローカル ユーザーが分離され、 インストールされている言語のバージョンなどです
  • ソース アイデンティティ: 密閉型のビルドシステムは、 できます。Git などのコード リポジトリは、コード ミューテーション セットを識別し、 あります。密閉型のビルドシステムでは、このハッシュを使用して、 渡します。

利点

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

  • 速度: アクションの出力をキャッシュに保存できるため、アクションを 入力が変更されない限り再実行されます
  • 並列実行: 指定された入力と出力に対して、ビルドシステムは すべての行動のグラフを作成して、効率と並列性を 実行されます。ビルドシステムがルールを読み込み、アクション グラフを計算する 入力とハッシュ入力を行い、キャッシュ内で調べます。
  • 複数のビルド: 同一のプラットフォームに対して複数の密閉型のビルドをビルドできます。 ビルドごとにツールとバージョンが異なります
  • 再現性: 密閉型ビルドはトラブルシューティングに適しています。次の理由からです。 ビルドを生成した正確な状態を知ることができます。

非密閉性の特定

Bazel に移行する準備をしている場合、改善すると移行が簡単になります 既存のビルドを確保する必要があります。一般的な原因には 次のような特性があります。

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

非密閉ビルドのトラブルシューティング

まずローカル実行では、ローカル キャッシュ ヒットに影響する問題が明らかになります 非密閉型のアクションも適用できます

  • null シーケンシャル ビルドを確実にする: make を実行してビルドが正常に行われた場合は、 再度ビルドを実行してもターゲットは再ビルドされません。ビルドのたびに 別のシステムでファイルの内容をハッシュして比較し、 結果が異なる場合、ビルドは再現できません。
  • ステップを実行して ローカル キャッシュ ヒットのデバッグ あらゆるクライアントマシンから 対策にクライアントの環境が 組み込まれているケースです
  • コンテナ イメージのみを含む Docker コンテナ内でビルドを チェックアウトされたソースツリーとホストツールの明示的なリスト。ビルドの破損と 暗黙的なシステム依存関係がキャッチされます。
  • 密閉性の問題を検出して修正する リモート実行ルール
  • 厳格なサンドボックスを有効にする ビルド内のアクションはステートフルであり、 必要があります。
  • Workspace のルール 開発者は外部ワークスペースに依存関係を追加できますが、 プロセス内で任意の処理を行えるようにします。Google Chat では 次の方法で、Bazel ワークスペース ルールで密閉されていない可能性があるアクションのログを取得できます。 フラグの追加 --experimental_workspace_rules_log_file=PATH~ Bazel コマンドを作成します。

Bazel による密閉性

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