KAKEHASHI Tech Blog

カケハシのEngineer Teamによるブログです。

RenovateのlockFileMaintenanceを利用して間接依存までもれなく更新する

RenovateのlockFileMaintenanceの利用シーン

Renovateを導入してパッケージを更新しても、GitHubの脆弱性検知数が減少しないことがあります。これは、リポジトリの脆弱性検知が間接的にインストールされるパッケージも対象とする一方で、デフォルトのRenovateの挙動では間接依存のパッケージを対象にしないためです。この記事ではRenovateで間接依存パッケージ更新も行うオプションを紹介します。

lockFileMaintenanceの説明

RenovateにはlockFileMaintenanceという一見わかりづらい機能があります。ドキュメントには以下の説明があります。

When Renovate performs lockFileMaintenance it deletes the lock file and runs the relevant package manager. That package manager creates a new lock file, where all dependency versions are updated to the latest version.

簡単にいうとpackage-lock.jsonなど、パッケージマネージャーのロックファイルを削除して、npm installなどでロックファイルを再作成する機能です。Renovateはさまざまなパッケージマネージャーとそのロックファイルに対応していますが、この記事では代表例としてnpmを例にします。

Renovateパッケージ更新とlockFileMaintenanceによるロックファイル更新の違い

通常のパッケージ更新の際はRenovateはpackage.jsonを更新し、npm installなどを実行するので、package-lock.jsonの更新は最小限です。

例えばpackage-Aパッケージの1.0.1をインストールするとします。そしてpackage-Apackage-B2.0.*へ依存しているとします。そしてpackage-lock.jsonでは、package-A1.0.1と依存パッケージのpackage-B2.0.2が記述されています。

その後、package-B2.0.3がリリースされてもpackage.jsonに記述されない依存パッケージなので、Renovateは更新を検知しません。そのため、間接依存パッケージに脆弱性が発見されても更新が取り残されるリスクがあります。

さらにpackage-Aが更新されても、package-Aが指定する依存関係のバージョン指定が変わらなければ、package-Bは更新されません。

ここでpackage-Bを更新するのがlockFileMaintenanceです。先述の通り、ロックファイルを削除して再度npm installなどを実行するので、その時点で依存関係を満たす最新のpackage-Bが導入されます。通常のRenovate PRと異なり、package.jsonは変更しないので、package-Aの更新はpackage.jsonで指定されたバージョンの範囲内で行われます。

lockFileMaintenanceはminimumReleaseAgeを利用しない

OSSサプライチェーン攻撃対策として、RenovateのminimumReleaseAgeをオプションで、リリース直後のパッケージを一時保留することがあります。しかしlockFileMaintenanceminimumReleaseAgeパラメータを利用しないので、リリース直後のパッケージでもインストールされてしまいます。Renovateは内部的にnpmを実行しているので、npm側で保留期間を設定する必要があります。npmなら11.10.0min-release-ageが実装されています。

min-release-ageでnpm更新を5日待機させたい場合、.npmrcファイルに以下の記述を行います。

min-release-age=5

RenovateのminimumReleaseAgeパラメータはRenovateのPR作成を待機させるために引き続き必要です。min-release-ageのみだとRenovateはPR作成を試みてしまいます。npmエラーでPR作成は失敗しますが、無駄な処理が発生するため両方設定しましょう。

lockFileMaintenanceminimumReleaseAgeを使わない仕様については、RenovateリポジトリのDiscussionでも提起されています。 minimumReleaseAge is not working with lockFileMaintenance and transitive Dependencies

lockFileMaintenanceの運用

実行スケジュール

lockFileMaintenanceは、PRが何度も生えてきてノイズにならないよう、標準では毎週月曜日の午前0-4時台のみPRが作成されます。scheduleパラメータを使えば時間帯を変更できます。

対応ロックファイル

2026/04/23現在、以下のロックファイルに対応しています。

Manager Lockfile
bazel-module MODULE.bazel.lock
bazelisk MODULE.bazel.lock
bun bun.lockb, bun.lock
bundler Gemfile.lock
cargo Cargo.lock
composer composer.lock
conan conan.lock
devbox devbox.lock
gleam manifest.toml
gradle gradle.lockfile
helmfile helmfile.lock
helmv3 Chart.lock
jsonnet-bundler jsonnetfile.lock.json
mix mix.lock
nix flake.lock
npm package-lock.json, pnpm-lock.yaml, yarn.lock
nuget packages.lock.json
pep621 pdm.lock, uv.lock
pip-compile requirements.txt
pipenv Pipfile.lock
pixi pixi.lock
poetry poetry.lock
pub pubspec.lock
terraform .terraform.lock.hcl
terragrunt .terraform.lock.hcl
vendir vendir.lock.yml

CIと自動マージ対応

ロックファイルは人間が読むことを想定していないので、人間が差分を判断するのは困難です。実際GitHubでもロックファイルの差分はデフォルトで非表示になります。人間がPRをレビューする運用にしても、レビューしきれずにPRを滞留させてしまうリスクが高いです。そのためCIでテストが全て通ったら自動マージする運用が現実的でしょう。下記のようにautomerge: trueオプションを設定すると自動マージ対象になります。

{
  lockFileMaintenance: {
    enabled: true,
    automerge: true,
  },
}

直接指定するパッケージの更新は意識しても、ロックファイル内部で指定されているパッケージの更新は漏れがちです。lockFileMaintenanceを利用して、漏らさずに更新していきましょう。

担当:松浦

参考リンク

Renovate Configuration Options