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で管理する
目次
- Bazel とは何か
- 動作確認済み環境
- APT リポジトリからインストール
- 最初のビルド(genrule で動作確認)
- キャッシュ効果の実測
- Bazelisk でバージョン管理
- よくあるエラーと解決策
- まとめ
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:前提パッケージのインストール
$ sudo apt-get install -y apt-transport-https curl gnupg
手順2:公式 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 のインストールとバージョン確認
Setting up bazel (9.1.1) …
$ bazel –version
bazel 9.1.1
$ which bazel
/usr/bin/bazel
実際のインストールログは下の図で確認できます。g++ や Java 依存パッケージが自動で解決される様子も写っています。

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

注意
Bazel は Java に依存しています。apt install bazel を実行すると OpenJDK が自動インストールされます(約200〜300MB 追加される場合があります)。ディスク容量を確認してからインストールしてください。
最初のビルド(genrule で動作確認)
Bazel のプロジェクトは、ワークスペースのルートに MODULE.bazel(Bzlmod 形式・Bazel 6 以降の標準)、各ディレクトリに BUILD ファイルを置く構成です。
①プロジェクトディレクトリの作成
②MODULE.bazel を作成する
module(name = “hello_project”, version = “1.0”)
EOF
Bazel 6 以降では WORKSPACE の代わりに MODULE.bazel を使う Bzlmod 形式が推奨されています。シンプルなプロジェクトなら module() 一行で十分です。
③BUILD ファイルとターゲット定義
最も手っ取り早い動作確認には genrule が便利です。外部ルールへの依存なしに任意のシェルコマンドを実行できます。
genrule(
name = “hello”,
outs = [“hello.txt”],
cmd = “echo Hello, Bazel on Ubuntu! > $@”,
)
EOF
④ビルドを実行する
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 の最大の強みはキャッシュです。変更なしに同じターゲットを再ビルドすると、何が起きるか実際に確認してみました。
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 がキャッシュを完全に活用できたことを示しています。

実際のプロジェクトでは、ファイルの一部だけを変更した場合でも「変更の影響を受けるアクションだけ」を再実行します。大規模プロジェクトほどこの効果は顕著です。
Bazelisk でバージョン管理
チームやプロジェクトごとに Bazel のバージョンを固定したいときは Bazelisk を使います。Bazelisk は bazel コマンドのラッパーで、.bazelversion ファイルに書いたバージョンを自動でダウンロードして使ってくれます。
Bazelisk のインストール
$ 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

.bazelversion でバージョンを固定する
$ bazel –version # Bazelisk が 9.1.1 を使う
bazel 9.1.1
CI 環境や複数人での開発では .bazelversion をリポジトリに含めることが定石です。全員が同じ Bazel を使うため「手元では動くのに CI では動かない」を防げます。
よくあるエラーと解決策
エラー①:cc_binary が見つからない
Bazel 8 以降、cc_binary・cc_library などの C++ ルールは Bazel 本体から分離されました。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 インストール後にパスが通っていない場合があります。
/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 コア数の多いプランを選ぶとビルド時間が縮まります。


コメント