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

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

出力ベースの選択

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

スクリプトに適した出力ベース ディレクトリを選択するかどうかは、いくつかの 要因によって異なります。ビルド出力を特定の場所に配置する必要がある場合は、使用する出力ベースを 指定します。Bazel に対して「読み取り専用」の呼び出しを 行う場合(bazel queryなど)、ロック要因がより重要になります。特に、スクリプトの複数のインスタンスを同時に実行する必要がある場合は、各 Blaze サーバー プロセスが一度に処理できる呼び出しは 1 つだけであることに注意してください。状況によっては、スクリプトの各インスタンスが順番を待つことが適切な場合もあれば、--output_base を使用して複数の Blaze サーバーを実行して使用することが適切な場合もあります。

デフォルトの出力ベース値を使用すると、ユーザーのインタラクティブな 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 - ビルドイベント サービスへの結果のパブリッシュ時の一時的なエラー。

  • 39 - Bazel で必要な Blob がリモート キャッシュから削除されました。

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

  • 45 - ビルドイベント サービスへの結果のパブリッシュ時の永続的なエラー。

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

  • 49 - 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 ファイルの読み取りを無効にする必要があります。--bazelrc=/dev/nullユーザーが優先する設定を使用してビルドを実行する場合は、デフォルトの動作が適しています。

コマンドログ

Bazel の出力は、次のコマンドで確認できるコマンドログ ファイルにも保存されます。

bazel info command_log

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

出力の解析

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

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

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