[GitHub Actions] Reivewers自動設定

2024-02-23 hit count image

GitHub Actionsを使ってPull requestのReviewersにレビュアーを自動で設定する方法について説明します。

概要

GitHubPull requestを生成すると、次のようにReviewersに手動でレビュアーを設定していました。

GitHub Actions - Set reviewers

今回のブログポストではGitHub Actionsを使ってPull requestReiewersにレビュアーを自動で設定する方法について説明します。

GitHub Actions

Pull requestReviewersにレビュアーを自動で設定するためには、.github/workflows/set_reviewers.ymlファイルを生成して次のように修正します。

name: Set reviewers

on:
  pull_request:

jobs:
  set-reviewers:
    name: Set reviewers
    runs-on: ubuntu-latest
    timeout-minutes: 1
    steps:
      - name: Set reviewers
        run: |
          actor="$"
          reviewers=("USER_1" "USER_2" "USER_3")

          reviewers=($(printf "%s\n" "${reviewers[@]}" | grep -v "$actor" | shuf -n 2))
          reviewers=$(printf '%s\n' "${reviewers[@]}" | jq -R . | jq -s .)

          curl -X POST \
            -H "Content-Type: application/json" \
            -H "Authorization: token $" \
            -d "{ \"reviewers\": $reviewers }" \
            "https://api.github.com/repos/$/pulls/$/requested_reviewers"

このGitHub ActionsUSER_1USER_2USER_3の中からPull requestを生成した人を除外してランダムに 2 人をReviewersに設定するように作りました。

actor="$"
reviewers=("USER_1" "USER_2" "USER_3")

reviewers=($(printf "%s\n" "${reviewers[@]}" | grep -v "$actor" | shuf -n 2))

Pull requestReviewersには基本的にPull requestを生成した人は設定できません。

このGitHub Actionsを使うとPull requestを生成するたびにランダムにレビュアーを設定してレビュアーを選ぶ時間を短縮することができます。

Dependabot 用 GitHub Actions

先ほど作成したGitHub ActionsDependabotが作ったPull requestでは動かないです。このGitHub ActionsDependabotでも動作するようにするためにはpull_request部分をpull_request_targetに修正する必要があります。.github/workflows/set_reviewers.ymlファイルを開いて次のように修正します。

name: Set reviewers

on:
  pull_request_target:

jobs:
  set-reviewers:
    name: Set reviewers
    runs-on: ubuntu-latest
    timeout-minutes: 1
    steps:
      - name: Set reviewers
        run: |
          actor="$"
          reviewers=("USER_1" "USER_2" "USER_3")

          reviewers=($(printf "%s\n" "${reviewers[@]}" | grep -v "$actor" | shuf -n 2))
          reviewers=$(printf '%s\n' "${reviewers[@]}" | jq -R . | jq -s .)

          curl -X POST \
            -H "Content-Type: application/json" \
            -H "Authorization: token $" \
            -d "{ \"reviewers\": $reviewers }" \
            "https://api.github.com/repos/$/pulls/$/requested_reviewers"

Dependabotが作ったPull requestではセキュリティ上の理由でどのようなsercretsも使うことができず、Readonly動作のみが可能なためエラーが発生します。

これを修正するためにはonの部分をpull_requestからpull_request_targetに修正する必要があります。

actions/github-script

GitHubが提供しているactions/github-scriptを使うともっと読みやすいコードを書くことができます。

actions/github-scriptを使うと次のように修正することができます。

name: Set reviewers

on:
  pull_request_target:

jobs:
  set-reviewers:
    name: Set reviewers
    runs-on: ubuntu-latest
    timeout-minutes: 1
    steps:
      - name: Set reviewers
        uses: actions/github-script@v5
        with:
          github-token: $
          script: |
            const reviewers = ["USER_1", "USER_2", "USER_3"];
            const actor = context.payload.pull_request.user.login;
            const { owner, repo } = context.repo;
            const prNumber = context.payload.pull_request.number;

            const { data: assignedReviewers } = await github.rest.pulls.listRequestedReviewers({
              owner,
              repo,
              pull_number: prNumber,
            });

            if (assignedReviewers.length === 0) {
              const filteredReviewers = reviewers.filter(reviewer => reviewer !== actor);
              const selectedReviewers = filteredReviewers.sort(() => Math.random() - 0.5).slice(0, 2);

              const prNumber = context.payload.pull_request.number;
              await github.rest.pulls.requestReviewers({
                owner,
                repo,
                pull_number: prNumber,
                reviewers: selectedReviewers
              });
            }

完了

これでPull requestReviewersを自動で設定するGitHub Actionsを作成することができました。このGitHub Actionsを使うとPull requestReviewersを設定する時間を減らすことができるし、特定のユーザーにレビューリクエストが集中させることを防ぐことができます。

私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!

アプリ広報

今見てるブログを作成たDekuが開発したアプリを使ってみてください。
Dekuが開発したアプリはFlutterで開発されています。

興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。

Posts