Renovate による大量の update に取り組む
想定している状況
- Renovate
- Monorepo
- サービスごとに複数のツールをバージョン管理している
- ツールがそれなりの頻度で更新される
- ツールはサービスごとにアップデートする
やりたいこと
素早く、安全に Renovate PR を処理する
- update が滞らないようにする
- update によって危険なことが起こらないようにする
- e.g. terraform apply でリソースが変更されてしまう
- update によって CI が壊れないようにする
PR の数を減らす
update が滞らないようにする一つの方法として、そもそも update 対象を減らすというのがある。
- Monorepo でサービスごとにバージョン管理しているものを、リポジトリで一つに集約してしまう
- patch update を無視し、 minor 以上だけ update する
これは update が滞ってしまっている場合の現実的な選択肢ではあるが、あまりやりたくはない。
Enable Automerge の注意点
Enable Automerge は PR を素早くマージするのに極めて有効な feature である一方、 PR が意図せずマージされてしまわないように気をつけないといけない。
Enable Automerge は Branch Protection rule でチェックをつけた status check 以外の結果を無視するので、
CI がこけているのにマージされてしまうことがあり得る。
build matrix で動的に status check が変わる場合、対応が難しい。
その場合、 build matrix の後続に固定の job を追加し、それを status check するのが良い。
# This job is used for branch protection rule
# Add this job to `Status checks that are required`
status-check:
runs-on: ubuntu-latest
needs: [build]
if: failure()
steps:
- run: exit 1
Automerge の挙動的には skip でも success と同様に扱うようなので、 if: failure()
で失敗した場合のみ実行するようにしている。
GitHub Actions で特定のファイルが更新された場合のみ実行される workflow がある場合、それを branch protection rule に追加するのは難しいが、
enable automerge でその workflow が失敗しているのに merge されてしまうリスクがある。
ケースバイケースだが、めったに壊れなく、壊れても大きな問題にならないのであれば、そのリスクを許容するのもあり。
renovate-approve がたまに approve してくれない
そのままだが、 renovate-approve が approve してくれないことがある。
原因は不明。
platformAutomerge がうまく動かないケースがある
なぜか pull request label を pull request に設定するのに失敗していて enable automerge が実行されなかったことがあった。
対象の pull request label は以前から存在するものであり、なぜ label の設定に失敗したのかは不明だが、
Renovate で label を設定するのをやめたら解決した。
base branch の update によって Automerge が disabled されることがある
platformAutomerge によって一度 enable になっても CI が走っている最中に disable になってしまうことがある。
automerge が完了しないことがある
automerge が有効で、 conflict もしていないような場合でも、なぜか merge されないことがある。
大量に PR が同時に作られると rate limit に引っかかる場合がある
これは実行する job の種類によるが、例えば Terraform で AWS を複数の state に分割して管理している場合、
同時に大量の PR が作られて terraform plan が実行されると AWS の API の rate limit に引っかかるケースがある。
config:base
Renovate の制限に引っかかって PR が作成されないことがある
Renovate には幾つか limit があり、自分で設定したつもりがなくても default で設定されていたり config:base
で設定されていたりする。
config | default | config:base |
description |
---|---|---|---|
prHourlyLimit | 0 | 2 | |
prConcurrentLimit | 0 | 10 | |
branchConcurrentLimit | prConcurrentLimit |
config:base
を使っている場合、 prHourlyLimit は非常に小さいので大量の PR を処理したい場合は明示的に設定したほうが良い。
Renovate が思うようなペースで PR を作ってくれないことがある
prHourlyLimit に引っかかって 1 時間作られないとかなら分かるが、数時間 PR が作られないことがある。
原因は不明。
Self-hosted Renovate であればこの問題を解決できるかもしれない。