Renovateを導入したことでパッケージアップデートの94%を自動化に成功！

私が担当しているプロダクトではGitHubの[dependabot](https://docs.github.com/ja/code-security/dependabot/dependabot-version-updates/about-dependabot-version-updates)を利用してパッケージのアップデートを行っていました。
dependabotは毎週20〜30件のプルリクを作っており、週替わりで担当者が確認してマージしていました。

ほとんどのものがCI通っているのでヨシ！でapproveしてmergeするだけなのですが、たまに手動でコードを修正する必要があったり、手動でコマンドを叩く必要があるものがあります。
ただ、手動作業が必要なものは毎週1件、多くて2件くらいです。

ということでざっくり手動対応が必要なプルリクの割合を計算してみました。

手動対応が必要なものは「毎週1件、多くて2件くらい」なので毎週1.5件とします。
全体は「毎週20〜30件」なので25件とします。
1.5 / 25 = 0.06 → 6%
ざっくり計算ですが、手動作業が必要なものは6%です。
ということは残りの94%はapproveしてmergeするだけのものとなります。

今回、Renovateを導入することで、上記の94%を自動化することに成功しました！！

# Renovateとは？

[ホームページ](https://www.mend.io/free-developer-tools/renovate/)の説明文をによると

> Save time and reduce risk
by automating dependency updates in software projects.

とのことです。
プロジェクトで使っている外部ライブラリなどのバージョンアップを検知してお知らせ＆自動でアップデートしてくれます。

# Renovateのメリット・デメリット
## CIが通ったら自動的にマージしてくれる
オートマージがやりたくてRenovateを導入したのでこれが最大のメリットです。
一方、デメリットとしては、パッケージのCHANGELOGをみる習慣がなくなってしまうので、deprecatedが事前に周知されていてもCIがコケるまで気づかなかったり、便利機能の追加に気づかないなどが増える可能性はあります。

## 関連するパッケージを1つのプルリクでまとめて作成してくれる
下記では@sentry/reactと@sentry/tracingがまとめて1つのプルリクになっています。
この2つは同時にアップデートする必要があるのですが、dependabotでは別プルリクになっており手動でまとめる必要がありました。
地味に便利な機能です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83424/5854327f-faf0-fad5-34af-1a1cbf3fadf4.png)

# Renovateの設定

Renovateを有効にするにはGitHubにAppを追加するだけでOKです。
リポジトリ単位で有効・無効を設定することができます。

インストールしたリポジトリには、Configure Renovateというプルリクが作成されます。
設定ファイルが含まれているのでマージすることでRenovateが有効になります。
dependabotを設定している場合はプルリクがかぶってしまうのでdependabotは停止しておきましょう。

Renovate設定の詳細はドキュメントをご覧ください。

https://docs.renovatebot.com/configuration-options/

## 導入時はオートマージを有効にしない
automergeの設定は様子をみてからONにすることをお勧めします。
最初からautomergeを設定して予期せずプルリクがマージされると余計な時間がかかります。
最初は無効にしておき、dependabotと同じように対応しつつ、approveしてmergeしてるだけやな！となったらautomergeを有効にすれば良いです。

## platformAutomergeの注意点
platformAutomergeを使うにはGitHubのauto-mergeを有効にする必要があります。
auto-mergeはsettingsのAllow auto-mergeをONにすると有効になります。
auto-mergeはrequireが設定されているCIが全てパスしたら自動的にマージする機能です。
逆にrequiredになっていないCIは途中でもこけていても無視されるので注意が必要です。
auto-mergeの詳細はドキュメントをご覧ください。

https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/automatically-merging-a-pull-request

## プルリクをマージするにはapprove必須なんだが！
チーム開発をしているとプルリクをマージする時にapproveを必須にしている現場が多いと思います。
approveしないとRenovateもマージできませんが、これを解決する機構も準備されています。
[renovate-approve](https://github.com/apps/renovate-approve)です。

renovate-approveをGitHubにインストールしていくことでRenovateが作成したプルリクを自動的にapproveしてくれます。
(approveとは？！という気もしますがまあヨシ！！)

# Renovateの運用
設定が終わればRenovateが自動的にプルリクが作成してくれるようになります。
さらに、automerge設定後はCIが通ったら自動的にマージされるのでapproveしてmergeから解放されます。
あとは、残り6%のCIがこけたものやautomergeを無効にしているプルリクだけお世話すればOKです！

automergeの有効・無効はプルリクの本文で確認できます。
メジャーバージョンが上がる場合はオートマージを無効化しているので、下記はAutomergeがDisabledになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83424/4b24a862-ec4c-e45e-3aea-f682b158f9a6.png)
Renovateを導入するとイシューに「Dependency Dashboard」というダッシュボードが作成されます。
活動状況が一目でわかるので便利です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83424/ab6dc956-6158-4c81-2b8c-e8467fb55499.png)

# 導入後のトラブル
Renovate導入後にいくつかトラブルがあったので紹介します。

## nodeのバージョンが
nodeのバージョン管理は[asdf](https://asdf-vm.com/)を使っています。
Renovateではasdfで管理しているnodeのバージョンも検知して自動でバージョンアップしてくれるのですが、asdfではまだ配布されていないnodeのバージョンに上げられてしまい、配布されているバージョンまでrevertすることになりました。
この後、nodeはオートマージを無効にして、asdfに配布されていることを手動で確認する運用に変えました。

## lintのwarnをスルーしてしまった
lintのバージョンが上がったことで大量のwarnが発生するようになったのですが、warnだったのでCIが成功してしまい、マージされてしまいました。
warnで困るようなチェックはエラーにしてCIで検知できるようにすることで解消しました。