Open1

Renovate による大量の update に取り組む

Shunsuke SuzukiShunsuke Suzuki

想定している状況

  • 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

https://docs.renovatebot.com/presets-config/#configbase

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 であればこの問題を解決できるかもしれない。