
npm workspaces によるモノリポ環境で Dependabot version updates を試してみた
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、CX事業本部 Delivery部の若槻です。
npm workspaces を利用すると、複数の npm プロジェクト(workspace)から成るモノリポ環境を容易に管理することができます。
今回は npm workspaces を利用した環境で Dependabot version updates を試してみました。
試してみた
環境準備
npm を初期化します。
npm init -y
workspaces を2つ作成します。
npm init -w ./sub1 -y npm init -w ./sub2 -y
version updates の機能を試すため、バージョンが最新より低いパッケージをインストールします。
npm i -D esbuild@0.18.16 -w sub1 npm i dayjs@1.11.8 -w sub2
package.json は各 workspaces に作成されます。一方で node_modules および package-lock.json はルートに作成され、各 workspaces から参照されます。
$ tree -L 2
.
├── README.md
├── node_modules
│   ├── @esbuild
│   ├── dayjs
│   ├── esbuild
│   ├── sub1 -> ../sub1
│   └── sub2 -> ../sub2
├── package-lock.json
├── package.json
├── sub1
│   └── package.json
└── sub2
    └── package.json
Dependabot version updates
そもそも npm workspaces 環境で Dependabot version updates を利用する場合の情報がドキュメントで見当たらなかったのですが、下記 Issue でのコメントが参考になりました。
構成ファイルを作成します。
mkdir .github touch .github/dependabot.yml
npm workspaces 環境では次のようにトップレベルを対象にすれば良いようです。
version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: weekly
変更を GitHub にプッシュします。
Dependabot のチェック対象のファイルにルートおよび各 workspace の package.json および package-lock.json が含まれていることが確認できます。

そしてチェックが完了すると、各 workspace に対するバージョンアップデートの Pull Request が自動作成されました。良さそうですね。
 

Grouped version updates
最近、Dependabot により必要以上に Pull Request が分かれることを防ぐための機能として、Grouped version updates for Dependabot が利用可能となりました。この機能が npm workspaces 環境でも利用できるのか試してみます。
構成ファイルを設定します。
version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: weekly
    groups:
      dependencies:
        patterns:
          - "*"
変更を GitHub にプッシュすると、workspace 横断のバージョンアップデートの Pull Request が作成される挙動となりました。

ただし、Grouped version updates を有効にする以前にオープンされていた既存の Pull Request は、workspace を使用しない場合とは異なり、自動でクローズされる挙動とはならないようです。

おわりに
npm workspaces によるモノリポ環境で Dependabot version updates を試してみました。
はじめはサブプロジェクトごとに update の定義を記述する必要があると考えていましたが、トップレベルだけを記述すれば良いのはとても便利ですね。
以上











