【テクニカル・上級編】yarnの「Zero-installs」とは?CI時間を劇的に短縮する設定と運用ガイド – ビルド・パッケージ管理ツール生産性向上バイブル

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への移行を検討せよ。開発効率を極限まで引き上げ、エンジニアが「本来書くべきコード」に集中できる環境を構築することこそが、我々アーキテクトの真の責務である。

この技術をマスターしたとき、あなたのパイプラインは、もはや「待つもの」ではなく、「即座に結果を返す強力な武器」へと進化しているはずだ。

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