👁️

依存パッケージ更新ツールの導入

2022/12/10に公開

この記事はLuup Advent Calendarの10日目の記事です。

はじめに

こんにちは、Luupのサーバサイドチームに業務委託でジョインしているrendaman0215です。

日々開発を進めていくなかでプロジェクトが大きくなっていくにつれ依存パッケージが増えていきますよね。
我々のチームでもnpmパッケージの更新検知や脆弱性への対応に以下のような課題を持っていました。

  • 脆弱性や更新を誰かが定期的にチェックする必要がある
  • バージョンアップを行う際、リリースノートを確認しつつ慎重に行う必要がある
  • アップデートしないと最新の機能が使えない

そのため依存関係更新ツールを導入し、botにおまかせすることとしました。
本記事では、技術選定および導入した感想について紹介します。

技術選定

調査対象

今回、トレンドや他プロジェクトでの使用状況、リーダーからの提案もあり以下のツールを対象に比較調査を行うことにしました。

  • Dependabot
  • Renovate
  • GitHub Actions

実際に導入してみた

比較するにあたり、実際に上記の三者をテスト用リポジトリーに導入してみました。
それぞれを導入してみた感触は以下のとおりでした。

Dependabot

  • 老舗的な立ち位置なため、参考記事などが多い
  • 依存パッケージの更新があると自動でPRを作ってくれる
  • リポジトリーの設定からEnableにするだけで導入できる

Renovate

  • ここ最近のトレンドとなっている印象で、参考記事が増えてきている
  • issueにダッシュボードを作ってくれる
  • 依存パッケージの更新があると自動でPRを作ってくれる
  • 簡単にインストール可能

GitHub Actions

  • workflowにnpm audit actionなどを追加することで利用できる
  • cronで定期実行するかPRベースでチェックしてくれる
  • 結果をissueにまとめてくれる
  • Actionsがこけることによりメール通知が行われる

結果

上記のツールをテストリポジトリーに導入してみましたが、最終的には以下の理由によりRenovateを導入することになりました。

  • PRが自動生成される
  • 通知が煩わしくない
  • Issue上に生成されるダッシュボードで管理できる
  • 自動生成されるPRにリリースノートをまとめてくれている

設定

設定ファイル

Renovateの設定は、以下のいずれかのファイルで定義できます。

  • renovate.json
  • renovate.json5
  • .github/renovate.json
  • .github/renovate.json5
  • .gitlab/renovate.json
  • .gitlab/renovate.json5
  • .renovaterc
  • .renovaterc.json
  • package.json(renovateセクション)

初期設定

Renovateを導入するとまず以下のような状態となっています。(PRが作成される)

renovate.json
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "extends": [
    "config:base"
  ]
}

Renovate のオプションは200個以上存在します。
そのためプリセットが存在しており、隅々まで設定する必要がないようになっています。
上記のファイルにあるconfig:baseプリセットは、下記の設定を1つにまとめたプリセットです。

{
  "extends": [
    ":dependencyDashboard",
    ":semanticPrefixFixDepsChoreOthers",
    ":ignoreModulesAndTests",
    ":autodetectPinVersions",
    ":prHourlyLimit2",
    ":prConcurrentLimit10",
    "group:monorepos",
    "group:recommended",
    "workarounds:all"
  ]
}

dependencyDashboard

Dependency Dashboardというissueが起票され、更新すべきパッケージなどが表示されるようになります。

semanticPrefixFixDepsChoreOthers

semantic commitsを検知し、dependency関係にfixをそれ以外にはchoreを付与します。
(semantic commitsについてはこちらが参考になりました)

ignoreModulesAndTests

node_modulestestディレクトリーを監視対象から除外します。

autodetectPinVersions

依存関係を固定するか、範囲を維持するかを自動検出します。

prHourlyLimit2

PRの作成を1時間あたり最大2つに制限します。

prConcurrentLimit10

作成できるPRを最大10に制限します。

group:monorepos

既知の monorepo パッケージをグループ化します。

group:recommended

Monorepo以外のパッケージのグループ化を推奨するキュレーションリストを使用します。

workarounds:all

パッケージに関する既知の問題に対する回避策を集めたものです。

プリセットは、設定を記述することで個々の設定で上書きできます。
今回は初期プリセットでまずそうな設定も入っていないのでこのまま導入しましたが、自分たちでプリセットを作成できます。

導入した感想

更新検知・脆弱性検知を自動でしてくれてPR作成まで自動でおこなってくれるのはやはり便利ですね。
ただし、導入時に設定を間違えると他リポジトリーにまで設定が及んでしまい混乱を招くので導入時そこは注意すべきだと感じました。
今回は初期設定のまま導入しましたが、renovate.jsonをいじることで細かい設定ができそうなので、引き続き情報をウォッチしていこうと思います。

おわりに

Renovateの選定理由と導入方法、実際に導入した感想について説明しました。
今回はRenovateの方がマッチしたため導入しましたが、他のツールの方が優れている点もあったため、今後の発展に期待したいですね。

本記事に対してご指摘等ございましたらコメントいただければと思います。

Luup Developers Blog

Discussion