ご不明な点やサポートのご要望がございましたら、ヘルプをご参照ください。
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 は各アクションが何をするのかを正確に把握できます。これにより、並列処理が向上し、再現性が向上します。
- ズボン、バック: どちらのツールも、Twitter、Foursquare、Facebook で元 Google 社員によって開発、開発されました。Bazel からモデル化されていますが、機能セットが異なるため、実行可能な代替手段ではありません。
Bazel の提供元
Bazel は、Google が社内でサーバー ソフトウェアを構築するために使用しているツールです。サーバーに接続するモバイルアプリ(iOS、Android)など、他のソフトウェアも拡張されています。
社内ツールをオープンソースとして書き直しましたか?フォークか?
Bazel は、ほとんどのコードを内部ツールと共有しており、そのルールは毎日何百万ものビルドに使用されています。
Bazel をビルドする理由
かなり前まで、Google は大量の生成された Makefile を使用してソフトウェアを構築していました。その結果、ビルドが遅くなり、信頼性が低下したため、デベロッパーの生産性と会社のアジリティが妨げられ始めました。Bazel がその解決方法でした。
Bazel にはビルドクラスタが必要ですか?
Bazel はデフォルトでローカルでビルド オペレーションを実行します。ただし、Bazel はビルドクラスタに接続し、ビルドとテストをさらに高速化することもできます。詳細については、リモート実行とキャッシュおよびリモート キャッシュに関するドキュメントをご覧ください。
Google の開発プロセスの仕組み
サーバー コードベースには、次の開発ワークフローを使用します。
- サーバーコードはすべて 1 つの巨大なバージョン管理システムにあります
- 全員が Bazel でソフトウェアを構築しています。
- 異なるチームがソースツリーの異なる部分を所有し、そのコンポーネントを
BUILD
ターゲットとして利用できるようにしている。 - ブランチは主にリリースの管理に使用されるため、すべてのユーザーは Head のリビジョンでソフトウェアを開発します。
Bazel はこの理念の基盤です。Bazel ではすべての依存関係を完全に指定する必要があるため、変更によって影響を受けるプログラムとテストを予測し、送信前に精査します。
Google での開発プロセスについて詳しくは、eng Tools ブログをご覧ください。
Bazel を開いた理由は何ですか?
ソフトウェアの構築は楽しくて簡単でなければなりません。時間をかけて予測できないビルドを行うことで、プログラミングが楽しくなります。
Bazel を使用する理由
- Bazel では、再コンパイルが必要なファイルのみを再コンパイルできるため、ビルド時間を短縮できます。同様に、変更がないことがわかっているテストの再実行をスキップすることもできます。
- Bazel では確定的な結果が生成されます。段階的なビルドとクリーンなビルド、ノートパソコンと CI システムなどのスキューを排除できます。
- Bazel は、同じワークスペースから同じツールを使用して、異なるクライアント アプリとサーバーアプリを構築できます。たとえば、1 回の commit でクライアントとサーバーのプロトコルを変更し、更新したモバイルアプリが更新後のサーバーで動作し、同じツールでビルドすることをテストして、前述の Bazel のメリットをすべて享受できます。
例を確認できますか?
はい。単純な例をご覧ください。また、複雑な例については、Bazel のソースコードをご覧ください。
Bazel のメリット
Bazel は、次のプロパティを含むプロジェクトの構築とテストに役立ちます。
- コードベースが大きいプロジェクト
- (複数の)コンパイル言語で作成されたプロジェクト
- 複数のプラットフォームにデプロイするプロジェクト
- 広範なテストが含まれるプロジェクト
Bazel はどこで実行できますか?
Bazel は、Linux、macOS(OS X)、Windows で動作します。
他の UNIX プラットフォームへの移植は、そのプラットフォームで JDK が利用可能である限り、簡単です。
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 プログラム、サブプロセスとして別のプログラムを実行するプログラムなどです。このような環境をスタンドアロン アーカイブとしてパッケージ化して、Docker イメージなどの異なるシステムにデプロイできます。
Bazel で Docker イメージをビルドできますか?
はい。Docker ルールを使用して、再現性の高い Docker イメージをビルドできます。
Bazel ではビルドが自動的に再現されますか?
Java と C++ バイナリの場合、ツールチェーンを変更しないと想定します。カスタム レシピに関するビルドステップがある場合(ルール内のシェル スクリプトでバイナリを実行する場合など)、特に注意が必要です。
- 宣言されていない依存関係を使用しないでください。サンドボックス実行(–spawn_strategy=sandboxed、Linux のみ)は、宣言されていない依存関係を見つけるのに役立ちます。
- 生成されたファイルにタイムスタンプやユーザー ID を保存しないようにします。ZIP ファイルなどのアーカイブの場合は特に、エラーが発生しやすくなります。
- ネットワークに接続しないサンドボックス化した実行も役に立ちます。
- 乱数を使用するプロセスは避けてください。特に、多くのプログラミング言語で辞書走査はランダム化されています。
バイナリリリースはありますか?
はい。最新のリリース バイナリを見つけて、リリース ポリシーをご確認ください。
Eclipse/IntelliJ/XCode を使用しています。Bazel と IDE の相互運用
IntelliJ については、Bazel プラグインで IntelliJ をご覧ください。
XCode については、Tulsi をご覧ください。
Eclipse をご利用の場合は、E4B プラグインをご確認ください。
その他の IDE については、これらのプラグインの仕組みに関するブログ投稿をご覧ください。
Jenkins/CircleCI/TravisCI を使用している。Bazel と CI システムの相互運用性
ビルドまたはテストの呼び出しが失敗した場合、Bazel は 0 以外の終了コードを返します。基本 CI の統合にはこれで十分です。Bazel ではクリーンなビルドが必須でないため、ビルドやテストの実行を開始する前にクリーンアップするように構成しないでください。
終了コードの詳細については、ユーザー マニュアルをご覧ください。
Bazel で今後追加される機能
ロードマップをご覧ください。
ここに「言語を挿入」プロジェクトで Bazel を使用できますか?
Bazel は拡張可能です。誰でも新しい言語のサポートを追加できます。多数の言語がサポートされています。推奨事項の一覧については、ビルドの百科事典をご覧ください。より包括的なリストについては、Awesomebazel.com をご覧ください。
拡張機能を開発する場合や、拡張機能の仕組みを確認する場合は、Bazel の拡張のドキュメントをご覧ください。
Bazel コードベースに協力できますか?
投稿に関するガイドラインをご覧ください。
開発がすべてオープンでないのはなぜですか?
Bazel の一般公開コードと内部拡張機能との間のインターフェースは頻繁にリファクタリングする必要があります。そのため、オープンに多くの開発を行うことは困難です。
Bazel のオープンソース化を完了していますか?
Bazel のオープンソース化は進行中です。特に、Google はオープンソースへの取り組みを進めています。
- 単体テストと統合テストの多くを実施(パッチ適用への貢献を簡易化します)。
- IDE の完全統合。
コードだけでなく、最終的には Bazel コミュニティとともに、コードレビュー、バグ トラッキング、設計上の決定をすべて公開したいと考えています。Bazel リポジトリにはまだ変更がないため、明確な説明がないまま変更が行われます。透明性は低いものの、Google では外部のデベロッパーをサポートし、協力したいと考えているからです。そのため、開発が Google 内部で行われていますが、Google はコードをオープンにしています。オープンモデルへの移行にあたり、不明点や不当な点がある場合はお知らせください。
オープンソース化されない Bazel の部分はありますか?
はい、一部のコードベースが Google 固有のテクノロジーと統合されているか、Google が取り除く言い訳を求めていました(または 2 つの組み合わせ)。コードベースのどの部分も 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: /ˈbeshufflezˌəl/