npm workspaces によるモノリポ環境で Dependabot version updates を試してみた

2023.07.28

こんにちは、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 環境では次のようにトップレベルを対象にすれば良いようです。

.github/dependabot.yml

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 環境でも利用できるのか試してみます。

構成ファイルを設定します。

.github/dependabot.yml

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 の定義を記述する必要があると考えていましたが、トップレベルだけを記述すれば良いのはとても便利ですね。

以上