🐧

automerge できなかった Renovate の Pull Request を Issue として管理

2022/05/26に公開

e.g. renovate-issue-action によって自動で作成・Close された Issue

image

automerge できなかった Renovate の Pull Request を Issue として管理するために作った OSS を紹介します。

https://github.com/suzuki-shunsuke/renovate-issue-action

背景・課題

以前 Terraform Monorepo に対する Renovate の大量の Pull Request を処理するための技術に関する Blog を書きました。

https://blog.studysapuri.jp/entry/2022/02/18/080000

この中で CI が失敗したら直ぐに PR を close してブランチも削除する という tips を紹介しています。詳細はブログを読んでください。
ブログにも書いてあるとおり、 Close した Pull Request は後で対応する必要がありますが、大規模な Monorepo で多くの人・チームが関係し日々多くの Pull Request が作られるような環境では、この対応が後手に回ってしまい、適切に処理されないこともあるかと思います。

対策

適切に対応していくには、まず対応するというタスクを Issue として管理するのが良いでしょう。
態々 Issue を作らなくても Close された Pull Request をチケットとして扱うというやり方もありますが、 Issue にすることで以下のようなメリットがあります。

  1. Open か Close かでタスクの状態を管理できる
  2. 残っているタスクの数や処理されたタスクの数を把握しやすい
  3. 複数の Close された Pull Request を一つの Issue にまとめることができる

3 について補足すると、 Renovate は新しいバージョンが出れば新たに Pull Request を作成するので、問題が未解決なままだと新たな Pull Request も Close されます。
つまり Pull Request をチケットとして扱う場合、チケットが重複して作成される場合があります。
関連する Renovate の Pull Request を同じ Issue に関連付けることでチケットの重複を防ぐことが出来ます。

次のスクショは Issue の description に複数の Close された Pull Request のリンクがリストアップされている状態です。 Pull Request は 2 つ close されていますが、 Issue は一つに集約されています。

image

Issue の自動作成

Renovate の Pull Request が merge されずに close されたら自動で Issue を作成するツールを作りました。

https://github.com/suzuki-shunsuke/renovate-issue-action

このツールを GitHub Actions で Pull Request が close されたら実行するようにします。
Issue の title は Renovate の packageName や packageFileDir によって一意に決まるようになっています。 renovate-issue-action は title で Issue を検索し、 Issue がなければ新規作成し、既にあれば Pull Request の URL を Issue の description に追記します。

Pull Request がマージされた場合、該当する Issue が存在すればそれを Close します。

image

ただし、 Renovate 以外が作成した Pull Request では Close されません。
つまり、人間が Pull Request を作成して修正したとしても自動では Close されません。
それを自動化するのは難しいし、人間が Close すれば済む話だからです。
Renovate の Pull Request を基本 automerge する場合、対応する Issue の Close も自動化する必要があります。

Issue に関する属性 (リポジトリ, title, body, assignees, labels, projects, etc) を設定ファイルで変更できるようになっています。
これらの属性は Renovate の packageName や packageFileDir によって変更することが出来ます。
update されるファイルの owner に応じて label や project を変えるというのが一つの使い方かなと思います。

e.g. projects/service-a 配下のファイルが update されたら @aquaproj/service-a にメンションし、 owner:service-a label をつけて Project service-a に追加する

  - if: Metadata.PackageFileDir startsWith "projects/service-a"
    issue:
      additional_body: "@aquaproj/service-a"
      additional_labels: ["owner:service-a"]
      projects:
        - service-a

team に assign できれば便利ではありますが、 GitHub Issue の仕様上 team を Issue に assign することは出来ません。そこで team ごとに label をつけたり body で team にメンションしたり、 team の project に追加したりするようにします。

さいごに

以上、 automerge できなかった Renovate の Pull Request を Issue として管理するために作った OSS を紹介しました。

このブログでは細かい部分は説明していないので、詳細はドキュメントを読んでください。

https://suzuki-shunsuke.github.io/renovate-issue-action/

このツールは便利ではありますが、このツールを使ったからといって automerge できなかった問題が勝手に解消されるわけではなく、相変わらず人間の対応が必要です。
Issue が作られても放置されていては意味がありません。
Renovate による update は直ぐ対応しなくても多くの場合直ぐには問題にはなりませんし、
プロダクトの機能に直結するわけでもないですし、多くの方は他にも様々なタスクを抱えています。そのため放置されることもあるでしょう。

Renovate の Issue に適切に向き合うには恐らく以下のようなことが必要でしょう。

  • Issue の存在・ Issue を作成している背景をチーム・組織に知ってもらう
    • なにも知らない人にいきなり Issue を assign したりしても相手は困惑するかもしれません
  • Issue に対する運用ルールをチーム・組織で定める。 Issue 対応が評価に繋がるようにする(ボランティアに依存しない
  • オーナーにタスクが適切に割り振られ、オーナーが Issue の存在に気づき、管理できるようにする
    • renovate-issue-action の設定のチューニング

ということで、さいごに色々書きましたが、もし同じような課題を持ってる方々の参考になれば幸いです。

Discussion