ご不明な点やサポートが必要な場合は、ヘルプをご覧ください。
Bazel とは
Bazel は、ソフトウェアのビルドとテストを自動化するツールです。サポートされているビルドタスクには、コンパイラとリンカーを実行して実行可能プログラムとライブラリを生成することや、Android、iOS、その他のターゲット環境用のデプロイ可能なパッケージを組み立てることが含まれます。Bazel は、Make、Ant、Gradle、Buck、Pants、Maven などの他のツールと似ています。
Bazel の特徴
Bazel は、Google でのソフトウェア開発の方法に合わせて設計されています。これには、次のような機能があります。
- 多言語サポート: Bazel は多くの言語をサポートしており、任意のプログラミング言語をサポートするように拡張できます。
- 高レベルのビルド言語: プロジェクトは
BUILD言語で記述されます。これは、プロジェクトを相互接続された小さなライブラリ、バイナリ、テストのセットとして記述する簡潔なテキスト形式です。一方、Make などのツールでは、個々のファイルとコンパイラの呼び出しを記述する必要があります。 - マルチプラットフォーム サポート: 同じツールと同じ
BUILDファイルを使用して、さまざまなアーキテクチャやプラットフォーム向けのソフトウェアをビルドできます。Google では、データセンターのシステムで実行されるサーバー アプリケーションからモバイル デバイスで実行されるクライアント アプリまで、あらゆるものを Bazel でビルドしています。 - 再現性:
BUILDファイルでは、各ライブラリ、テスト、バイナリで直接的な依存関係を完全に指定する必要があります。Bazel はこの依存関係情報を使用して、ソースファイルを変更したときに再ビルドする必要があるものと、並行して実行できるタスクを把握します。つまり、すべてのビルドは段階的であり、常に同じ結果が生成されます。 - スケーラブル: Bazel は大規模なビルドを処理できます。Google では、サーバー バイナリに 10 万個のソースファイルが含まれていることが一般的で、ファイルが変更されていないビルドには約 200 ミリ秒かかります。
Google が... を使用しない理由
- Make、Ninja: これらのツールを使用すると、ファイルのビルドに使用されるコマンドを非常に正確に制御できますが、正しいルールを作成するのはユーザーの責任です。
- ユーザーは Bazel をより高いレベルで操作します。たとえば、Bazel には「Java テスト」、「C++ バイナリ」、「ターゲット プラットフォーム」、「ホスト プラットフォーム」などの概念の組み込みルールがあります。これらのルールは、失敗しないようにテストされています。
- Ant と Maven: Ant と Maven は主に Java 向けですが、Bazel は複数の言語を処理します。Bazel では、コードベースを再利用可能な小さな単位に分割することをおすすめします。また、再ビルドが必要なものだけを再ビルドできます。これにより、大規模なコードベースを扱う場合でも開発を迅速化できます。
- Gradle: Bazel 構成ファイルは Gradle の構成ファイルよりも構造化されているため、Bazel は各アクションの正確な動作を把握できます。これにより、並列処理が増え、再現性が向上します。
- Pants、Buck: どちらのツールも、Twitter と Foursquare、Facebook の元 Google 社員によって作成、開発されました。Bazel をモデルにしていますが、機能セットが異なるため、Google にとっては実行可能な代替手段ではありません。
Bazel の由来
Bazel は、Google が社内でサーバー ソフトウェアのビルドに使用しているツールのフレーバーです。サーバーに接続するモバイルアプリ(iOS、Android)など、他のソフトウェアのビルドにも拡張されています。
内部ツールをオープンソースとして書き直しましたか?フォークですか?
Bazel は、内部ツールとほとんどのコードを共有しており、そのルールは毎日何百万ものビルドに使用されています。
Google が Bazel を構築した理由
以前、Google は大規模な生成された Makefile を使用してソフトウェアをビルドしていました。これにより、ビルドが遅く、信頼性が低くなり、デベロッパーの生産性と企業の俊敏性が低下し始めました。Bazel はこれらの問題を解決する方法でした。
Bazel にはビルド クラスタが必要ですか?
Bazel はデフォルトでビルド オペレーションをローカルで実行します。ただし、Bazel はビルド クラスタに接続して、ビルドとテストをさらに高速化することもできます。詳細については、リモート実行とキャッシュ保存とリモート キャッシュ保存に関するドキュメントをご覧ください。
Google の開発プロセスはどのように機能しますか?
サーバー コードベースには、次の開発ワークフローを使用します。
- すべてのサーバーコードは、1 つの巨大なバージョン管理システムにあります。
- すべてのユーザーが Bazel でソフトウェアをビルドします。
- ソースツリーの異なる部分を所有するチームが、コンポーネントを
BUILDターゲットとして提供します。 - ブランチは主にリリースの管理に使用されるため、すべてのユーザーがヘッド リビジョンでソフトウェアを開発します。
Bazel はこの理念の基盤です。Bazel ではすべての依存関係を完全に指定する必要があるため、変更の影響を受けるプログラムとテストを予測し、送信前に確認できます。
Google の開発プロセスの詳細については、eng tools ブログをご覧ください。
Bazel をオープンソース化した理由
ソフトウェアのビルドは楽しくて簡単であるべきです。ビルドが遅く、予測できないと、プログラミングの楽しさが失われます。
Bazel を使用する理由
- Bazel は、再コンパイルが必要なファイルのみを再コンパイルできるため、ビルド時間を短縮できます。同様に、変更されていないことがわかっているテストの再実行をスキップできます。
- Bazel は決定論的な結果を生成します。これにより、増分ビルドとクリーンビルド、ノートパソコンと CI システムなどの間のスキューが解消されます。
- Bazel は、同じワークスペースから同じツールを使用して、さまざまなクライアント アプリとサーバー アプリをビルドできます。たとえば、1 回の commit でクライアント/サーバー プロトコルを変更し、更新されたモバイルアプリが更新されたサーバーで動作することをテストできます。どちらも同じツールでビルドし、前述の Bazel のメリットをすべて活用できます。
例を見ることはできますか?
はい。簡単な例をご覧になるか、複雑な例についてはBazel ソースコードをご覧ください。
Bazel の得意なこと
Bazel は、次のプロパティを持つプロジェクトのビルドとテストに優れています。
- 大規模なコードベースを持つプロジェクト
- コンパイル済み言語で記述されたプロジェクト
- 複数のプラットフォームにデプロイするプロジェクト
- 広範なテストを行うプロジェクト
Bazel を実行できる場所
Bazel は、Linux、macOS(OS X)、Windows で実行されます。
プラットフォームで JDK が利用可能であれば、他の UNIX プラットフォームへの移植は比較的簡単です。
Bazel を使用すべきでない場合
- Bazel はキャッシュ保存についてスマートに処理しようとします。つまり、出力がキャッシュに保存されないビルド オペレーションの実行には適していません。たとえば、次の手順は Bazel から実行しないでください:
- インターネットからデータを取得するコンパイル ステップ。
- サイトの QA インスタンスに接続するテストステップ。
- サイトのクラウド構成を変更するデプロイ ステップ。
- ビルドがいくつかの長い連続したステップで構成されている場合、Bazel はあまり役に立たない可能性があります。長いステップを、Bazel が並行して実行できる小さな個別のターゲットに分割すると、速度が向上します。
Bazel の機能セットの安定性
コア機能(C++、Java、シェルルール)は Google 内で広く使用されているため、徹底的にテストされており、変更はほとんどありません。同様に、回帰を見つけるために、毎日数十万のターゲットで Bazel の新しいバージョンをテストし、毎月複数回新しいバージョンをリリースしています。
つまり、試験運用版とマークされている機能を除き、Bazel は正常に動作します。試験運用版以外のルールへの変更は下位互換性があります。機能サポート ステータスの詳細については、サポート ドキュメントをご覧ください。
バイナリとしての Bazel の安定性
Google では、Bazel のクラッシュが非常にまれであることを確認しています。これはオープンソース コードベースにも当てはまります。
Bazel の使用を開始するにはどうすればよいですか?
スタートガイドをご覧ください。
Docker で再現性の問題は解決しませんか?
Docker を使用すると、Ubuntu 12.04、Fedora 21 などの固定 OS リリースでサンドボックスを簡単に作成できます。これにより、システム環境の再現性の問題(「/usr/bin/c++ のどのバージョンが必要ですか?」)が解決します。
Docker は、ソースコードの変更に関する再現性には対応していません。Docker コンテナ内で不完全に記述された Makefile で Make を実行すると、予測できない結果が生じる可能性があります。
Google では、再現性のためにツールをソース管理にチェックインします。これにより、基本ライブラリの変更(「OpenSSL の境界チェックを修正する」)と同じメカニズムで、ツールの変更(「GCC を 4.6.1 にアップグレードする」)を確認できます。
Docker にデプロイするバイナリをビルドできますか?
Bazel を使用すると、C/C++ でスタンドアロンの静的にリンクされたバイナリをビルドし、Java 用の自己完結型 jar ファイルを作成できます。これらは通常の UNIX システムでの依存関係がほとんどないため、Docker コンテナ内に簡単にインストールできます。
Bazel には、より複雑なプログラムを構造化するための規則があります。たとえば、一連のデータファイルを使用する Java プログラムや、別のプログラムをサブプロセスとして実行する Java プログラムなどです。このような環境をスタンドアロン アーカイブとしてパッケージ化して、Docker イメージなどのさまざまなシステムにデプロイできます。
Bazel で Docker イメージをビルドできますか?
はい。Docker ルールを使用して、再現可能な Docker イメージをビルドできます。
Bazel はビルドを自動的に再現可能にしますか?
Java と C++ のバイナリの場合、ツールチェーンを変更しない限り、はい。カスタム レシピ(ルール内のシェル スクリプトでバイナリを実行するなど)を含むビルドステップがある場合は、次の点に注意する必要があります。
- 宣言されていない依存関係は使用しないでください。サンドボックス実行(–spawn_strategy=sandboxed、Linux のみ)は、宣言されていない依存関係を見つけるのに役立ちます。
- 生成されたファイルにタイムスタンプとユーザー ID を保存しないでください。ZIP ファイルやその他のアーカイブは特にこの影響を受けやすいです。
- ネットワークに接続しないでください。サンドボックス実行も役立ちます。
- 乱数を使用するプロセスは避けてください。特に、多くのプログラミング言語では辞書トラバーサルがランダム化されています。
バイナリ リリースはありますか?
はい。最新のリリース バイナリとリリース ポリシーをご確認ください。
Eclipse/IntelliJ/XCode を使用しています。Bazel は IDE とどのように連携しますか?
IntelliJ の場合は、IntelliJ with Bazel プラグインをご覧ください。
XCode の場合は、Tulsi をご覧ください。
Eclipse の場合は、E4B プラグインをご覧ください。
その他の IDE については、これらのプラグインの仕組みに関するブログ投稿をご覧ください。
Jenkins/CircleCI/TravisCI を使用しています。Bazel は CI システムとどのように連携しますか?
ビルドまたはテストの呼び出しが失敗した場合、Bazel はゼロ以外の終了コードを返します。これは基本的な CI 統合には十分です。Bazel は正確性を確保するためにクリーンビルドを必要としないため、ビルド/テストの実行を開始する前にクリーンアップするように CI システムを構成しないでください。
終了コードの詳細については、ユーザー マニュアルをご覧ください。
Bazel の今後の機能
ロードマップをご覧ください。
INSERT LANGUAGE HERE プロジェクトで Bazel を使用できますか?
Bazel は拡張可能です。誰でも新しい言語のサポートを追加できます。多くの言語がサポートされています。おすすめの一覧についてはビルド エンサイクロペディア、より包括的な一覧についてはawesomebazel.comをご覧ください。
拡張機能を開発する場合や、その仕組みについて学習する場合は、Bazel の拡張に関するドキュメントをご覧ください。
Bazel コードベースに貢献できますか?
すべての開発がオープンで行われないのはなぜですか?
Bazel の公開コードと内部拡張機能の間のインターフェースを頻繁にリファクタリングする必要があります。そのため、オープンで多くの開発を行うのは困難です。
Bazel のオープンソース化は完了しましたか?
Bazel のオープンソース化は進行中です。特に、次のオープンソース化に取り組んでいます。
- 多くの単体テストと統合テスト(パッチの投稿が容易になります)。
- 完全な IDE 統合。
コード以外にも、最終的には、Bazel コミュニティが参加して、すべてのコードレビュー、バグ追跡、設計上の決定を公開したいと考えています。まだ実現していないため、一部の変更は明確な説明なしに Bazel リポジトリに表示されます。透明性が低いにもかかわらず、外部のデベロッパーをサポートし、コラボレーションしたいと考えています。そのため、開発の一部は Google 内部で行われていますが、コードを公開しています。オープンモデルに移行する際に、不明な点や正当化されていない点がありましたら、お知らせください。
Bazel の一部はオープンソース化されないのですか?
はい。コードベースの一部は Google 固有のテクノロジーと統合されているか、削除する理由を探しています(または両方の組み合わせです)。コードベースのこれらの部分は GitHub で利用できず、今後も利用できない可能性があります。
チームに連絡するにはどうすればよいですか?
bazel-discuss@googlegroups.com までご連絡ください。
バグを報告するにはどうすればよいですか?
GitHub で問題をオープンしてください。
コードベースの「Blaze」という単語は何ですか?
これはツールの内部名です。Blaze は Bazel と呼んでください。
他の Google プロジェクト(Android、Chrome)が他のビルドツールを使用しているのはなぜですか?
最初の(アルファ)リリースまで、Bazel は外部で利用できなかったため、Chromium や Android などのオープンソース プロジェクトでは使用できませんでした。また、当初は Windows のサポートがなかったため、Chrome などの Windows アプリケーションのビルドに問題がありました。プロジェクトが成熟し、安定性が向上したため、Android オープンソース プロジェクトは Bazel への移行を進めています。
「Bazel」の発音
米国英語の「basil」(ハーブ)と同じように「BAY-zel」と発音します。「hazel」と韻を踏みます。IPA: /ˈbeɪzˌəl/