1. GitHub CODEOWNERS 소개
- GitHub CODEOWNERS는 리포지토리 내 코드의 책임자를 정의하는 기능입니다.
- 이를 통해 특정 코드 영역에 대해 자동으로 리뷰 요청을 받을 담당자나 팀을 지정할 수 있습니다.
- 풀 리퀘스트가 생성될 때 변경된 파일에 대한 코드 소유자에게 자동으로 리뷰 요청이 전송됩니다.
1.1 CODEOWNERS의 주요 이점
- 팀 구성원의 전문 분야를 명확히 하고 책임 소재를 분명히 합니다.
- 적절한 리뷰어를 수동으로 찾아 지정하는 과정을 자동화합니다.
- 코드 변경 시 관련 전문가의 리뷰를 보장하여 코드 품질을 향상시킵니다.
- 브랜치 보호 규칙과 결합 하여 코드 소유자의 승인 없이는 병합할 수 없도록 설정할 수 있습니다.
1.2 사용 권한
- CODEOWNERS 파일을 생성하거나 편집하려면 리포지토리에 대한 쓰기 권한이 필요합니다.
- 코드 소유자로 지정된 사용자나 팀도 리포지토리에 대한 쓰기 권한이 있어야 합니다.
- 관리자 또는 소유자 권한이 있는 사용자는 풀 리퀘스트 병합 전에 코드 소유자의 승인을 필수로 요구하도록 설정할 수 있습니다.
2. CODEOWNERS 설정 방법
2.1 파일 위치
- CODEOWNERS 파일은 다음 위치 중 하나에 생성할 수 있습니다:
.github/
디렉토리- 리포지토리의 루트 디렉토리
docs/
디렉토리
- GitHub는 위의 순서대로 파일을 검색하고 처음 발견한 파일을 사용합니다.
- 각 CODEOWNERS 파일은 리포지토리의 단일 브랜치에 대한 코드 소유자를 지정합니다.
정보
서로 다른 브랜치에 대해 다른 코드 소유자를 지정할 수 있습니다. 예를 들어, 기본 브랜치의 코드베이스에는 @octo-org/codeowners-team
을, GitHub Pages용 gh-pages 브랜치에는 @octocat
을 지정할 수 있습니다.
2.2 파일 크기 제한
- CODEOWNERS 파일은 3MB 미만이어야 합니다.
- 이 제한을 초과하는 파일은 로드되지 않으며, 코드 소유자 정보가 표시되지 않고 적절한 코드 소유자에게 리뷰 요청이 전송되지 않습니다.
- 파일 크기를 줄이려면 와일드카드 패턴을 사용하여 여러 항목을 하나의 항목으로 통합하는 것이 좋습니다.
3. CODEOWNERS 문법 가이드
3.1 기본 문법
- CODEOWNERS 파일은 gitignore 파일과 유사한 패턴 규칙을 사용합니다.
- 각 줄은 파일 패턴과 하나 이상의 소유자로 구성됩니다.
- 소유자는
@username
또는@org/team-name
형식을 사용합니다.
기본 문법 예시
# 이것은 주석입니다.
# 각 줄은 파일 패턴과 하나 이상의 소유자로 구성됩니다.
# 이 소유자들은 리포지토리의 모든 파일에 대한 기본 소유자가 됩니다.
# 나중에 더 구체적인 매칭이 없는 한, @global-owner1과 @global-owner2가
# 풀 리퀘스트에 대한 리뷰 요청을 받게 됩니다.
* @global-owner1 @global-owner2
# JavaScript 파일을 수정하는 풀 리퀘스트는 @js-owner에게만 리뷰 요청이 갑니다.
*.js @js-owner
# 이메일 주소도 사용할 수 있습니다.
*.go docs@example.com
3.2 고급 패턴 사용법
- 디렉토리와 하위 디렉토리에 대한 소유권을 지정할 수 있습니다.
- 특정 경로에 대한 소유자를 지정하거나 제외할 수 있습니다.
- 여러 소유자를 동일한 패턴에 매칭시키려면 모든 소유자가 같은 줄에 있어야 합니다.
고급 패턴 예시
# 루트의 /build/logs/ 디렉토리와 그 하위 디렉토리의 모든 파일은 @doctocat이 소유합니다.
/build/logs/ @doctocat
# docs/* 패턴은 docs/getting-started.md와 같은 파일은 일치하지만
# docs/build-app/troubleshooting.md와 같이 더 깊이 중첩된 파일은 일치하지 않습니다.
docs/* docs@example.com
# 리포지토리 내 어디에나 있는 apps 디렉토리의 파일은 @octocat이 소유합니다.
apps/ @octocat
# /scripts/ 디렉토리 내의 모든 변경은 @doctocat 또는 @octocat의 승인이 필요합니다.
/scripts/ @doctocat @octocat
# /logs/ 디렉토리(예: /build/logs/, /scripts/logs/, /deeply/nested/logs/)의 모든 파일은
# @octocat이 소유합니다.
**/logs @octocat
3.3 문법 제한 사항
- gitignore 파일에서 작동하는 일부 문법 규칙은 CODEOWNERS 파일에서 작동하지 않습니다:
\
를 사용하여#
로 시작하는 패턴을 이스케이프하는 기능!
를 사용하여 패턴을 무효화하는 기능[ ]
를 사용하여 문자 범위를 정의하는 기능
경고
CODEOWNERS 경로는 대소문자를 구분합니다. GitHub는 대소문자를 구분하는 파일 시스템을 사용하기 때문에, macOS와 같이 대소문자를 구분하지 않는 시스템에서도 CODEOWNERS 파일에서 경로와 파일은 올바른 대소문자를 사용해야 합니다.
4. 실전 CODEOWNERS 설정 예시
4.1 팀 기반 소유권 설정
- 팀을 코드 소유자로 지정할 수 있습니다.
- 팀은 @org/team-name 형식으로 식별되어야 합니다.
- 팀은 리포지토리에 대한 명시적인 쓰기 권한이 있어야 합니다.
# 텍스트 파일은 octo-org 조직의 octocats 팀이 소유합니다.
*.txt @octo-org/octocats
# 프론트엔드 코드는 프론트엔드 팀이 담당합니다.
/frontend/ @company/frontend-team
# 백엔드 코드는 백엔드 팀이 담당합니다.
/backend/ @company/backend-team
# 인프라 관련 코드는 DevOps 팀이 담당합니다.
/infrastructure/ @company/devops-team