[GitHub Actions] Reivewers 자동 설정

2024-02-23 hit count image

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

개요

GitHub에서 Pull 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_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 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 동작만 가능하기 때문에 에러가 발생합니다.

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

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

앱 홍보

책 홍보

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

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

스무디 한 잔 마시며 끝내는 React Native, 비제이퍼블릭
스무디 한 잔 마시며 끝내는 리액트 + TDD, 비제이퍼블릭
[심통]현장에서 바로 써먹는 리액트 with 타입스크립트 : 리액트와 스토리북으로 배우는 컴포넌트 주도 개발, 심통
Posts