スクリプトから 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=/dev/null を使用して .bazelrc ファイルの読み取りを無効にする必要があります。ユーザーが希望する設定を使用してビルドを実行する場合は、デフォルトの動作をおすすめします。

コマンドログ

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

bazel info command_log

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

出力の解析

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

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

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