
DependabotのプルリクエストでdependenciesとdevDependenciesをグルーピングしてみた
こんにちは!製造ビジネステクノロジー部の小林です。
Dependabotを運用していると、大量のプルリクエストに圧倒されることはありませんか?特に、更新内容の確認に多くの時間を費やしている方もいるかもしれません。その結果、どれを優先的にレビューすべきか判断に迷い、依存関係の更新が滞ってしまう...ということもあると思います。
このような状況を解決するアプローチの1つとして、「dependencies(本番環境に必須な依存関係)は慎重に調査し、devDependencies(開発環境でのみ必要な依存関係)は簡単な確認を行った上でマージする」という運用ができれば、プルリクエストの処理がスムーズになりそうですよね。
今回は、Dependabotが作成するプルリクエストを、上記の方針に沿ってdependenciesとdevDependenciesに自動でグルーピングする設定を試してみました!
やってみた
dependabot.ymlの作成
Dependabotのグルーピング機能を使うには、.github/dependabot.yml ファイルを編集します。今回は、dependenciesとdevDependenciesをそれぞれ異なるグループに分ける設定にしました。
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "daily"
groups:
# 本番依存関係(dependencies)用のグループ
prd-dependencies:
dependency-type: "production"
# 開発依存関係(devDependencies)用のグループ
dev-dependencies:
dependency-type: "development"
動作確認
この設定が正しく機能するかを確認するため、package.jsonで以下のライブラリを使用します。
"devDependencies": {
"@types/jest": "^29.5.14",
"@types/node": "22.7.9",
"aws-cdk": "2.1018.1",
"jest": "^29.7.0",
"ts-jest": "^29.2.5",
"ts-node": "^10.9.2",
"typescript": "~5.6.3"
},
"dependencies": {
"aws-cdk-lib": "2.200.1",
"constructs": "^10.0.0",
"express": "^4.21.2"
}
このpackage.jsonには、dependenciesとしてaws-cdk-lib、constructs、expressが、devDependenciesとして各種開発ツールが定義されています。Dependabotはこれらのライブラリの更新をチェックし、それぞれ設定したグループに基づいてプルリクエストを作成します。
GitHubのプルリクエスト画面を確認すると、下記のように2つのプルリクエストが作成されました。
内容を確認すると、それぞれ「dependencies」と「devDependencies」の変更内容のプルリクエストが作成されていることがわかります。
これで、目的通りにプルリクエストをグルーピングできました!
minor-and-patchバージョンでグルーピングする
上記の例では、dependencies と devDependencies それぞれで、全てのアップデートタイプ(メジャー、マイナー、パッチ) がグループ化されます。しかし、Dependabotのupdate-typesオプションを使うと、特定のアップデートタイプ(例えば、マイナーバージョンとパッチバージョンのみ)に絞ってプルリクエストを作成することも可能です。
メジャーアップデートは慎重になるべき
メジャーバージョンアップデートは、機能変更やAPIの非互換性を含むことが多く、慎重な検証が必要です。一方で、マイナーバージョンやパッチバージョンのアップデートは、新機能追加やバグ修正が主で、比較的リスクが低い傾向にあります。
この特性を活かし、メジャーアップデートのプルリクエストとは別に、安全性の高いマイナー/パッチアップデートだけをまとめてグループ化することで、更新作業の優先度を明確に分けることができます。
やってみた
依存関係の種類だけでなく、バージョン更新の種類によってもプルリクエストを分けてみましょう。
dependabot.yml を以下のように更新します。
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "daily"
groups:
# 本番依存関係(dependencies)用のグループ
prd-dependencies:
dependency-type: "production"
update-types:
- "minor"
- "patch"
# 開発依存関係(devDependencies)用のグループ
dev-dependencies:
dependency-type: "development"
update-types:
- "minor"
- "patch"
変更点
prd-dependencies と dev-dependencies の両方に、update-types: ["minor", "patch"] を追加しました。
これにより、Dependabotは以下のような挙動になります。
- prd-dependencies グループのプルリクエスト
- dependencies に含まれるライブラリのマイナーバージョンとパッチバージョンの更新だけがまとめられます
- dev-dependencies グループのプルリクエスト
- devDependencies に含まれるライブラリのマイナーバージョンとパッチバージョンの更新だけがまとめられます
- メジャーバージョンアップデートのプルリクエスト
- メジャーバージョンアップデートは各ライブラリごとに個別のプルリクエストとして作成されます
動作確認
先ほどの設定を適用した結果がどうなったか、GitHubのプルリクエスト画面で確認してみましょう。
画像のように、既存のグループ化されたPRに加え、新たに2つのプルリクエストが個別に作成されているのがわかります。
これらはdevDependencies内のメジャーバージョンアップデートが、個別に作成されたプルリクエストです。
「Bump @types/node from 22.7.9 to 24.0.15 dependencies javascript」と「Bump jest and @types/jest」のプルリクエストを見てみます。
devDependencies内のnodeとjestでメジャーアップデートがあることがわかります。
dependenciesのメジャーアップデートプルリクエストについて
package.jsonではdependenciesとして"express": "^4.21.2"が記載されており、本来であれば"express": "^5.1.0"のようなメジャーアップデートが可能なはずです。しかし、今回の検証ではすぐに該当するプルリクエストが作成されませんでした。
Dependabotの更新チェックにはラグがあるかもしれませんね。引き続き観察し、dependencies側のメジャーアップデートプルリクエストが作成されるかどうかを確認していく必要があります。
おわりに
Dependabotのグルーピング機能を活用することで、プルリクエストごとの変更スコープが明確になり、優先順位をつけた対応が可能になります。これにより大量のプルリクエストに埋もれることなく、スムーズに依存関係の管理ができるようになりそうですね!
この記事が皆さんのDependabot運用を快適にする一助となれば幸いです。
参考記事