スクリプトから Bazel を呼び出す

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

スクリプトから Bazel を呼び出して、ビルドの実行、テストの実行、依存関係グラフのクエリを行うことができます。Bazel は効果的なスクリプト作成ができるように設計されていますが、ここでは、スクリプトをより堅牢にするための注意点について説明します。

出力ベースの選択

--output_base オプションは、Bazel プロセスがビルドの出力を書き込む場所と、Bazel によって内部で使用されるさまざまな作業ファイルを制御します。その 1 つは、複数の Bazel プロセスによる出力ベースの同時ミューテーションを防ぐロックです。

スクリプトに適した出力ベース ディレクトリの選択は、いくつかの要因によって異なります。ビルド出力を特定の場所に配置する必要がある場合は、使用する出力ベースを指定します。Bazel(bazel query など)に対して「読み取り専用」呼び出しを行う場合は、ロック係数がより重要になります。特に、スクリプトの複数のインスタンスを同時に実行する必要がある場合は、それぞれに異なる(またはランダムな)出力ベースを指定する必要があります。

デフォルトの出力ベース値を使用すると、ユーザーのインタラクティブ Bazel コマンドと同じロックが競合することになります。ユーザーがビルドなどの長時間実行コマンドを発行する場合、スクリプトは続行する前に、これらのコマンドが完了するのを待つ必要があります。

サーバーモードに関する注意事項

デフォルトでは、Bazel は長時間実行のサーバー プロセスを最適化として使用します。スクリプトで Bazel を実行する場合は、終了したら必ず shutdown を呼び出してください。または、アイドル状態のサーバーが迅速にシャットダウンするよう --max_idle_secs=5 を指定してください。

どのような終了コードを取得できますか?

Bazel は、検討中のソースコードに起因するエラーと、Bazel の正常な実行を妨げている外部エラーを区別しようとします。Bazel を実行すると、次のような終了コードが生成されます。

すべてのコマンドに共通の終了コード:

  • 0 - 成功
  • 2 - コマンドラインの問題、不正または無効なフラグまたはコマンドの組み合わせ、または環境変数。コマンドラインを変更する必要があります。
  • 8 - ビルドが中断されましたが、正常なシャットダウンで終了しました。
  • 9 - サーバーロックが保持され、--noblock_for_lock が渡されました。
  • 32 - 外部環境でこのマシンにエラーが発生しました。

  • 33 - Bazel がメモリ不足になり、クラッシュしました。コマンドラインを変更する必要があります。

  • 34 - Google 内部用に予約されています。

  • 35 - Google 内部用に予約されています。

  • 36 - 地域の環境問題。永久的な疑いがあります。

  • 37 - 未処理の例外 / Bazel の内部エラー。

  • 38 - Google 内部用に予約されています。

  • 39 - Bazel で必要な blob がリモート キャッシュから強制排除されます。

  • 41-44 - Google 内部用に予約されています。

  • 45 - ビルドイベント サービスへの結果のパブリッシュ中にエラーが発生しました。

  • 47 - Google 内部用に予約されています。

コマンド bazel buildbazel test の戻りコード:

  • 1 - ビルドが失敗しました。
  • 3 - ビルドは正常ですが、一部のテストが失敗するかタイムアウトになりました。
  • 4 - ビルドは成功しましたが、テストがリクエストされてもテストが見つかりませんでした。

bazel run の場合:

  • 1 - ビルドが失敗しました。
  • ビルドが成功しても、実行されたサブプロセスがゼロ以外の終了コードを返す場合、その終了コマンドはコマンドの終了コードになります。

bazel query の場合:

  • 3 - 一部成功しましたが、入力 BUILD ファイルセットで 1 つ以上のエラーが発生しました。そのため、オペレーションの結果は 100% 信頼できません。これは、コマンドラインの --keep_going オプションが原因と考えられます。
  • 7 - コマンドの失敗。

将来の Bazel バージョンでは、終了コードがさらに追加される可能性があります。一般的な障害の終了コード 1 は、特定の意味を持つゼロ以外の別の値に置き換えられます。ただし、ゼロ以外のすべての exit 値は常にエラーになります。

.bazelrc ファイルの読み取り

デフォルトでは、Bazel はベース ワークスペース ディレクトリまたはユーザーのホーム ディレクトリから .bazelrc ファイルを読み取ります。これが望ましいかどうかは、スクリプトの選択です。スクリプトを完全にリリースする(リリースビルドを行うなど)必要がある場合は、オプション --bazelrc=/dev/null を使用して .bazelrc ファイルの読み取りを無効にする必要があります。ユーザーの希望する設定を使用してビルドを実行する場合は、デフォルトの動作が適切です。

コマンドログ

Bazel 出力はコマンド ログファイルでも取得できます。次のコマンドで確認できます。

bazel info command_log

コマンド ログファイルには、最新の Bazel コマンドのインターリーブされた stdout と stderr ストリームが含まれます。bazel info を実行すると、このファイルの内容が最新の Bazel コマンドになるため、上書きされます。ただし、--output_base オプションまたは --output_user_root オプション設定を変更しない限り、コマンド ログファイルの場所は変更されません。

出力の解析

Bazel の出力は、さまざまな目的で非常に簡単に解析できます。スクリプトに役立つ可能性のある 2 つのオプションは、進行状況のメッセージを抑制する --noshow_progress と、「最新のビルド」メッセージを出力するかどうかを制御する --show_result n です。これらのメッセージは、正常にビルドされたターゲットと、作成された出力ファイルの場所を検出するために解析されます。これらのメッセージを使用する場合は、非常に大きな値 n を指定してください。

プロファイリングによるパフォーマンスのトラブルシューティング

パフォーマンス プロファイリングをご覧ください。