📝

Renovateで週に1度ライブラリをアップデートする

2023/02/07に公開

ライブラリのアップデートを定期的に行うために、Renovateについて調査して試してみたのでメモに残します。

なぜライブラリのアップデートが必要なのか?

理由としては、大きく以下3つがあると考えます。

  • 既存のバージョンが脆弱性・バグを含んでいる可能性があるから
  • 新しくリリースされた機能が使えないから
  • 使っているバージョンのサポートが切れた時に一気に上げるのは大変だから

Renovateの設定方法

設定するにあたって、以下2点を考慮しました。
(短いスパンで何個もプルリクがくると、確認が面倒ですぐに設定を止めてしまいそうなので)

  • アップデートのプルリクは1週間に1度にする
  • マイナー・パッチのプルリクはライブラリをまたがって1つにまとめる

ちなみに、類似のツールにDependabotがありますが、Renovateの方が設定項目が多く柔軟で、上記の設定などが可能という情報が多かったので今回はRenovateを使ってみました。

1.プロジェクトにRenovateをインストールする

GitHub Appが用意されているため、簡単に導入できます。以下のように、全てのリポジトリに導入するか特定のリポジトリに導入するかを聞かれるので、好きな方を選んでインストールします。

導入したプロジェクトに対して、renovate.jsonという設定ファイルが追加されたプルリクが自動で発行されます。この設定ファイルを編集していきます。

2.設定ファイルの編集

上記2点を考慮した結果の設定ファイルがこちらです。

{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "extends": ["config:base"],
  "schedule": "before 2pm on Tuesday",
  "timezone": "Asia/Tokyo",
  "prHourlyLimit": 0,
  "rangeStrategy": "bump",
  "packageRules": [
    {
      "matchUpdateTypes": ["patch", "minor"],
      "excludePackageNames": ["typescript"],
      "groupName": "minor and patch dependencies"
    }
  ],
  "enabledManagers": ["npm"]
}

以下、各設定項目に対する解説です。

schedule

アップデートのプルリクをいつ出すかを指定します。
上記設定だと、毎週火曜日の14時までにプルリクが発行されます(上記設定をしても、火曜日の0時ごろにプルリクが来ていたので、厳密な時間の指定はできないと思われます)。

packageRules

プルリクを発行する際の細かいルールを指定できます。
matchUpdateTypesでminor、patchを指定して、それらをgroupNameで指定した名前で1つのプルリクにするように指定します。
excludePackageNamesで指定されたライブラリは、グループの対象外となります。typescriptはマイナーバージョンのアップデートでも破壊的変更が入る可能性があるため、個別にプルリクを出すようにします。

prHourlyLimit

1時間にmax何個までプルリクを出すか設定できます。
ここでは、0を指定してすることでプルリク数を制限しないようにしています。

rangeStrategy

どのようなバージョンアップがあった時にプルリクを作成するかの基準を設定できます。

今回設定したbumpだと、新しいバージョンがpackage.jsonで記載した範囲を満たしている場合でも、ライブラリを更新して、package.jsonの内容を書き替えます。
例えば、package.jsonに記載しているライブラリのバージョンが^1.0.0であるとすると、新バージョン1.1.0がリリースされた時に、バージョンアップのプルリクが出され、package.jsonの指定も^1.1.0に置き替わります。
一方で、例えばreplaceは「新しいバージョンがpackage.jsonで指定した範囲外の場合に、範囲を新しいものに置き換える」という設定なので、プルリクは出されません。2.0.0にバージョンが上がった時にプルリクが出されます。
(この設定項目に関しては、理解が合っているか自信ないので、間違っていたらご指摘ください。)

enabledManagers

今回は、package.jsonで指定しているライブラリが対象なのでnpmとしましたが、例えばgithub-actionsと設定するとGitHub Actionsで使用しているライブラリを対象にしてくれるようです。

結果

以下のように、マイナー・パッチのアップデートは1つのプルリクにまとめて送ってくれます。

メジャーバージョンのアップデートは別のプルリクで1つずつ送ってくれます。

自動で作成されるissueで、発行されているプルリクの一覧を見ることもできます。

Discussion