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に記載がある。
- https://github.com/renovatebot/renovate-approve-bot を使う
- 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となるからで、ややこしい。