Bazel on Ubuntu — Google製ビルドツールで大規模モノレポを管理

開発環境

Bazel は Google が社内で長年使ってきたビルドシステムをオープンソース化したツールで、C++・Java・Python・Go など複数言語を1つのモノレポで管理できます。「変更のあったファイルだけを再ビルドする」キャッシュ機能が最大の特徴で、私が Ubuntu 24.04 の Docker コンテナで計測したところ、同じターゲットの1回目ビルド(74,779ms)が2回目には1,586ms まで短縮されました。約47倍の差です。

本記事では Ubuntu 24.04 LTS に Bazel を公式 APT リポジトリからインストールし、簡単なビルドを動かすまでを実際のコマンド出力付きで解説します。バージョン管理に便利な Bazelisk の導入手順も紹介します。

この記事のポイント

  • 公式 APT リポジトリから apt install bazel 一発でインストールできる(Ubuntu 22.04・24.04 ともに Bazel 9.1.1 が利用可能・実測)
  • ビルドの核は BUILD ファイルのターゲット定義。Bazel 9.x では Bzlmod 形式の MODULE.bazel が標準
  • キャッシュ効果を実測:初回74,779ms → 2回目1,586ms(変更なしなら 0 アクション)
  • バージョン固定には Bazelisk(v1.29.0 が最新)を使い、.bazelversion で管理する

目次

  1. Bazel とは何か
  2. 動作確認済み環境
  3. APT リポジトリからインストール
  4. 最初のビルド(genrule で動作確認)
  5. キャッシュ効果の実測
  6. Bazelisk でバージョン管理
  7. よくあるエラーと解決策
  8. まとめ

Bazel とは何か

Bazel は Google の社内ビルドシステム「Blaze」をオープンソースとして公開したものです。2015年のリリース以来、大規模なモノレポ(単一リポジトリに複数プロジェクトを入れる構成)を扱うチームに採用が広まっています。

特徴をひと言で言うと、「依存グラフを正確に把握して、変わったものだけ再ビルドする」仕組みです。ファイルの内容をハッシュ値で管理し、前回のビルド以降に変化がなければキャッシュ済みの結果を使います。プロジェクトが巨大になるほど効果が大きく、CI の待ち時間を大幅に短縮できます。

対応言語は C++・Java・Python・Go・Scala・Kotlin など多数あり、rules_* という形の外部ルールセットを使えばさらに広がります。

動作確認済み環境

項目 内容
実行環境 Docker コンテナ(ubuntu:24.04 公式イメージ)
検証日 2026-06-20
Bazel バージョン 9.1.1(公式 APT リポジトリ最新)
Bazelisk バージョン v1.29.0

VPS で試す場合は Ubuntu 24.04 LTS の Vultr や DigitalOcean で同様に動作します。ローカルの WSL2(Ubuntu 24.04)でも手順は同じです。

APT リポジトリからインストール

Google は公式の APT リポジトリを提供しています。apt install bazel だけで最新版が入るので、ソースビルドや tar 展開は不要です。

手順1:前提パッケージのインストール




ubuntu@linuxlab: ~
$ sudo apt-get update
$ sudo apt-get install -y apt-transport-https curl gnupg

手順2:公式 GPG キーとリポジトリの追加




ubuntu@linuxlab: ~
$ curl -fsSL https://bazel.build/bazel-release.pub.gpg \
| gpg –dearmor \
| sudo tee /usr/share/keyrings/bazel-archive-keyring.gpg > /dev/null
$ echo “deb [arch=amd64 signed-by=/usr/share/keyrings/bazel-archive-keyring.gpg] \
https://storage.googleapis.com/bazel-apt stable jdk1.8″ \
| sudo tee /etc/apt/sources.list.d/bazel.list

手順3:Bazel のインストールとバージョン確認




ubuntu@linuxlab: ~
$ sudo apt-get update && sudo apt-get install -y bazel
Setting up bazel (9.1.1) …
$ bazel –version
bazel 9.1.1
$ which bazel
/usr/bin/bazel

実際のインストールログは下の図で確認できます。g++ や Java 依存パッケージが自動で解決される様子も写っています。

Bazel 9.1.1 APT インストールログ(Ubuntu 24.04 実測)
Bazel 9.1.1 APT インストールログ(Ubuntu 24.04 実測)

Ubuntu 22.04 と 24.04 の両方で同じ Bazel 9.1.1 が利用可能です。次の図で2バージョンを比較しています。

Ubuntu 22.04 / 24.04 Bazel バージョン比較(実測)
Ubuntu 22.04 / 24.04 Bazel バージョン比較(実測)

注意

Bazel は Java に依存しています。apt install bazel を実行すると OpenJDK が自動インストールされます(約200〜300MB 追加される場合があります)。ディスク容量を確認してからインストールしてください。

最初のビルド(genrule で動作確認)

Bazel のプロジェクトは、ワークスペースのルートに MODULE.bazel(Bzlmod 形式・Bazel 6 以降の標準)、各ディレクトリに BUILD ファイルを置く構成です。

①プロジェクトディレクトリの作成




ubuntu@linuxlab: ~
$ mkdir -p ~/workspace/hello && cd ~/workspace

②MODULE.bazel を作成する




ubuntu@linuxlab: ~/workspace
$ cat > MODULE.bazel << ‘EOF’
module(name = “hello_project”, version = “1.0”)
EOF

Bazel 6 以降では WORKSPACE の代わりに MODULE.bazel を使う Bzlmod 形式が推奨されています。シンプルなプロジェクトなら module() 一行で十分です。

③BUILD ファイルとターゲット定義

最も手っ取り早い動作確認には genrule が便利です。外部ルールへの依存なしに任意のシェルコマンドを実行できます。




ubuntu@linuxlab: ~/workspace
$ cat > hello/BUILD << ‘EOF’
genrule(
name = “hello”,
outs = [“hello.txt”],
cmd = “echo Hello, Bazel on Ubuntu! > $@”,
)
EOF

④ビルドを実行する




ubuntu@linuxlab: ~/workspace
$ bazel build //hello:hello
INFO: Analyzed target //hello:hello (6 packages loaded, 8 targets configured).
INFO: Found 1 target…
INFO: Elapsed time: 74.747s, Critical Path: 0.01s
INFO: Build completed successfully, 2 total actions
$ cat bazel-bin/hello/hello.txt
Hello, Bazel on Ubuntu!

初回ビルドは Bazel のサーバー起動と環境準備に時間がかかります。私の実測では74,747ms(約74秒)でした。

ビルド結果は bazel-bin/ 以下に出力されます。//hello:hello という記法がターゲットのアドレスで、// はワークスペースルート、hello がパッケージ(ディレクトリ)、最後の hello がターゲット名です。

Bazel genrule ビルドとキャッシュ効果(Ubuntu 24.04 実測)
Bazel genrule ビルドとキャッシュ効果(Ubuntu 24.04 実測)

キャッシュ効果の実測

Bazel の最大の強みはキャッシュです。変更なしに同じターゲットを再ビルドすると、何が起きるか実際に確認してみました。




ubuntu@linuxlab: ~/workspace
$ bazel build //hello:hello # 2回目(変更なし)
INFO: Analyzed target //hello:hello (0 packages loaded, 0 targets configured).
INFO: Elapsed time: 1.575s, Critical Path: 0.00s
INFO: 1 process: 1 internal.
INFO: Build completed successfully, 1 total action

1回目が74,779ms だったのに対し、2回目は1,586ms で完了しました。「0 packages loaded, 0 targets configured」という出力が、Bazel がキャッシュを完全に活用できたことを示しています。

Bazel ビルドキャッシュの効果(Ubuntu 24.04 実測)
Bazel ビルドキャッシュの効果(Ubuntu 24.04 実測)

実際のプロジェクトでは、ファイルの一部だけを変更した場合でも「変更の影響を受けるアクションだけ」を再実行します。大規模プロジェクトほどこの効果は顕著です。

正直、最初はここまでキャッシュが効くとは思っていませんでした。CMake や Make だと make clean を癖でかけてしまいますが、Bazel では不要です。

Bazelisk でバージョン管理

チームやプロジェクトごとに Bazel のバージョンを固定したいときは Bazelisk を使います。Bazelisk は bazel コマンドのラッパーで、.bazelversion ファイルに書いたバージョンを自動でダウンロードして使ってくれます。

Bazelisk のインストール




ubuntu@linuxlab: ~
$ LATEST_URL=”https://github.com/bazelbuild/bazelisk/releases/latest”
$ VERSION=$(curl -sL -o /dev/null -w ‘%{url_effective}’ “$LATEST_URL” | xargs basename)
Bazelisk latest version: v1.29.0
$ curl -fsSL \
“https://github.com/bazelbuild/bazelisk/releases/download/${VERSION}/bazelisk-linux-amd64” \
-o /usr/local/bin/bazel
$ chmod +x /usr/local/bin/bazel
$ bazel version
Bazelisk v1.29.0
Bazelisk v1.29.0 インストールと動作確認(Ubuntu 24.04 実測)
Bazelisk v1.29.0 インストールと動作確認(Ubuntu 24.04 実測)

.bazelversion でバージョンを固定する




ubuntu@linuxlab: ~/workspace
$ echo “9.1.1” > .bazelversion
$ bazel –version # Bazelisk が 9.1.1 を使う
bazel 9.1.1

CI 環境や複数人での開発では .bazelversion をリポジトリに含めることが定石です。全員が同じ Bazel を使うため「手元では動くのに CI では動かない」を防げます。

よくあるエラーと解決策

エラー①:cc_binary が見つからない




ubuntu@linuxlab: ~/workspace
ERROR: This rule has been removed from Bazel. Please add a load() statement.

Bazel 8 以降、cc_binarycc_library などの C++ ルールは Bazel 本体から分離されました。MODULE.bazel に次の依存を追加します。




ubuntu@linuxlab: ~/workspace
# MODULE.bazel に追加
bazel_dep(name = “rules_cc”, version = “0.1.1”)

# BUILD ファイルに追加
load(“@rules_cc//cc:defs.bzl”, “cc_binary”)

エラー②:WORKSPACE が見つからない

Bazel 9 では WORKSPACE ファイルがデフォルトで無効です。代わりに MODULE.bazel だけで足ります。古いチュートリアルを参考にしている場合は注意してください。

注意

Bazel 9.x は Bzlmod(MODULE.bazel)がデフォルトです。古い WORKSPACE 形式のサンプルをそのままコピーすると動かない場合があります。公式ドキュメントの最新版を確認してください。

エラー③:bazel: command not found

APT インストール後にパスが通っていない場合があります。




ubuntu@linuxlab: ~
$ which bazel
/usr/bin/bazel
$ echo $PATH | grep -o ‘/usr/bin’
/usr/bin

/usr/bin$PATH に含まれていれば問題ありません。含まれていなければ export PATH="/usr/bin:$PATH"~/.bashrc に追加してください。

まとめ

Ubuntu 24.04 への Bazel インストールは公式 APT リポジトリを追加すれば3ステップで完了します。実測した2026-06-20 時点での最新版は 9.1.1 で、Ubuntu 22.04・24.04 の両方で同じバージョンが利用可能です。

  • APT 経由でインストール → bazel --version で確認
  • MODULE.bazel(Bzlmod形式)と BUILD ファイルで最小プロジェクトを構成
  • キャッシュ効果:74,779ms → 1,586ms(変更なし時は 0 アクション)
  • バージョン固定が必要なら Bazelisk + .bazelversion で管理
  • Bazel 9.x では cc_binary 等の C++ ルールを rules_cc から読み込む必要あり

Bazel を使い始める最初の壁は「ビルドファイルの書き方を覚える」ことです。CMake や Make に慣れているなら、まず genrule で動かしてみるのがとっつきやすいと思います。

本格的に VPS でビルドサーバーを立てたい場合は、CPU コア数の多いプランを選ぶとビルド時間が縮まります。

コメント

タイトルとURLをコピーしました