naoki.dev

記事検索

タイトル・本文・タグから検索します

ホームに戻る
DevOps

Renovate で依存アップデートを自動化する(pnpm + Next.js)

目次

依存パッケージの更新は、放置するとまとめて大量に溜まり、いざ上げようとすると壊れて手が付けられなくなります。Renovate を入れておけば、更新を小さな PR に分けて継続的に流してくれます。本記事では pnpm + Next.js プロジェクトへの導入と、実際にハマった Mend の設定までを紹介します。

Renovate とは

依存パッケージの新バージョンを検知して、自動で更新 PR を作ってくれるボットです。Dependabot と似ていますが、Renovate は設定の自由度が高く、PR のグルーピングや automerge が柔軟なのが強みです。

GitHub では Mend が提供する Renovate App を入れるだけで使え、リポジトリに置いた renovate.json で挙動を細かく制御します。

設定ファイルを置く

リポジトリのルートに renovate.json を作成します。今回は pnpm + Next.js 構成で、CI(lint / build)が PR で回る前提の設定です。

{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "extends": [
    "config:recommended",
    ":dependencyDashboard",
    ":semanticCommits",
    "group:monorepos",
    "group:recommended"
  ],
  "timezone": "Asia/Tokyo",
  "labels": ["dependencies"],
  "prHourlyLimit": 0,
  "prConcurrentLimit": 0,
  "rangeStrategy": "bump",
  "lockFileMaintenance": {
    "enabled": true,
    "schedule": ["before 6am on monday"],
    "automerge": true
  },
  "packageRules": [
    {
      "matchDepTypes": ["devDependencies"],
      "automerge": true
    },
    {
      "matchUpdateTypes": ["patch", "minor"],
      "automerge": true
    }
  ]
}

ポイントを順に見ていきます。

extends で土台を作る

  • config:recommended … Renovate 推奨のベース設定
  • :dependencyDashboard … 更新状況をまとめた Issue(ダッシュボード)を自動生成
  • :semanticCommits … コミットを chore(deps): ... の形式に揃える
  • group:monorepos / group:recommended … 関連パッケージをまとめて 1 PR にする

automerge を「安全な範囲だけ」効かせる

packageRules で、どこまで自動マージするかを決めます。

{
  "packageRules": [
    { "matchDepTypes": ["devDependencies"], "automerge": true },
    { "matchUpdateTypes": ["patch", "minor"], "automerge": true }
  ]
}
  • devDependencies(ESLint や Prettier など)→ CI 通過後に自動マージ
  • patch / minor → CI 通過後に自動マージ
  • major(本番依存の破壊的変更)→ ルールに含めないので手動レビュー

automerge は CI が緑であることが前提です。Renovate は CI のステータスを見てからマージするので、lint やビルドが落ちる更新は勝手に入りません。

PR 頻度はあえて制限しない

"prHourlyLimit": 0,
"prConcurrentLimit": 0

0 は「無制限」の意味です。更新が出次第すぐ PR が来るので、最新に素早く追従できます。通知が多すぎると感じたら、schedule で「毎週月曜の朝だけ」のように絞れます。

rangeStrategy: bump で package.json も更新

"rangeStrategy": "bump"

^1.2.3 のようなキャレットレンジでも、package.json の数値自体を最新に書き換えます。レンジ内に収まる更新でも記述が古いまま放置されるのを防げます。

lockFileMaintenance でロックファイルを定期掃除

"lockFileMaintenance": {
  "enabled": true,
  "schedule": ["before 6am on monday"],
  "automerge": true
}

package.json のレンジは変えずに、pnpm-lock.yaml だけを最新の解決結果に更新します。間接依存のセキュリティ修正などを取り込めるので、週 1 で回して自動マージにしています。

設定の検証

renovate.json は、Renovate 付属のバリデーターで構文チェックできます。

npx --yes --package renovate -- renovate-config-validator renovate.json
 INFO: Validating renovate.json as global config
 INFO: Config validated successfully

ハマりどころ: Mend の Silent mode

ここが一番ハマりました。Renovate App を入れて renovate.json も置いたのに、PR が一向に作られないことがあります。

原因は Mend の管理画面(Settings → Dependencies)にある Silent mode です。

  • Silent mode ON … 依存の解析はするが、PR も Dashboard の Issue も一切作らない
  • Silent mode OFF … 通常どおり PR を作成する

Silent mode が ON の間は、その下の Automated PRs などの項目がまとめてグレーアウトして操作できません。導入直後はこれが ON になっていることがあり、「設定したのに動かない」の正体になりがちです。

PR を動かす手順:

  1. Silent mode を OFF にする
  2. グレーアウトが解除されたら Automated PRs を ON
  3. renovate.json を main に置いてあるなら Create onboarding PRs は OFF でもよい(オンボーディング PR が不要になる)
  4. SAVE を押す

renovate.jsonmain ブランチ上に存在している必要があります。手元に置いただけでは Mend は読めないので、先にコミット & プッシュしてから Silent mode を切りましょう。

まとめ

Renovate は renovate.json 1 枚で、依存アップデートを継続的な小さい PR に変えてくれます。今回のポイントは 3 つです。

  • automerge は安全な範囲だけ(devDeps と patch/minor、major は手動)にして、CI を通過の条件にする
  • lockFileMaintenance でロックファイルも定期的に最新化する
  • 動かないときは Mend の Silent mode をまず疑う

CI(lint / build)と組み合わせれば、「気づいたら依存が数十個古い」状態から解放されます。

関連記事