GitHubでRequired Approvalsを設定したままRenovateのPRだけapproveなしでautomergeする

タイトルがややこしい。

Renovateによる依存アップデートのPRで、パッチとマイナーアップデートの場合はテストをPASSしていたら自動でマージして欲しい。

こういう設定をしている

{
  "packageRules": [
    {
      "matchUpdateTypes": ["minor", "patch"],
      "matchCurrentVersion": "!/^0/",
      "automerge": true
    }
  ]
}

しかし、リポジトリのRulesetsでRequired Approvalsを設定しているとPRのApproveがないので永遠にマージされない。

でもRenovate以外の人間とAIによるPRはApprove必須にしたいため、この設定を剥がすことはできない。しかし大量の依存アップデートに対して人間がチマチマApproveすることは避けたい。

この二律背反問題を解消する必要がある。

解決方法

この問題と解消方法については以下のDocumentに記載がある。

docs.renovatebot.com

  1. https://github.com/renovatebot/renovate-approve-bot を使う
  2. rulesetsのBYPASSを使う

1がラクなのだけど、落とし穴がありCODEOWNERファイルによる設定があると、この作戦はうまく機能しない。 これはBotをOWNERに指定できないからで、自動でReviewerにBotを追加できないから。

なのでCODEOWNER設定がある場合、2のパターンでBYPASSする必要がある。しかしこの設定がややこしい(というよりリファレンスがない)。

Rulesetsを分けてバイパス設定をする

設定のポイントは

  • block force pushやstatus checkのrulesetから Requied ApprovalsとRestrict update のruleを分離しておく
  • Bypasslist に OWNERとRenovateを追加し Exempt from rules にする

設定例

こうしておくと、Renovateが出すPRにはRequired Approvals設定が除外され、別のRulesetに設定しているStatus CheckによるCIが通ればautomergeによって自動でマージされていく。あとオーナーは自身のPRによる強制マージもできる。

対象ブランチのアップデートを保護により絞る場合、 Restrict updates のルールもRequired Approvedの設定側に分離しておく必要があり、これはmerge=target branch updateとなるからで、ややこしい。