🧹

actions/staleを使って放置されたPRをクローズしよう

2024/12/01に公開

はじめに

こんにちは。READFYORのエンジニアをしているshmokmtです。
READYFORで運用している主要なRuby on Railsアプリケーションのリポジトリは比較的モノリスです。
このリポジトリにはバックエンドエンジニアだけでなく、SREやフロントエンドエンジニアを含めたほとんどのエンジニアが高頻度でコミットします。
しかし、このリポジトリでPR一覧を見ようとすると、不要と思われる大量のPRがOpenなままになってしまっていました。
具体的には以下のような状況でした。

・コミットするエンジニアの人数が10~15人の規模であるのに対して、リモートブランチ数が何故か普通に200を越えている。
・退職者が作成していた数多くのPRがOpenになったままである。
・エンジニアがライブラリの導入のために試行錯誤したDraft PRがそのまま放置されている。
・作業者の手元に不要なリモート追跡ブランチがいつの間にか溜まる。

今回はSREもくもく会[1]を通して actions/stale を使ってPRをクローズするGitHub Actionsのworkflowを作成しました。
今回はworkflowのコードを丸ごと紹介します。


掃除がしたくてうずうずしている筆者

actions/staleを使ったPRのクローズ

実はactions/stale はissueもクローズできます。ですが、当該リポジトリはissueまでクローズする必要はないため、オプションで無効化しています。
dependabotによるPRは自動でクローズされてしまったら不都合である場合が多いため、dependenciesラベルがついている場合はクローズされないようにオプションで設定しています。

READYFORでは下記のworkflowでactions/staleを動かしています。

name: "Closing a Pull Request"
on:
  workflow_dispatch:
  schedule:
    - cron: "30 1 * * *" # 毎日午前10時30分(JST)に実行

jobs:
  stale:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
      contents: write
      issues: read
    steps:
      - uses: actions/stale@v9
        with:
          exempt-pr-labels: do-not-close,dependencies
          days-before-issue-stale: -1 # お掃除したいのはPRだけ。issueは対象外。
          days-before-issue-close: -1 # お掃除したいのはPRだけ。issueは対象外。
          days-before-pr-stale: 14 # 2週間アクティビティがない場合はstaleラベルを貼る。
          days-before-pr-close: 14 # staleラベルが貼られてから2週間アクティビティがない場合はクローズする
          delete-branch: true
          operations-per-run: 100
# see also https://docs.github.com/ja/actions/use-cases-and-examples/project-management/closing-inactive-issues

おわりに

PRのお掃除も年末掃除の1つです。
それではみなさん良いお年を。

参考

脚注
  1. 私の所属するシステム&データ基盤というチームでは、毎週金曜日にもくもく会という名目でOKRとは別でOSS活動や軽微なセキュリティ改善、Terraformのリファクタリング等を実施しています。 ↩︎

READYFORテックブログ

Discussion