ご不明な点やサポートが必要な場合は、ヘルプをご覧ください。
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 プログラムや、別のプログラムをサブプロセスとして実行するプログラムなどです。このような環境をスタンドアロン アーカイブとしてパッケージ化して、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/