풀리퀘스트시 리뷰어 자동 할당하기

POII·2023년 7월 15일
4

이제 슬슬 기능을 개발해야하는데, 매 기능을 개발할 때마다 같은 사람에게 리뷰를 일일이 할당하는 것이 귀찮았습니다. 또, 빼먹을 가능성도 있구요.

그래서 Pull Request Template으로 풀리퀘스트 양식 작성을 자동화한 것처럼 리뷰어 또한 자동으로 할당하고 싶었습니다.

찾아보니 github에서는 CODEOWNERS 라는 파일로 위 기능을 지원하고 있었습니다.

이 기능에 대해 알아보고 정리해보았습니다.

(사실상 공식 docs 번역…., docs 페이지 자체도 한글 페이지를 지원하지만 번역이 어색한 부분이 있어 영문판을 다시 번역했습니다.)

CODEOWNERS란?

: CODEOWNERS 는 팀 또는 개인을 해당 레파지터리의 책임자(이하 코드 오너)로 명시하는 파일을 뜻합니다. 여기서 해당 레파지터리의 코드 오너로 할당될 수 있는 유저는 레파지터리에 쓰기 권한을 가진 유저로 제한됩니다.

이 파일을 이용하여 레파지터리에 Pull Request를 merge 하기 전, 레파지터리의 코드 오너들에게 반드시 approve를 받도록 설정할 수 있습니다.

GitHub free 인 경우에는 public 레파지터리에서만 코드 오너 설정을 할 수 있습니다.

코드 오너들은 다른 유저가 그들 소유의 코드를 수정 하고 풀리퀘스트를 올렸을 때, 자동으로 리뷰어로 할당됩니다.

이 때, ready for review 상태의 풀리퀘스트가 아닌 draft 상태의 풀리퀘스트에는 리뷰어가 할당되지 않으므로 주의해야합니다.

파일의 위치

CODEOWNERS 파일은 root 밑의 docs 또는 .github 디렉터리에 위치해야합니다.

각 CODEOWNERS 파일들은 각 브랜치별로 코드 오너들을 적용합니다. 즉, 브랜치별로 코드 오너들을 다르게 설정할 수 있습니다.

다르게 말하면, 풀리퀘스트의 base branch 에 존재하는 코드 오너들이 리뷰 요청을 받게 됩니다.

파일의 크기

CODEOWNERS 파일은 반드시 3MB 이하여야합니다. 그렇지 않을 경우 CODEOWNERS 파일은 로드되지 않고, 당연히 코드 오너들에게 리뷰 요청도 전달되지 않습니다.

문법

기본적으로 CODEOWNERS 파일의 문법은 gitignore 파일과 비슷합니다.

유저 이름의 경우 @poi1649 처럼 사용하며, 팀 이름의 경우 @woowacourse/team-201 처럼 사용합니다.

만약 팀을 코드 오너로 지정하고 싶다면, 팀 안의 각 팀원들이 레파지터리의 write 권한이 있다고 하더라도, 팀 자체에게 명시적으로 write 권한을 부여해야만합니다.

만약 어떤 패턴에 대하여 코드 오너들을 여러명 할당하고 싶다면, 코드 오너들의 이름을 반드시 한 줄에 적어야 합니다. 그렇지 않으면, 명시된 패턴 이후 가장 마지막 줄에 명시된 이름만 코드 오너로 지정됩니다.

기본적으로는 github의 유저 이름을 코드 오너를 명시할 때 사용할 수 있고, github에 등록된 email도 사용할 수 있습니다.

깃허브에서는 항상 대소문자를 구분하기 때문에 CODEOWNERS 파일 또한 대소문자를 구별하여 작성해주어야합니다.

만약 CODEOWNERS 파일안에 문법에 맞지 않는 문장이 있다면, 해당 문장은 스킵됩니다.

CODEOWNERS 파일 안에서 발생하는 에러들은 API 를 통해 접근할 수 있습니다.

레파지터리 API 목록 에서 더 자세히 확인할 수 있습니다.

뒤에 언급된 패턴일 수록 높은 우선도를 갖습니다.

* @global-owner

*.js @js-owner

위와 같은 경우 js-onwer만 js 확장자 파일의 코드 오너로 설정됩니다.

디렉터리 패턴을 사용할 경우 맨 앞에 / 를 붙여주면 루트 디렉터리 밑의 디렉터리만 코드 오너로 지정됩니다.


/apps/ @rootAppsOwner #루트 밑의 apps 디렉터리 하위 파일들에 대한 코드 오너로 지정합니다.

apps/ @allAppsOwner #레파지터리 안의 모든 apps 디렉터리 하위 파일들에 대한 코드 오너로 지정합니다.

아스터리스크 (*) 를 사용해 더 다양한 패턴을 만들 수 있습니다.

apps/* @onlyAppsOwner 
# apps/owner.md 는 소유하지만 apps/some/notOnwer.md 처럼 apps의 다른 디렉터리
# 밑의 파일들은 소유하지 않습니다.

**/logs @allLogOwner
# /frontend/logs, /backend/logs 등 logs 라는 이름의 디렉터리 하위 파일들을 소유합니다.

특정 디렉터리는 소유자를 지정하고 싶지 않다면 유저란을 공란으로 남겨두면 됩니다.

/apps/ @appsWithoutGithubOwner
/apps/github
# apps/github 디렉터리 하위는 위 유저가 소유하지 않습니다.

특정 조건을 제외시킬 때는 ! 를 사용할 수 있습니다.
(풀리퀘스트 작성자는 알아서 리뷰어에서 빠지기 때문에 굳이 제외해줄 필요는 없습니다.

/apps/ @!exceptHim @org/teams # 특정 유저는 제외한 팀이 코드를 소유합니다

후기

처음에는 github actions의 pull request open 트리거를 사용해 리뷰어를 할당해볼까 했지만, 이렇게 간편한 방법이 있는데 굳이 돌아갈 필요가 없다고 느꼈습니다.

목표했던 github actions 파고들기는 실패했지만, 더 쉬운 방법을 알게 돼서 기쁩니다.

읽어주셔서 감사합니다.

references

github docs

profile
https://github.com/poi1649/learning

2개의 댓글

comment-user-thumbnail
2023년 7월 16일

특정 기술에 매몰되지 않고, 가장 간단한 방법으로 문제를 해결해나가시는 모습이 인상깊네요 👍

1개의 답글