Renovate の Tips

こんにちは。 SRE の @suzuki-shunsuke です。 Quipper では Renovate という様々なツール、ライブラリのバージョンをアップデートしてくれるツールを活用しています。 今日はこれに関する Tips を紹介します。

  • Reviewer を設定する
  • 対象を絞り込む
  • 自動でマージする
    • renovate-approve を使って自動で approve もする
    • Terraform のリポジトリで安全に自動マージする
  • 正規表現を使って update する
    • depName を使って設定を簡略化する
  • 更新対象のファイルごとに Pull Request を分割する
  • PR が溜まらないように PR の数を制限する
  • CI で設定をテストする
  • 設定方法について renovatebot/config-help で質問してみる

Reviewer を設定する

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

Renovate によって作られた Pull Request (以下 PR) が放置されないようにするには、 Reviewer を設定するのが有効です。 GitHub の User ないし Team を設定できます。

一方で、自動でマージする更新の場合 Reviewer を設定するとうるさいので設定しないほうが良いかもしれません。 その場合、 CI が失敗して自動マージに失敗したら人間が放置せずフォローする必要があります。

対象を絞り込む

Renovate はデフォルトだと全ての Manager が有効です。 一部のものだけ update したい場合は明示的に enableManagers を指定する必要があります。 加えて更新するファイルも限定したい場合は includePaths も指定すると良いでしょう。 Monorepo で一部のサービスでだけ Renovate を使いたいとか、そういう場合に便利でしょう。

自動でマージする

automerge によって CI が通ったら自動でマージするようにし、一々確認して手動でマージする手間を省くことが出来ます。 一方で CI が通ったからと言って自動でマージされると困る場合もあるので、必要に応じて対象を絞り込む必要があります。例えば、メジャーアップグレードは除外するなどです。

renovate-approve を使って自動で approve もする

リポジトリの設定で PR をマージするには 1 approve が必要になっていると、 automerge を有効にしても approve がないとマージされません。 なので approve まで自動化する必要があります。 renovate-approve を使うと、自動で approve をしてくれます。

Terraform のリポジトリで安全に自動マージする

Terraform の CI/CD では、 CI が通ったからと言って自動マージされると危険です。 予期せぬ変更が terraform apply によって実行される可能性があります。 そこで PR の Author が renovate[bot] でかつ terraform plan -detailed-exitcode の exit code が 2 の場合に CI を fail させるようにすれば、自動でマージされないので安全です。 分かりやすく次のようなコメントを PR に post するようにしています。

image

CI がこけた場合、人間が確認します。

人間が確認した結果、問題のない変更の場合もあるでしょう。その場合はそのままマージしてしまいたいですが、 CI が fail しているのにマージするのも気持ち悪いです。 そこで専用の PR label を設定している場合に CI が fail しないようにすれば CI を pass させられます。

これは Terraform 以外でも使えるアプローチでしょう。

正規表現を使って update する

Renovate は様々な Manager をサポートしており、特別な設定をしなくてもアップデートできます。

https://docs.renovatebot.com/modules/manager/

一方で、例えばシェルスクリプトGitHub Releases からバイナリをダウンロードしてきてインストールしているような場合は Regex Managers を使い、明示的に設定を書く必要があります。

例えば次のようなシェルスクリプトでバイナリをインストールするとしましょう。

AKOI_VERSION=v2.2.1

mkdir -p "$HOME/bin"
curl --fail -L "https://github.com/suzuki-shunsuke/akoi/releases/download/${AKOI_VERSION}/akoi_${AKOI_VERSION##v}_linux_amd64" -o "$HOME/bin/akoi"
chmod a+x "$HOME/bin/akoi"

renovate.json はこんな感じになります。

{
  "regexManagers": [
    {
      "fileMatch": [".*\\.sh"],
      "matchStrings": ["AKOI_VERSION=(?<currentValue>.*?)\\n"],
      "depNameTemplate": "suzuki-shunsuke/akoi",
      "datasourceTemplate": "github-releases"
    }
  ]
}

設定の詳細は公式ドキュメントを参照してください。

このときに対象ファイルをリネームしたときにいつの間にか動かなくなったりしないように、割と広めにマッチするようにしても良いのかなと思います(もちろん正規表現が予期せぬ形でマッチしない前提ですが)。

depName を使って設定を簡略化する

先程の設定の仕方だと、インストールするバイナリが複数ある場合、バイナリごとに regexManagers に設定する必要があります。 depName を使うと逐一書く必要がなくなります。

VERSION=v2.2.1 # renovate: depName=suzuki-shunsuke/akoi

mkdir -p "$HOME/bin"
curl --fail -L "https://github.com/suzuki-shunsuke/akoi/releases/download/${VERSION}/akoi_${VERSION##v}_linux_amd64" -o "$HOME/bin/akoi"
chmod a+x "$HOME/bin/akoi"

renovate.json はこんな感じになります。

{
  "regexManagers": [
    {
      "fileMatch": [".*\\.sh"],
      "matchStrings": ["VERSION=(?<currentValue>.*?) # renovate: depName=(?<depName>.*?)\\n"],
      "datasourceTemplate": "github-releases"
    }
  ]
}

更新対象のファイルごとに Pull Request を分割する

Monorepo の場合、同じツールを複数のサービスで使っている場合も当然あるでしょう。 この場合 Renovate はデフォルトで同じ PR で複数のサービスを update しようとします。 サービスごとに PR を分割したい場合、 additionalBranchPrefix を指定すると良いです。

例えば、弊社では Terraform の AWS Provider をアップデートするのに次のような設定をしています。

{
  "packageRules": [
    {
      "managers": ["terraform"],
      "additionalBranchPrefix": "{{baseDir}}-",
      "packagePatterns": [".*"],
      "commitMessageSuffix": "({{baseDir}})"
    }
  ]
}

commitMessageSuffixbaseDir を含めることで PR のタイトルで区別がつくようにしています。 baseDir はテンプレート内で使える変数の一つです。テンプレートに関しては https://docs.renovatebot.com/templates/ を参照してください。

PR が溜まらないように PR の数を制限する

Renovate による PR が作られすぎて対応が追いつかず溜まってしまう場合、 PR の数を制限すると良いでしょう。

  • prConcurrentLimit: Open な Renovate による PR の数
  • prHourlyLimit: 一時間あたり作られる PR の最大数
  • schedule: PR が作られるタイミングのスケジューリング

CI で設定をテストする

https://docs.renovatebot.com/reconfigure-renovate/

Renovate の設定ファイルが文法的に間違っていると、当然 Renovate は動きません。 renovate.json を変更する際は CI で文法的に正しいかテストするのが良いでしょう。 renovate-config-validator を使えばテストできます。

設定方法について renovatebot/config-help で質問してみる

Renovate は設定項目が非常に多く、日本語の情報も現時点ではさほど多くはないため、結構難しいです。 これまで期待通りの結果にならないこともままありました。 そういう「〇〇したいんだけど、どう設定すればいいのか分からない」という場合は https://github.com/renovatebot/config-help で質問してみると良いかもしれません。 質問とかに関しては https://github.com/renovatebot/renovate にいきなり issue を作るより https://github.com/renovatebot/config-help で聞いてみるのが健全だと思います。

自分も質問してみて自分のやりたいことを実現できました。 https://github.com/renovatebot/config-help/issues/985

さいごに

以上、 Renovate の Tips を紹介しました。 Renovate は非常に便利なツールですが、日本語の情報は現時点ではさほど多くはありません。 Tips をお持ちの方は是非ブログなりなんなりで共有していきましょう。