スクリプトから 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 内部用に予約されています。49
- Google 内部用に予約されています。
コマンド bazel build
、bazel test
のリターンコード:
1
- ビルドが失敗しました。3
- ビルドは成功しましたが、一部のテストが失敗またはタイムアウトしました。4
- ビルドは成功しましたが、テストがリクエストされてもテストが見つかりませんでした。
bazel run
の場合:
1
- ビルドが失敗しました。- ビルドが成功しても、実行されたサブプロセスがゼロ以外の終了コードを返す場合は、コマンドの終了コードにもなります。
bazel query
の場合:
3
- 部分的成功ですが、クエリで入力 BUILD ファイルセットで 1 つ以上のエラーが発生したため、オペレーションの結果の信頼性は 100% ではありません。これは、コマンドラインの--keep_going
オプションが原因である可能性があります。7
- コマンドの失敗。
今後の Bazel バージョンでは、終了コードが追加されます。これにより、一般的な障害終了コード 1
が、特定の意味を持つゼロ以外の別の値に置き換えられます。ただし、0 以外の exit 値は常にエラーとなります。
.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 を指定してください。
プロファイリングによるパフォーマンスのトラブルシューティング
「パフォーマンス プロファイリング」セクションをご覧ください。