🌊

npmパッケージのバージョン管理に、Renovateを導入しようとしている話

2023/12/01に公開

この記事は TechCommit Advent Calendar 2023 1日目の記事です。

Renovateを導入しようとしている背景

現在携わっているプロジェクトで、Dependabotを使って、Rails関連のgemや、npmのバージョンの依存関係管理して、定期的にアップデートしています。

ただ、dependabotで管理していると、npm関連のライブラリのアップデートが多いときに、package-lock.jsonでconflictが多く発生し、解消がしづらい事象が発生していました。

そこで、npm関連のライブラリの依存管理に強みのあるRenovateで管理するのはどうか?という案がチームで出たので導入を進めています。

まだ導入している最中ですが、現時点での学びをシェアしたいと思います。

そもそも、Renovateとは?

Renovateは、依存関係を一元管理し、新しいバージョンがリリースされたときに自動的にファイルを更新できるツールです。

リポジトリ内のパッケージのバージョンを監視し、新しいバージョンが利用可能になるとPull Requestを生成してくれます。

これにより、ライブラリが古くなることを防ぎ、セキュリティリスクの低減、パフォーマンスの向上、バグの修正などが可能になります。

その他にも、脆弱性の修正や改善に関する通知機能もあるので、プロジェクトを常に最新の状態に保つことに役立ちます。

Renovateは多言語および多様なパッケージ管理システムに対応していて、npmやyarn、composer、pipなど、さまざまな環境での使用が可能です。

RenovateとDependabotの違い

Renovateと似たツールとして比較されるのが、Dependabotです。

Dependabotと比較した場合のRenovateの特徴は、アップデートをまとめて1つのPRに集約できること、設定項目が多く、ユースケースに沿ったカスタマイズができることなどです。

自分が調べた範囲で違いを表にまとめてみました。(※間違っていたら指摘頂けると嬉しいです)

特徴 Dependabot Renovate
自動更新の頻度とカスタマイズ性 限られた頻度とカスタマイズ性 高度なカスタマイズが可能
サポートされるプラットフォーム 主にGitHubに特化 GitHub, GitLab, Bitbucketなど複数プラットフォームをサポート
サポートされる言語とパッケージマネージャ 主要な言語やパッケージマネージャをサポート 広範な言語やパッケージマネージャをサポート
セキュリティアップデート GitHubのセキュリティアラートと強く連携 セキュリティアップデートをサポート、しかしGitHubとの連携は深くない
カスタム設定の柔軟性 限られたカスタマイズ選択肢 高度なカスタマイズが可能

Renovateの設定ファイル

Renovateに必要な設定は、renovate.jsonに記述していきます。
(※具体的なGitHubレポジトリ上の導入手順は他の記事でたくさん解説されているので省略します。)

RenovateではPRを自動マージできる設定ができます。CIが通ったときに自動でPRをマージしてくれます。ただ、今回は自動マージはしない方針にしています。

設定の補足説明

  • :preserveSemverRanges
    • ^1.2.3 のようなバージョン範囲指定を保持する指定
  • 今回は、npm関連だけrenovateで管理したいので、packageRulesでnpmを指定
  • Ruby、RailsまわりのgemはDependabotで管理するので、bundler関連は無視する設定
  • separateMinorPatchは、minor, patchのPRを分けて生成してくれます
    • 他のライブラリとの依存関係でmajorバージョンをリリースできない場合などに役立ちます
{
  "extends": [
    "config:base",
    ":preserveSemverRanges"
  ],
  "baseBranches": ["develop"],
  "timezone": "Asia/Tokyo",
  "separateMinorPatch": true,
  "prConcurrentLimit": 20,
  "packageRules": [
    {
      "managers": ["npm"],
      "matchUpdateTypes": ["patch", "minor", "major"],
      "schedule": ["after 8am and before 12:00am"]
      "schedule": ["after 12am and before 13:00am"]
    },
    {
      "managers": ["bundler"],
      "matchUpdateTypes": []
    }
  ]
}

今後の方針

  • 今は、Dependabotと併用して使おうとしているので、そのあたりの棲み分けで効率的なやり方があれば模索していきたいです。
  • Renovateの細かい設定はほとんどしていないので、生成されるプルリクエストの単位など、運用しながら改善していきます

Discussion