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

이번 블로그 포스트에서는 GitHub Actions를 사용하여 Pull request의 Reviewers에 리뷰어를 자동으로 설정하는 방법에 대해서 알아보겠습니다.
GitHub Actions
Pull request의 Reviewers에 리뷰어를 자동으로 설정하려면 .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 Actions는 USER_1, USER_2, USER_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 request의 리뷰어에는 기본적으로 Pull request를 생성한 사람은 설정할 수 없습니다.
이 GitHub Actions를 사용하면 Pull request를 생성할 때마다 랜덤으로 리뷰어를 설정하여 리뷰어를 고르는 시간을 줄일 수 있습니다.
Dependabot용 GitHub Actions
앞서 만든 GitHub Actions은 Dependabot이 만든 Pull request에서는 동작하지 않습니다. 이 GitHub Actions를 Dependabot에서도 동작하도록 만들기 위해서는 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에서는 보안상에 이유로 그 어떤 secrets도 사용할 수 없으며, Readonly 동작만 가능하기 때문에 에러가 발생합니다.
- GitHub Actions: Workflows triggered by Dependabot PRs will run with read-only permissions
 - Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests
 
이를 수정하기 위해서는 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 request의 Reviewers를 자동으로 설정하는 GitHub Actions를 만들어보았습니다. 이 GitHub Actions를 사용하면 Pull request에 Reviewers를 설정하는 시간을 줄일 수 있고, 특정 사용자에게 리뷰 요청이 집중되는 것을 막을 수 있습니다.
 제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다! 
앱 홍보
Deku가 개발한 앱을 한번 사용해보세요.Deku가 개발한 앱은 Flutter로 개발되었습니다.관심있으신 분들은 앱을 다운로드하여 사용해 주시면 정말 감사하겠습니다.














![[심통]현장에서 바로 써먹는 리액트 with 타입스크립트 : 리액트와 스토리북으로 배우는 컴포넌트 주도 개발, 심통](https://img1c.coupangcdn.com/image/affiliate/banner/7cba8cb0601eebaf88a17a0c3cf65a63@2x.jpg)