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

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

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

リモート実行用に Bazel ルールを調整する際は、このようなワークスペース ルールを 見つけて修正する必要があります。このページでは、ワークスペース ログを使用して、問題を引き起こす可能性のあるワークスペース ルールを見つける方法について説明します。

非ハーメチック ルールを見つける

ワークスペース ルールを使用すると、デベロッパーは 外部ワークスペースに依存関係を追加できますが、プロセス内で 任意の処理を行うこともできます。関連するコマンドはすべてローカルで実行されるため、非ハーメチックの原因となる可能性があります。通常、非ハーメチックな動作は を介して導入されます repository_ctx。これにより、ホストマシンとのやり取りが可能になります 。

Bazel 0.18 以降では、Bazel コマンドに --experimental_workspace_rules_log_file=[PATH] フラグを追加することで、非ハーメチックなアクションのログを取得できます。ここで [PATH] は、ログが作成されるファイル名です。

注意事項:

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

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

  • 現在、ワークスペース ルールは 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 を開き、安全でないオペレーションがないか確認します。

ログは、 WorkspaceEvent メッセージで構成されており、 repository_ctxで実行された、非ハーメチックなアクションの概要を示しています。

非ハーメチックな可能性があるアクションは次のとおりです。

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

  • downloaddownload_and_extract: ハーメチックなビルドを確保するには、sha256 が指定されていることを確認します。

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

  • os: これ自体は非ハーメチックではありませんが、ホスト環境への依存関係を簡単に取得できます。ハーメチックなビルドでは通常、この関数は呼び出されません。 使用状況がハーメチックかどうかを評価する際は、ワーカーではなくホストで実行されていることに注意してください。通常、リモートビルドでは、ホストから環境固有の情報を取得することをおすすめしません。

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

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