WORKSPACE ルールでの非密閉動作の検出

問題を報告する ソースを表示 ナイトリー · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

以降では、ホストマシンは Bazel が実行されるマシンです。

リモート実行を使用する場合、実際のビルドやテストのステップはホストマシン上で行われるのではなく、リモート実行システムに送信されます。ただし、ワークスペース ルールの解決手順はホストマシンで行われます。ワークスペース ルールが実行時に使用するためにホストマシンに関する情報にアクセスする場合、環境の非互換性によりビルドが破損する可能性があります。

リモート実行用に Bazel ルールを適応させるの一環として、このようなワークスペース ルールを見つけて修正する必要があります。このページでは、ワークスペース ログを使用して、問題の原因となる可能性があるワークスペース ルールを見つける方法について説明します。

気密性のないルールの検出

ワークスペース ルールを使用すると、デベロッパーは外部ワークスペースに依存関係を追加できますが、プロセス内で任意の処理を行うことができるほど豊富です。関連するすべてのコマンドはローカルで実行されるため、気密性の低下を引き起こす可能性があります。通常、非密閉動作は、ホストマシンとの通信を可能にする repository_ctx を介して導入されます。

Bazel 0.18 以降では、Bazel コマンドにフラグ --experimental_workspace_rules_log_file=[PATH] を追加すると、密閉ではない可能性のあるアクションのログを取得できます。ここで、[PATH] はログが作成されるファイル名です。

注意事項:

  • ログには、イベントの実行時にキャプチャされたイベントが記録されます。一部のステップがキャッシュに保存されている場合、ログには表示されません。完全な結果を得るには、事前に bazel clean --expunge を実行してください。

  • 関数が再実行されることがあります。その場合、関連するイベントがログに複数回表示されます。

  • 現在、Workspace のルールでは Starlark のイベントのみがログに記録されます。

ワークスペースの初期化中に実行された内容を確認するには:

  1. bazel clean --expunge を実行します。このコマンドを実行すると、ローカル キャッシュとキャッシュに保存されているリポジトリがクリーンアップされ、すべての初期化が再実行されます。

  2. Bazel コマンドに --experimental_workspace_rules_log_file=/tmp/workspacelog を追加して、ビルドを実行します。

    これにより、WorkspaceEvent タイプのメッセージを一覧表示するバイナリ proto ファイルが生成されます。

  3. 次のコマンドを使用して Bazel ソースコードをダウンロードし、Bazel フォルダに移動します。workspacelog パーサーを使用してワークスペース ログを解析できるようにするには、ソースコードが必要です。

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
    
  4. Bazel ソースコード リポジトリで、ワークスペース ログ全体をテキストに変換します。

    bazel build src/tools/workspacelog:parser
    bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog > /tmp/workspacelog.txt
    
  5. 出力は非常に詳細で、組み込みの Bazel ルールの出力を含む場合があります。

    特定のルールを出力から除外するには、--exclude_rule オプションを使用します。例:

    bazel build src/tools/workspacelog:parser
    bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog \
        --exclude_rule "//external:local_config_cc" \
        --exclude_rule "//external:dep" > /tmp/workspacelog.txt
    
  6. /tmp/workspacelog.txt を開き、安全でないオペレーションがないか確認します。

ログは、repository_ctx で実行された、非完全性保持ではない可能性のある特定のアクションの概要を示す WorkspaceEvent メッセージで構成されています。

隔離されていない可能性があるとハイライト表示されたアクションは次のとおりです。

  • execute: ホスト環境で任意のコマンドを実行します。ホスト環境に依存関係が生じる可能性があるかどうかを確認します。

  • downloaddownload_and_extract: 完全なビルドを確保するには、sha256 が指定されていることを確認します。

  • filetemplate: これはそれ自体が非気密ではありませんが、ホスト環境の依存関係をリポジトリに導入するメカニズムになる可能性があります。入力の発生元を把握し、ホスト環境に依存していないことを確認してください。

  • os: これはそれ自体が非ヘルメティックではありませんが、ホスト環境の依存関係を簡単に取得できます。通常、気密性の高いビルドでは呼び出されません。使用が完全なかどうかを評価する際は、ワーカーではなくホストで実行されていることを念頭に置いてください。通常、リモートビルドでは、ホストから環境固有の情報を取得することはおすすめしません。

  • symlink: 通常、これは安全ですが、レッドフラグを探してください。リポジトリの外部または絶対パスへのシンボリック リンクは、リモート ワーカーで問題を引き起こします。ホストマシンのプロパティに基づいてシンボリック リンクが作成されている場合も、問題が発生する可能性があります。

  • which: 通常、ホストにインストールされているプログラムを確認することは問題になります。これは、ワーカーの構成が異なる可能性があるためです。