[GitHub Actions] Reviewers 자동 설정

2024-02-03 hit count image

GitHub Actions를 사용하여 Pull request의 Reviewers에 리뷰어를 자동으로 설정하는 방법에 대해서 알아보겠습니다.

share

개요

GitHub에서 Pull request를 생성할 때, 다음과 같이 Reviewers에 수동으로 리뷰어를 설정하고 있었습니다.

GitHub Actions - Set reviewers

이번 블로그 포스트에서는 GitHub Actions를 사용하여 Pull requestReviewers에 리뷰어를 자동으로 설정하는 방법에 대해서 알아보겠습니다.

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="${{ github.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 ${{ secrets.GITHUB_TOKEN }}" \
            -d "{ \"reviewers\": $reviewers }" \
            "https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/requested_reviewers"

GitHub ActionsUSER_1, USER_2, USER_3 중에서 Pull request를 생성한 사람을 제외하고 랜덤으로 2명을 Reviewers로 설정하도록 만들었습니다.

actor="${{ github.actor }}"
reviewers=("USER_1" "USER_2" "USER_3")

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

Pull request의 리뷰어에는 기본적으로 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="${{ github.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 ${{ secrets.GITHUB_TOKEN }}" \
            -d "{ \"reviewers\": $reviewers }" \
            "https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/requested_reviewers"

Dependabot이 만든 Pull request에서는 보안상에 이유로 그 어떤 secrets도 사용할 수 없으며, Readonly 동작만 가능하기 때문에 에러가 발생합니다.

이를 수정하기 위해서는 onpull_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: ${{ secrets.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를 설정하는 시간을 줄일 수 있고, 특정 사용자에게 리뷰 요청이 집중되는 것을 막을 수 있습니다.

제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!

앱 홍보

책 홍보

블로그를 운영하면서 좋은 기회가 생겨 책을 출판하게 되었습니다.

아래 링크를 통해 제가 쓴 책을 구매하실 수 있습니다.
많은 분들에게 도움이 되면 좋겠네요.



SHARE
Twitter Facebook RSS