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

問題を報告 ソースを表示 Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

スクリプトから 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 info が最新の Bazel コマンドになるためです。ただし、--output_base オプションまたは --output_user_root オプションの設定を変更しない限り、コマンドログ ファイルの場所は変更されません。

出力の解析

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

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

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