スクリプトから 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 が、特定の意味を持つ別のゼロ以外の値に置き換えられます。ただし、ゼロ以外の終了値はすべてエラーになります。

.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 に非常に大きな値を指定してください。

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

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