WORKSPACE ルールで非密閉型動作を見つける

問題を報告する ソースを表示

以下のホストマシンは、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: ワーカーにインストールされている構成が異なるため、ホストにインストールされているプログラムの確認には通常問題があります。