モノレポのビルドとは?多数のフロントエンドパッケージを一緒にビルドする
モノレポのビルドは、1つのリポジトリから関連する多数のフロントエンドパッケージをコンパイルし、理想的には変更の影響を受けたパッケージだけを再ビルドします。
フロントエンドのモノレポは、アプリ、コンポーネントライブラリ、共有ユーティリティなど、多数のパッケージを1つのリポジトリに保持します。変更のたびにそれらすべてをビルドするのは無駄です。モノレポのビルドツールはパッケージ間の依存関係をモデル化し、変更が実際に必要とする作業だけを実行します。この選択性こそが、リポジトリが大きくなってもモノレポのCIを高速に保つものです。
パッケージのtask graph
ビルドツールは各パッケージと、それらが互いにどう依存しているかを読み取り、task graphを形成します。共有パッケージへの変更は、そのパッケージとそれに依存するものを再ビルド対象としてマークし、影響を受けないパッケージはスキップされます。
影響を受けた部分だけのビルド
ベースのcommitと比較することで、ツールはどのパッケージが変更されたかを判定し、それらとその依存先だけをビルドします。大きなリポジトリでは、これによって多くのpull requestで完全な再ビルドが小さなものになります。
taskの結果をキャッシュする
- 各taskの出力は、その入力のハッシュによってキャッシュされます。
- 変更のないtaskは再実行する代わりに出力を復元します。
- remote cacheは複数のマシンやCIの実行間で結果を共有します。
一般的なツール
Turborepo、Nx、Bazelといったツールはモノレポ向けにtask graphとキャッシュを提供します。それらはスコープや設定の点で異なりますが、影響検出とキャッシュされたtaskの出力という中心的な考え方は共通しています。
CI/CDにおけるモノレポのビルド
pipelineは影響を受けたパッケージを算出し、それらのbuildとtestのtaskだけを実行し、残りはキャッシュされた出力を復元します。CIの実行間で共有されるremote cacheこそがこれをスケールさせるものであり、それがなければすべてのrunnerがすべてを再ビルドします。マネージドrunner(Latchkeyなど)はそのremote cacheを温かく保ち、モノレポのpipelineが高速なままであるようにします。
重要なポイント
- モノレポのビルドはtask graphを使って、影響を受けたパッケージだけを再ビルドします。
- ハッシュ化されキャッシュされたtaskの出力により、変更のない作業を再実行せずに復元できます。
- CIの実行間で共有される温まったremote cacheこそが、モノレポのpipelineを高速に保つものです。