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

問題を報告 ソースを表示

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

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

リモート実行のための 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: ワーカーで構成が異なる可能性があるため、ホストにインストールされているプログラムの確認で通常は問題が発生します。