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

問題を報告する ソースを表示 Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

出力ベースの選択

--output_base オプションは、Bazel プロセスがビルドの出力を書き込む場所と、Bazel が内部で使用するさまざまな作業ファイル(複数の 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 と、「build up-to-date」メッセージを出力するかどうかを制御する --show_result n です。これらのメッセージを解析して、どのターゲットが正常にビルドされたか、作成された出力ファイルの場所を検出できます。これらのメッセージに依存する場合は、n の非常に大きな値を指定してください。

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

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