👩‍🎤

レビュー待ちプルリクを減らす GitHub Actions

2024/05/27に公開
2

ラブグラフのエンジニア&CTOをしております横江( @yokoe24 )です!

ラブグラフでは昨年、エンジニアインターンが4名も増えました!🎉
おかげでチームの開発力が上がったのですが、こんな問題も!

プルリク溜まっていく問題

どこの会社でもあるあるだと思うのですが、
開発チームの人数が増えてくると、開発力が上がりプルリクエストがいっぱい作られ、
今度はレビューが間に合わない問題が起こっていきます。

前までは、
「自分のプルリクエストがレビューされるまで、開発チームのチャンネルにリマインドし続けよう!」という方針でなんとかなっていたのですが、
インターンは常に勤務してるわけではないので各々がリマインドし続けるというのは限界があり、
インターンの作ったプルリクエストが放置されやすくなる問題が発生していきました😰

ミニマムな解決法

ミニマムな解決法としては、
プルリクに 「レビュー依頼中」 のようなラベルを使ってもらい、
その一覧が見られる URL を Slack のリマインダーなどで定時通知させることです。

これも一定の効果があると思います!

さらに進んだ解決法

「レビュー依頼中」ラベルを使うことについては同じなのですが、
私たちのチームではさらに一歩進んだ解決方法をとりました!!

うちのチームの nekonenene さんが、
レビュー待ちのプルリク一覧を Slack へ投稿する CLI ツールを一晩で作ってくださったので、
それを GitHub Actions で動かすようにしてみました。

https://github.com/nekonenene/gh-pull-requests-slack-reminder

こんな感じの表示になります。

この Slack 通知を、朝と夕方に GitHub Actions 経由で通知されるようにしています。

なにがいいか

情報がプッシュ型になる

機能的には GitHub の検索機能でラベルを確認するのとほとんど同じなのですが、
不思議と Slack にプルリク一覧を通知されるほうが、レビューを見に行く確率が上がります

ここの言語化は難しいのですが、例えば「レビュー依頼中」ラベルの検索結果が0件だったとき
「見に行って損した」に近しい気持ちになり、次第に検索結果のページに行く意欲が減少します。
一方、プルリク一覧が Slack に通知される場合は、そのようなガッカリ体験を減らせます。

取りに行かないといけない情報が減って、自動で配信される情報が増えていると言えるでしょう。

自分の Approve 済みのプルリクが明白

この通知では、そのプルリクに対して誰がすでに Approve したのかまで記載されています
これは GitHub の検索機能ではわからない要素です。

これにより、自身がすでに Approve したプルリクURLを再び訪れてしまう可能性を減らせます。
これも「見に行って損した」に近しい気持ちになることを避けられる工夫ですね!

複数リポジトリのレビュー待ちを集約できる

複数リポジトリを管理している場合はいっそう便利です!

リポジトリ A, B, C のレビュー待ち通知をサーバーサイドチームの Slack チャンネルに、
リポジトリ D, E のレビュー待ち通知をフロントエンドチームの Slack チャンネルに、
などといったこともおこないやすいです。

各リポジトリのレビュー待ちプルリクエストを横断して検索することは
https://github.com/pulls?q=is%3Aopen+is%3Apr+archived%3Afalse+user%3Aorg_name+label%3A%22%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E4%BE%9D%E9%A0%BC%E4%B8%AD%22
のような GitHub 検索でおこなうことも出来ますが、より柔軟性があります。

GitHub Actions の設定

どのように設定しているか、弊社での GitHub Actions の YAML ファイルを公開します。

なお、 GitHub の各リポジトリにおいて

  • レビュー依頼中
  • レビューを受けての修正中

という2つのラベルをすでに作成しているものとします。

pr_review_reminder.yml

「レビュー依頼中」ラベルが貼ってあるプルリクエストの一覧を Slack に通知します。

環境変数 REVIEW_REMINDER_SLACK_WEBHOOK_URL の設定方法については
こちらをお読みください

name: Pull Request Review Reminder
on:
  workflow_dispatch: # 手動実行
  schedule:
    # 日本時間の毎日 9:30 と 16:30 に実行される(参考: https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule )
    - cron: "30 0,7 * * *"

jobs:
  reminder:
    name: reminder
    runs-on: ubuntu-latest
    timeout-minutes: 10
    env:
      TZ: Asia/Tokyo
    steps:
      - uses: actions/setup-go@v5
        with:
          go-version: ^1.22.1
      - name: Install gh-pull-requests-slack-reminder
        run: go install github.com/nekonenene/gh-pull-requests-slack-reminder@v1
      - name: Run gh-pull-requests-slack-reminder
        run: >
          gh-pull-requests-slack-reminder
          --token ${{ secrets.GITHUB_TOKEN }}
          --owner ${{ github.repository_owner }}
          --repo ${{ github.event.repository.name }}
          --label-name "レビュー依頼中"
          --webhook-url "${{ vars.REVIEW_REMINDER_SLACK_WEBHOOK_URL }}"
          --avoid-weekend --avoid-jp-holidays

update_labels_on_changes_requested.yml

「レビュー依頼中」ラベルが貼ってあるプルリクエストに対して、
「Request changes」のレビューがされたときに
「レビューを受けての修正中」ラベルに貼り替える GitHub Actions です。

name: Update Labels when Requested Changes
on:
  pull_request_review:
    types: [submitted]

jobs:
  update-labels:
    if: github.event.review.state == 'changes_requested'
    runs-on: ubuntu-latest
    steps:
      - name: 「レビュー依頼中」ラベルの除去
        uses: actions/github-script@v7
        continue-on-error: true # ラベルがない場合はエラーになるが無視する
        with:
          script: |
            github.rest.issues.removeLabel({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number,
              name: 'レビュー依頼中',
            });
      - name: 「レビューを受けての修正中」ラベルの付与
        uses: actions/github-script@v7
        with:
          script: |
            github.rest.issues.addLabels({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number,
              labels: ['レビューを受けての修正中'],
            });

GitHub Script を活用しています。

remove_label_on_pr_closed.yml

マージされたときに「レビュー依頼中」ラベルを剥がしてあげています。
別になくても大丈夫ですが、「レビュー依頼中」ラベルをけっこう目立つ色にしているぶん、
マージ済みプルリクにラベルが付いたままだと気になるという人もいたので。

name: Remove a Label when Closed Pull Request
on:
  pull_request:
    types: [closed]

jobs:
  remove-label:
    runs-on: ubuntu-latest
    steps:
      - name: 「レビュー依頼中」ラベルの除去
        uses: actions/github-script@v7
        continue-on-error: true # ラベルが付いてない場合はエラーになるが無視する
        with:
          script: |
            github.rest.issues.removeLabel({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number,
              name: 'レビュー依頼中',
            });

おわりに

こうして、人力でおこなわれていたレビューリマインドが自動化され、
以前よりはレビュー待ちが少なくなりました🤩

レビューをもらった箇所の修正をおこなってから
「レビュー依頼中」ラベルに貼り替えるのを忘れるということが時々起きるので、
そこはラベル運用の難しいところではありますね。

今後も自動化によって、エンジニアの手作業をどんどん減らしていきたいです!

ラブグラフのエンジニアブログ

Discussion

kyoh86kyoh86

GitHubの公式Slack Appが、 Reviews Assigned to Your Team という名目で毎日リマインドしてくれる機能を持っているので、もし参考になれば幸いです。
https://github.com/integrations/slack