Yarn Berry “Zero-installs”:CI/CDのボトルネックを物理的に排除するアーキテクチャの真髄
開発現場において「依存関係の解決」は常にコストである。`npm install` や `yarn install` に費やされる数分間。それは単なる待ち時間ではない。CIのキューが詰まり、フィードバックループが遅延し、エンジニアのコンテキストスイッチが強制される「損失」だ。
Yarn Berry (v2+) が提示した Zero-installs は、このパラダイムを根本から破壊する。本稿では、単なる設定手順を超え、なぜこれがCI/CDにおいて最強の選択肢となり得るのか、その内部構造と実装の勘所を解き明かす。
—
1. Zero-installsの核心:なぜ「インストール」は不要なのか
従来の `node_modules` は、ディレクトリツリーという巨大で構造的な欠陥を抱えている。数万もの小さなファイルをディスクに書き込み、I/Oを飽和させ、さらにはホイスティング(平坦化)の過程で依存関係の矛盾を引き起こす。
Yarn Berryの PnP (Plug’n’Play) モードは、これらのファイルを `.yarn/cache` にZipアーカイブとして保持し、`.pnp.cjs` というマッピングファイル(依存関係の解決表)のみを生成する。
Zero-installsとは、この「解決表」と「Zipキャッシュ」そのものをGitリポジトリにコミットする戦略である。
CI環境において、パッケージのダウンロードも、解凍も、node_modulesの構築も行わない。Gitの `checkout` 完了と同時に、プロジェクトは実行可能な状態に達する。これが「Zero-installs」の正体であり、CI時間を秒単位にまで短縮する物理的なメカニズムだ。
—
2. Zero-installsを適用するための「聖域」の構築
Zero-installsを成功させるには、Yarnの設定を厳密に制御する必要がある。`.yarnrc.yml` を以下のように最適化せよ。
プロジェクトのルートにある .yarnrc.yml
nodeLinker: pnp # 必須。node_modulesを生成せず、PnPで解決する
ZipアーカイブをGit管理下に置くことでZero-installsを実現する
以下の設定で、キャッシュがローカルディレクトリに生成される
cacheFolder: .yarn/cache
依存関係を厳格に管理するため、不必要なファイルは無視する
checksumBehavior: update
重要な注意点:Git管理の最適化
キャッシュディレクトリをGitに含めるとリポジトリサイズが増大する。これを制御するために `.gitignore` を戦略的に記述する。
.gitignore
.yarn/
!.yarn/cache
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
.yarn/install-state.gz
※ `!(感嘆符)` を使用して、必要なメタデータとキャッシュのみをホワイトリスト方式で許可する。
—
3. CI/CDパイプラインでの実践:GitHub Actionsの劇的な変革
Zero-installsを導入したCIは、驚くほど簡潔になる。もはや `cache` アクションや `npm install` は不要だ。
.github/workflows/ci.yml
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# Node.jsのセットアップのみ行う
- uses: actions/setup-node@v4
with:
node-version: 20
# インストールコマンドは不要。即座にビルドへ移行する
- name: Build
run: yarn build
このパイプラインがもたらす利益:
1. ネットワーク依存の排除: npmレジストリのダウンタイムや低速な応答に左右されない。
2. 決定論的ビルド: `node_modules` の生成過程における環境差分がゼロになる。
3. コスト削減: CIの実行時間が短縮されることで、GitHub Actions等の従量課金コストが直接的に低下する。
—
4. アーキテクトとして知っておくべき「内部ハック」
PnPとDockerの親和性
Docker環境でのビルドにおいて、Zero-installsはさらに輝く。マルチステージビルドの `builder` ステージで `node_modules` をコピーする際に発生する、数千個のファイルコピーI/Oが不要になるからだ。ZipファイルをそのままCOPYするだけで環境が再現できるため、Dockerイメージのビルド速度とレイヤーの最適化において無類の強さを発揮する。
メモリ消費の最適化
PnPはNode.jsのモジュール解決をフックする。大規模なモノレポにおいてメモリ使用量が懸念される場合は、以下のフラグを検討せよ。
- `yarn config set enableGlobalCache false`: 各プロジェクトのローカルにキャッシュを完結させることで、CI環境でのキャッシュ汚染を完全に遮断する。
独自CLIによる自動化
依存関係の更新時には `yarn up` を実行するが、これをフックして自動的にPRを作成するスクリプトをCIに組み込むことを推奨する。
依存関係を更新し、Git管理下でコミットするまでを自動化
yarn up “”
git add .yarn/cache
git commit -m “chore: update dependencies”
—
5. 結論:DevOpsの先にあるもの
Zero-installsは単なる「キャッシュ戦略」ではない。それは、「依存関係の不確実性」を排除し、コードベースそのものに実行環境の完全な定義を内包させる、モダンなパッケージングの形である。
もしあなたが、CIの実行時間に頭を悩ませ、依存関係のロックの揺らぎに疲弊しているのなら、今すぐYarn Berryへの移行を検討せよ。開発効率を極限まで引き上げ、エンジニアが「本来書くべきコード」に集中できる環境を構築することこそが、我々アーキテクトの真の責務である。
この技術をマスターしたとき、あなたのパイプラインは、もはや「待つもの」ではなく、「即座に結果を返す強力な武器」へと進化しているはずだ。