[GitHub Actions] Assignees 자동 설정

2024-02-20 hit count image

GitHub Actions를 사용하여 Pull request의 Assignees에 Pull request를 생성한 사람을 자동으로 설정하는 방법에 대해서 알아보겠습니다.

개요

GitHub에서 Pull request를 생성할 때, 다음과 같이 Assignees에 수동으로 Pull request를 생성한 사람을 설정하고 있었습니다.

GitHub Actions - Set assignees

Pull requestAssignees는 결국 Pull request를 생성한 사람이므로 Pull request를 생성할 때마다 AssigneesPull request를 생성한 사람을 자동으로 설정하면 좋겠다고 생각했습니다.

이번 블로그 포스트에서는 GitHub Actions를 사용하여 Pull requestAssigneesPull request를 생성한 사람을 자동으로 설정하는 방법에 대해서 알아보겠습니다.

GitHub Actions 생성

그럼 Pull requestAssigneesPull request를 생성한 사람을 자동으로 설정하는 GitHub Actions를 만들어 봅시다. .github/workflows/set_assignees.yml 파일을 생성하고 다음과 같이 수정합니다.

name: Set assigness

on:
  pull_request:
    types:
      - opened

jobs:
  set-assignees:
    name: Set assignees
    runs-on: ubuntu-latest
    timeout-minutes: 1
    steps:
      - name: Set assignees
        run: |
          OWNER="$"
          REPOSITORY="$"
          TOKEN="$"
          PULL_REQUEST_NUMBER="$"

          ASSIGNEES=$(curl -s \
            "https://api.github.com/repos/$OWNER/$REPOSITORY/issues/$PULL_REQUEST_NUMBER" | \
            jq --raw-output '.assignees // [] | .[].login')

          if [ -z "$ASSIGNEES" ]; then
            ASSIGNEE=$

            curl -X POST \
              -H "Content-Type: application/json" \
              -H "Authorization: token $TOKEN" \
              -d "{ \"assignees\": \"${ASSIGNEE}\" }" \
              https://api.github.com/repos/$REPOSITORY/issues/$PULL_REQUEST_NUMBER/assignees
          fi

GitHub가 제공해는 API를 사용하여 Pull requestAssigneesPull request를 생성한 사람(github.actor)을 설정하도록 만들었습니다.

Dependabot용 GitHub Actions

저는 개인 프로젝트에서 Dependabot을 사용하고 있습니다. Dependabot이 생성한 Pull request에 프로젝트 OwnerAssignees에 설정하고 싶었습니다.

이를 위해서 GitHub Actions를 다음과 같이 수정하였습니다.

name: Set assigness

on:
  pull_request:
    types:
      - opened

jobs:
  set-assignees:
    name: Set assignees
    runs-on: ubuntu-latest
    timeout-minutes: 1
    steps:
      - name: Set assignees
        run: |
          OWNER="$"
          REPOSITORY="$"
          TOKEN="$"
          PULL_REQUEST_NUMBER="$"

          ASSIGNEES=$(curl -s \
            "https://api.github.com/repos/$OWNER/$REPOSITORY/issues/$PULL_REQUEST_NUMBER" | \
            jq --raw-output '.assignees // [] | .[].login')

          if [ -z "$ASSIGNEES" ]; then
            ASSIGNEE=$
            BRANCH_NAME=$

            if [[ "${BRANCH_NAME}" == "dependabot/"* ]]; then
              ASSIGNEE=$OWNER
            fi

            curl -X POST \
              -H "Content-Type: application/json" \
              -H "Authorization: token $TOKEN" \
              -d "{ \"assignees\": \"${ASSIGNEE}\" }" \
              https://api.github.com/repos/$REPOSITORY/issues/$PULL_REQUEST_NUMBER/assignees
          fi

추가한 내용은 다음과 같이 branch 이름이 dependabot/으로 시작하는 경우, Assigneesgithub.repository_owner를 설정하도록 만들었습니다.

BRANCH_NAME=$

if [[ "${BRANCH_NAME}" == "dependabot/"* ]]; then
  ASSIGNEE=$OWNER
fi

하지만 이 GitHub ActionsDependabotPull request에서 정상 동작하지 않았습니다. 보안상에 이유로 DependabotPull request에서는 그 어떤 sercrets도 사용할 수 없으며, Readonly 동작만 가능하기 때문에 에러가 발생하였습니다.

이를 수정하기 위해서는 onpull_request 대신 pull_request_target을 사용하도록 수정해야 합니다.

name: Set assigness

on:
  pull_request_target:
    types:
      - opened

actions/github-script

GitHub에서 제공하는 actions/github-script를 사용하면 좀 더 읽기 쉬운 코드를 작성할 수 있습니다.

actions/github-script를 사용하면 다음과 같이 수정할 수 있습니다.

name: Set assignees

on:
  pull_request_target:
    types:
      - opened

jobs:
  set-assignees:
    name: Set assignees
    runs-on: ubuntu-latest
    timeout-minutes: 1
    steps:
      - uses: actions/checkout@v4
      - name: Set assignees
        uses: actions/github-script@v6
        with:
          github-token: $
          script: |
            const { owner, repo } = context.repo;
            const prNumber = context.payload.pull_request.number;

            const response = await github.rest.issues.get({
              owner,
              repo,
              issue_number: prNumber,
            })
            const { assignees } = response.data;

            if (assignees.length === 0) {
              let assignee = context.actor;
              const branchName = context.payload.pull_request.head.ref;

              if (branchName.startsWith('dependabot/')) {
                assignee = owner;
              }

              await github.rest.issues.addAssignees({
                owner: owner,
                repo: repo,
                issue_number: prNumber,
                assignees: [assignee]
              });
            }

완료

이것으로 Pull requestAssigneesPull request를 생성한 사람을 자동으로 설정하는 GitHub Actions를 만들어보았습니다. Pull request를 생성할 때마다 AssigneesPull request를 생성한 사람을 등록하고 있다면, 이 GitHub Actions를 사용하여 자동화해 보시기 바랍니다.

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

앱 홍보

책 홍보

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

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

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