[Github] Pull Request 설정

serotonins·2024년 6월 10일

📌 특정 인원 수 이상에게 Approve 받아야 Merge 가능

Repository의 Setting에 들어가서 Branches 탭을 선택, Add branch ruleset 버튼을 눌러준다.


  • Ruleset Name: 규칙 이름 지어주기(필수)
  • Enforcement status: Disabled 되어있는데 Active로 바꿔줘야 적용이 됨
  • Bypass list: 이 규칙에 얽매이지 않아도 되는 사람 설정해주기
  • Target branches: 여기에 Add target 눌러서 Include default branch 해주면 default branch인 main이 보호된다 == Pull Request를 해서 merge 한 게 들어갈 브랜치가 보호된다
  • Branch protections: Restrict deletions, Block force pushes(강제 푸시 금지) 가 기본으로 활성화되어있고, 우리가 선택해줘야하는 건 Require a pull request before merging.
    Required approvals를 조정해 몇명에게 Approve를 받아야하는지 설정하면 된다.

📌 Pull Request 날릴 때 reviewers, assignee 자동으로 등록하게 하기

방법은 두가지 있다.

방법 1. Code Owner

.github/CODEOWNERS 파일을 만든다

  1. CODEOWNERS 안에 * @collaborator1 @collaborator2 @collaborator3 이렇게 한 명씩 지정하거나,
  2. Organization, Team 생성해서 CODEOWNERS 안에 * @your-organization/your-team 이렇게 팀 한꺼번에 추가할 수도 있다. - 근데 이건 리포지토리가 아예 Organization 안에 생성되어야 한다!

추가해서 저장했다면 CODEOWNERS를 커밋해서 이걸 원격 저장소의 default 브랜치에 push해서 세팅해둔다.


그 다음 Require a pull request before merging 안에 Require review from Code Owners 옵션을 활성화해준다.


Pull Request 등록할 때 자동으로 Reviewer가 추가되어있는 모습을 확인할 수 있다!
그러나 Asignee는 무조건 Actions로 등록해야하는 듯 하다.
그리고 Code Owner 권한을 다른 사람들에게는 안 주고 싶을 수도 있잖아.
그래서 제가 선택한 등록 방법은요...

방법 2. Actions

어차피 Asignee 때문에 Actions를 등록해야 한다면 Reviewer도 Actions로 등록하자!

Repository에서 Actions 탭을 눌러보면 이렇게 뜨는데 여기서 set up a workflow yourself -> 라고 되어있는 파란 글씨 클릭


이미 Actions에 뭐 하나 등록해둔 사람은 이렇게 뜨는데, New workflow 버튼 눌러주면 아까 그 화면 뜬다.


yml 파일 편집창이 뜨게 되는데, 파일 이름은 원하는대로 적어두고 아래 코드에 리뷰어 아이디 목록 원하는대로 채워넣기!
설명하느라 주석 많이 달아놨는데 거슬리면 지우고 등록하기

name: Reviewer Assign # Workflow 이름

on: # Workflow를 트리거하는 이벤트 지정
  pull_request: # pull_request 이벤트가 발생할 때 트리거!
    types: [opened, ready_for_review] # opened: pull_request가 생성될 때, ready_for_review: pull_request가 리뷰 준비 상태로 변경될 때

permissions: # 권한 지정(안 해주니까 에러 나더라)
  pull-requests: write
  issues: write

jobs: # Workflow에서 실행할 작업을 정의
  assign: # 작업의 이름
    runs-on: ubuntu-latest # 작업이 실행될 환경: 최신 우분투 환경
    steps: # 작업 내에서 실행할 단계들 정의
    - name: Assign reviewers and assignee # step 이름
      uses: actions/github-script@v6 # actions/github-script 액션을 사용하여 JavaScript 스크립트를 실행
      with: # 액션에 전달할 입력값 정의
        # 아래는 실행할 JavaScript 내용
        script: |
          const reviewers = ['홍길동', '이순신']; // 리뷰어 아이디 목록
          
          // 비동기 함수로 감싸서 await 사용 가능하게 함
          // github와 context 객체를 매개변수로 받는다
          (async ({github, context}) => {
            const prAuthor = context.actor; // PR 작성자 아이디
            const assignees = [prAuthor]; // 담당자는 pr 올리는 본인 등록

            // PR 작성자를 리뷰어 목록에서 제외
            const filteredReviewers = reviewers.filter(reviewer => reviewer !== prAuthor);

			// 풀 리퀘스트 번호
            const pullRequestNumber = context.payload.pull_request.number;
            // 리포지토리 소유자 아이디
            const owner = context.repo.owner;
            // 리포지토리 이름
            const repo = context.repo.repo;

            // 리뷰어 추가
            if (filteredReviewers.length > 0) {
              await github.rest.pulls.requestReviewers({
                owner,
                repo,
                pull_number: pullRequestNumber,
                reviewers: filteredReviewers
              });
            }

            // 담당자 추가
            await github.rest.issues.addAssignees({
              owner,
              repo,
              issue_number: pullRequestNumber,
              assignees
            });
          })({github, context});

GitHub API 호출은 비동기 작업이고,
Github Actions 스크립트는 비동기 작업이 완료되기 전에 다음 줄로 넘어갈 수 있기 때문에, 비동기 작업이 올바르게 완료되기를 보장하려면 await를 사용하는 것이 좋다고 하네요.

0개의 댓글