npmのmin-release-ageに合わせてdependabotを設定してみた
はじめに
皆様こんにちは、あかいけです。
最近npm v11.10.0でmin-release-ageという機能が追加されました。
これは公開から一定日数が経過していないパッケージのインストールを防ぐことができる、サプライチェーン攻撃対策として有効な機能です。
ただ.npmrcに設定するだけでは、Dependabotが新しいバージョンのPRを作ってしまい、インストールできないバージョンへの更新PRが飛んできます。
なので今回はmin-release-ageに合わせてDependabotのcooldown設定を組み合わせることで、整合性のある依存関係管理をしてみました。
npm v11のmin-release-ageとは
npm v11.10.0で追加されたmin-release-ageは、公開から指定した日数が経過していないパッケージバージョンのインストールを防ぐ機能です。
pnpmのminimumReleaseAgeと同等の機能ですね。
設定方法は.npmrcに記載するだけです。
min-release-age=21
この場合、公開から21日未満のバージョンはインストール候補から除外されます。
なおコマンドラインから指定することもできます。
npm install --min-release-age=21
min-release-ageだけでは不十分?
.npmrcにmin-release-ageを設定するだけで、ローカルやCI上でのnpm installは守られます。
ただそれだけだと、Dependabotとの間で不整合が生じる可能性があります。
例えば以下のようなケースです。
- Dependabotが公開直後の最新バージョンへの更新PRを作成する
- PRをマージしたが、
min-release-ageによってnpm install時にそのバージョンがブロックされる package-lock.jsonに記載されたバージョンがインストールできず、ビルドが失敗する
こうした問題を避けるために、Dependabot側にも同等の待機期間を設定する必要があります。
Dependabotのcooldown設定
2025年にDependabotにcooldown機能が追加されました。
これはパッケージの新バージョンが公開されてから、PRを作成するまでの待機期間を設定できる機能です。
cooldown:
default-days: 21
semver-major-days: 21
semver-minor-days: 21
semver-patch-days: 21
semverの種別ごとに待機日数を指定できます。
今回は.npmrcのmin-release-age=21に合わせて、すべて21日間のクールダウンに統一しました。
なおsemver-XXXXX-daysが未定義の場合はdefault-daysがフォールバックとして使われるため、全種別を同じ日数にするならdefault-daysだけで十分です。
今回は設定可能なオプションの紹介も兼ねて、明示的にすべて記載しています。
設定例
ここでは個人のポートフォリオのリポジトリを例に、実際の設定内容を紹介します。
.npmrc
min-release-ageを指定するだけです。
min-release-age=21
.github/dependabot.yml
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "daily"
time: "09:00"
timezone: "Asia/Tokyo"
open-pull-requests-limit: 10
reviewers:
- "Lamaglama39"
labels:
- "dependencies"
commit-message:
prefix: "chore(deps)"
groups:
# React関連をまとめて更新
react:
patterns:
- "react"
- "react-dom"
- "react-router"
- "@react-router/*"
- "@react-three/*"
- "three"
- "@types/three"
# ビルドツール関連をまとめて更新
build-tools:
patterns:
- "vite"
- "vite-*"
- "rollup"
- "@rollup/*"
- "esbuild"
- "typescript"
- "@tailwindcss/*"
- "tailwindcss"
# Cloudflare関連をまとめて更新
cloudflare:
patterns:
- "wrangler"
- "@cloudflare/*"
- "miniflare"
# 型定義をまとめて更新
types:
patterns:
- "@types/*"
exclude-patterns:
- "@types/three"
versioning-strategy: "increase"
# .npmrcのmin-release-age=21と合わせたクールダウン設定
# セキュリティアップデートはcooldownをバイパスする
cooldown:
default-days: 21
semver-major-days: 21
semver-minor-days: 21
semver-patch-days: 21
設定のポイントをいくつか補足します。
cooldownとmin-release-ageの日数を揃える
min-release-age=21とcooldown.default-days: 21を同じ日数にすることで、DependabotがPRを作るタイミングとnpm installで実際にインストール可能になるタイミングが一致します。
グループ化でPR管理を効率化
groupsを使って関連パッケージをまとめることで、PRの数を抑えています。
cooldownを設定すると更新が溜まりやすくなるので、グループ化との相性は良いです。
今回は以下の4グループに分けました。
| グループ | 対象パッケージ | 理由 |
|---|---|---|
| react | react, react-dom, react-router, three等 | 相互依存が強いのでまとめて更新 |
| build-tools | vite, typescript, tailwindcss等 | ビルド周りは一括で動作確認したい |
| cloudflare | wrangler, @cloudflare/*等 | デプロイ先関連をまとめる |
| types | @types/*(@types/threeを除く) | 型定義は影響が小さいのでまとめて更新 |
threeと@types/threeは依存関係が強いため、typesグループではなくreactグループにまとめています。
typesグループ側ではexclude-patternsで@types/threeを除外することで、重複を防いでいます。
versioning-strategyにincreaseを指定
versioning-strategy: "increase"を指定することで、package.jsonのバージョン制約を必要に応じて引き上げてくれます。
例えば"^1.0.0"から"^1.2.0"のように、minバージョンを上げてくれるので、CI上で古いバージョンが入ってしまうリスクを減らせます。
実際の通知
設定後、実際にDependabotからPRが作成された様子です。

build-toolsグループとして、vite、tailwindcss等の5パッケージがまとめて更新されるPRが作成されています。
コミットメッセージにも設定したchore(deps)プレフィックスが反映されていますね。

tailwindcssのタグページを見ると、v4.2.0のリリースは約3週間前です。
cooldownの21日間を経過してからPRが作られていることがわかります。
さいごに
以上、npmのmin-release-ageに合わせてDependabotを設定してみました。
.npmrcとDependabotの設定を揃えるだけなので、導入自体はかなり簡単です。
サプライチェーン攻撃への対策として、個人プロジェクトでもぜひ取り入れてみてはいかがでしょうか。
この記事が誰かのお役に立てば幸いです。






