スクリプトから 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
- Build Event Service への結果のパブリッシュ中に一時的なエラーが発生しました。39
- Bazel に必要な Blob がリモート キャッシュから強制排除されます。41-44
- Google 内部用に予約されています。45
- Build Event Service への結果の公開で永続的なエラーが発生する。47
- Google 内部用に予約されています。49
- Google 内部用に予約されています。
コマンド bazel build
、bazel 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 の出力は、さまざまな目的で簡単に解析できます。スクリプトで役立つ 2 つのオプションは、進行状況メッセージを抑制する --noshow_progress
と、「最新のビルド」メッセージが出力されるかどうかを制御する --show_result n
です。これらのメッセージは解析され、正常にビルドされたターゲットと、作成された出力ファイルの場所が検出されます。これらのメッセージに依存する場合は、非常に大きな値の n を指定してください。
プロファイリングによるパフォーマンスのトラブルシューティング
パフォーマンス プロファイリングのセクションをご覧ください。