既存プロジェクトに Renovate を導入したため、設定や運用方法を紹介します。
Renovate とは
Renovate は、依存関係のアップデートを自動化してくれるツールで、GitHubなどでリポジトリを連携すると、パッケージの更新を自動検出して PR を発行してくれます。
導入理由
バージョンアップ作業が滞り、一部ライブラリでは既にサポート切れが発生していたため、チーム全体で定期的に更新を促す仕組みとして Renovate を導入しました。
設定内容
今回の主な設定ポイントは以下のとおりです。
Node.js のバージョンを固定
- package.json に Node.js のバージョンを明記
- GitHub Actions でも、このバージョンを参照するように統一
- uses: actions/setup-node@v4
with:
node-version-file: "package.json"
cache: "npm"
cache-dependency-path: "package-lock.json"
PR の作成に関する設定
- マイナーとパッチバージョンの更新は 1 つの PR にまとめて作成するように
- 逆にメジャーアップデートは、1.x.x → 3.x.x のように一気にアップデートせず、1.x.x → 2.x.x, 2.x.x → 3.x.x のように段階的に分ける
- PR は一気に大量作成される可能性があるので、一旦 Draft PR として作成(limitも指定できるので、場合によってはそちらでも良いかも)
Draft の PR では CI が走らないようにしています。
draftのときにCIが発火しないように、 GitHub Actions に下記のような条件を追加しています
if: github.event_name != 'pull_request' || (github.event_name == 'pull_request' && github.event.pull_request.draft == false)
pull_request以外のときも発火する場合があるためこのようになっていますが、pull_requestでしか発火しない場合は
if: github.event.pull_request.draft == false
だけで良いと思います
- PRが業務中にノイズにならないように、Renovate の実行は業務時間外に設定
- 例えば 夜 10 時以降 ~ 朝 6 時 や週末など、プロジェクトの状況に合わせて時間を指定できます
パッチバージョン更新のオートマージ
- パッチバージョンの更新の場合は CI が通ったら自動的にマージするように設定
- 後方互換性を壊すリスクが低いため、速やかに取り込めるようにしています
セマンティックバージョニングに従ってないライブラリも存在するため注意が必要です
バージョン指定は「固定 (Pin)」
- 好みの問題もあると思いますが、可読性と運用の明確化を目的に、package.json のバージョン指定は ^ や ~ を使わず、固定のバージョンで指定
参考: Renovate: Should you pin your JavaScript dependencies?
運用方法
プロジェクトにより最適な方法は変わると思いますが、今回のプロジェクトでは下記のように運用しました
- マイナー・パッチアップデート
- 後方互換が保たれている可能性が高いため CI が通っていれば即マージ
- メジャーアップデート
- レビュワー全員の Approve 必須
- 破壊的変更が入る可能性があるため、事前にテストやドキュメント確認を徹底
- 定期的なチェック
- 毎週決まった曜日 に、溜まっている PR の進捗を確認
実際のコード例
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended",
"group:definitelyTyped",
"group:allNonMajor",
":automergePatch",
":disableRateLimiting"
],
"enabledManagers": ["npm", "dockerfile", "github-actions"],
"packageRules": [
{
"matchUpdateTypes": ["major", "minor"],
"draftPR": true
}
],
"labels": ["dependencies"],
"rangeStrategy": "pin",
"separateMultipleMajor": true,
"timezone": "Asia/Tokyo",
"schedule": [
"after 10pm every weekday",
"before 6am every weekday",
"every weekend"
]
}
コード概要
-
config:recommended
: Renovate 公式のおすすめ設定 -
group:definitelyTyped
,group:allNonMajor
: TypeScript の型定義やマイナー・パッチ更新のPRをグループ化 -
automergePatch
: パッチバージョンの更新を自動マージする設定 -
draftPR
: メジャー、マイナー更新に関しては Draft PR にする -
rangeStrategy: pin
: 依存関係を固定バージョンにする
まとめ
最初は大量に PR が作成されて焦りましたが、設定を調整していくうちに、「段階的にメジャーアップデートを進める」「Draft PR でまとめておく」「業務時間外に実行する」などの運用が定着してきました。
現在では、ほとんどのライブラリが最新に近い状態になっています(ようやくESLintもv9にできそう)