密閉型

問題を報告する ソースを表示 夜間 7.4 をタップします。 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

概要

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

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

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

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

利点

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

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

気密性の欠如の特定

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

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

気密性のないビルドのトラブルシューティング

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

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

Bazel による完全性

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