고급 `CODEOWNERS` 구성
GitLab v19.5Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
요약
CODEOWNERS 파일을 사용하면 특정 파일과 디렉터리를 누가 담당하는지 정의할 수 있습니다. GitLab은 패턴 매칭에 File::FNM_DOTMATCH와 File::FNM_PATHNAME 플래그를 설정한 File::fnmatch를 사용합니다:
CODEOWNERS 파일을 사용하면 특정 파일과 디렉터리를 누가 담당하는지 정의할 수 있습니다.
패턴 매칭, 섹션, 상속 규칙으로 머지 리퀘스트에 리뷰어를 지정하고
머지 전에 해당 리뷰어의 승인을 요구할 수 있습니다.
패턴 매칭#
GitLab은 패턴 매칭에 File::FNM_DOTMATCH와 File::FNM_PATHNAME 플래그를 설정한 File::fnmatch를 사용합니다:
- 리포지터리 구조는 독립된 파일 시스템처럼 취급됩니다.
- 패턴은 셸 파일 이름 글로빙 규칙의 일부를 따르며, 정규 표현식이 아닙니다.
File::FNM_DOTMATCH플래그는*가.gitignore같은 닷파일과도 일치하도록 허용합니다.File::FNM_PATHNAME플래그는*가 경로 구분자/와 일치하지 않도록 합니다.**는 디렉터리를 재귀적으로 일치시킵니다. 예를 들어**/*.rb는config/database.rb와app/controllers/users/stars_controller.rb에 일치합니다.
기본 Code Owner 및 선택적 섹션#
기본 소유자 구문을 선택적 섹션 및 필수 승인과 함께 사용하려면 기본 소유자를 맨 끝에 배치합니다:
[Documentation][2] @docs-team
docs/
README.md
^[Database] @database-team
model/db/
model/db/database-setup.md @docs-team
일반 항목과 섹션#
섹션 밖의 경로에 기본 Code Owner를 지정하면 해당 소유자의 승인이 항상 필요합니다. 이런 항목은 섹션으로 재정의되지 않습니다. 섹션에 속하지 않은 항목은 이름 없는 또 다른 섹션처럼 취급됩니다:
# Required for all files
* @general-approvers
[Documentation] @docs-team
docs/
README.md
*.txt
[Database] @database-team
model/db/
model/db/database-setup.md @docs-team
이 예시에서 각 항목의 의미는 다음과 같습니다:
@general-approvers는 모든 위치의 모든 항목을 소유하며, 재정의되지 않습니다.@docs-team은Documentation섹션의 모든 항목을 소유합니다.@database-team은Database섹션에서model/db/database-setup.md를 제외한 모든 항목을 소유합니다. 이 파일은 재정의를 통해@docs-team에 할당되어 있습니다.model/db/CHANGELOG.txt를 수정하는 머지 리퀘스트에는@general-approvers,@docs-team,@database-team그룹에서 각각 하나씩 총 세 건의 승인이 필요합니다.
이 동작은 섹션의 기본 소유자만 사용할 때와 비교됩니다. 그 경우에는 섹션 안의 개별 항목이 섹션 기본값을 재정의합니다.
중복된 이름의 섹션#
이름이 같은 섹션이 여러 개 있으면 하나로 합쳐집니다. 또한 섹션 제목은 대소문자를 구분하지 않습니다. 예를 들면 다음과 같습니다:
[Documentation]
ee/docs/ @docs
docs/ @docs
[Database]
README.md @database
model/db/ @database
[DOCUMENTATION]
README.md @docs
이 코드는 Documentation 섹션 제목 아래에 세 개의 항목을, Database 아래에 두 개의
항목을 만듭니다. Documentation 섹션과 DOCUMENTATION 섹션에 정의된 항목은
먼저 나온 섹션의 대소문자 표기를 사용해 하나로 합쳐집니다.
특정 파일 또는 디렉터리에 대한 Code Owner 정의#
파일이나 디렉터리가 CODEOWNERS 파일의 여러 항목에 일치하면,
그 파일이나 디렉터리에 일치하는 마지막 패턴의 사용자가 적용됩니다. 따라서 항목의 순서를
적절히 배치하면 더 구체적으로 정의한 파일이나 디렉터리에 더 구체적인 소유자를
정의할 수 있습니다.
예를 들어 다음과 같은 CODEOWNERS 파일이 있다고 가정합니다:
# This line would match the file terms.md
*.md @doc-team
# This line would also match the file terms.md
terms.md @legal-team
이 경우 terms.md의 Code Owner는 @legal-team 입니다.
Code Owner에게 여러 승인 요구#
머지 리퀘스트의 Approvals 영역에서 Code Owners 섹션에 여러 건의 승인을 요구할 수 있습니다.
섹션 이름 뒤에 대괄호로 숫자 n을 덧붙입니다. 예를 들면 [2] 나 [3] 입니다.
이렇게 하면 해당 섹션의 Code Owner 로부터 n 건의 승인이 필요합니다.
n에는 ≥ 1 인 정수를 사용할 수 있습니다. [1]은 기본값이므로 생략할 수 있습니다. n에 유효하지 않은 값을 넣으면 1로 처리됩니다.
이슈 384881에서는 이 설정의 동작 변경을 제안하고 있습니다. 유효하지 않은 값을 의도적으로 설정하지 않습니다. 이후 유효한 값이 되어 예기치 않은 동작을 일으킬 수 있습니다.
Code Owner에게 여러 승인을 요구하려면 다음과 같이 진행합니다:
- 상단 바에서 Search or go to를 선택하고 프로젝트를 찾습니다.
- 왼쪽 사이드바에서 Settings > Repository를 선택합니다.
- Branch rules를 확장합니다.
- 기본 브랜치 옆에서 View details를 선택합니다.
- Code owner approval 아래의 토글을 켭니다.
CODEOWNERS파일을 편집해 여러 승인 규칙을 추가합니다.
예를 들어 [Documentation] 섹션에 두 건의 승인을 요구하려면 다음과 같이 작성합니다:
[Documentation][2]
*.md @tech-writer-team
[Ruby]
*.rb @dev-team
Approvals 영역의 Documentation Code Owners 섹션에 두 건의 승인이 필요하다고 표시됩니다:

그룹 상속 및 자격#
소스 코드 보기
%%{init: { "fontFamily": "GitLab Sans" }}%%
graph TD
accTitle: Diagram of group inheritance
accDescr: If a subgroup owns a project, the parent group inherits ownership.
A[Parent group X] -->|owns| B[Project A]
A -->|contains| C[Subgroup Y]
C -->|owns| D[Project B]
A-. inherits ownership .-> D이 예시에서 각 항목의 의미는 다음과 같습니다:
- 상위 그룹 X(
group-x)가 Project A를 소유합니다. - 상위 그룹 X에는 하위 그룹인 Subgroup Y(
group-x/subgroup-y)도 포함되어 있습니다. - Subgroup Y가 Project B를 소유합니다.
Code Owner가 될 수 있는 대상은 다음과 같습니다:
- Project A: Group X의 멤버만 해당합니다. Project A는 Subgroup Y에 속하지 않기 때문입니다.
- Project B: Group X와 Subgroup Y의 멤버 모두 해당합니다.
상위 그룹과 공유된 그룹#
히스토리
- GitLab 18.5에서
check_inherited_groups_for_codeowners라는 기능 플래그와 함께 도입되었습니다. 기본적으로 비활성화되어 있습니다. - GitLab 18.6에서 GitLab.com, GitLab Self-Managed, GitLab Dedicated에 활성화되었습니다.
- GitLab 18.8에서 일반 공개되었습니다. 기능 플래그
check_inherited_groups_for_codeowners는 제거되었습니다.
그룹의 멤버가 직접 소속되지 않은 프로젝트에서도 Code Owner 자격을 갖게 하려면 해당 프로젝트의 상위 그룹에 그룹을 초대할 수 있습니다. 그룹을 초대하면 그 그룹의 직접 멤버는 상위 그룹 계층의 모든 프로젝트에서 Code Owner 자격을 갖습니다.
사전 요구 사항:
- 다른 그룹을 초대할 그룹에 대한 Owner 권한이 있어야 합니다.
- 그룹을 초대할 때 Developer, Maintainer 또는 Owner 권한을 할당해야 합니다.
예를 들어 다음과 같은 계층이 있다고 가정합니다:
group-x
├── engineering-group
└── product-group
└── project-a
engineering-group을 product-group에 초대하면 engineering-group의 멤버는
project-a에서 Code Owner 자격을 갖습니다.
engineering-group을 project-a에 직접 초대할 필요는 없습니다.
초대된 그룹의 직접 멤버만 Code Owner 자격을 갖습니다. 초대된 그룹에서 멤버십을 상속한 멤버는 자격이 없습니다.
오류 처리#
공백이 있는 항목#
경로의 공백은 백슬래시로 이스케이프합니다:
path\ with\ spaces/*.md @owner
이스케이프하지 않으면 GitLab은 folder with spaces/*.md @group을 path: "folder", owners: " with spaces/*.md @group"으로 해석합니다.
파싱할 수 없는 섹션#
히스토리
- GitLab 17.11에서 구문 분석할 수 없는 섹션 제목을 항목으로 파싱하지 않고 무시하도록 변경되었습니다.
섹션 제목을 파싱할 수 없으면 GitLab은 다음과 같이 처리합니다.
- 제목을 무시합니다.
- 제목 뒤에 오는 항목을 이전 섹션에 추가합니다. 이전 섹션이 없으면 항목을 기본 섹션에 추가합니다.
CODEOWNERS파일을 확인할 때Unparsable sections오류를 표시합니다.
[Docs]] 또는 [Docs][ 1]처럼 GitLab이 여전히 사용할 수 있는 일부 잘못된 형식의 제목에도
Unparsable sections 오류가 나타납니다.
GitLab은 이러한 제목을 섹션으로 취급하므로, 이 오류가 항상 제목이 무시된다는 뜻은 아닙니다.
기본 섹션 이후#
* @group
[Section name
docs/ @docs_group
GitLab은 제목 [Section name을 무시합니다. 기본 섹션에는 다음 두 가지 규칙이 포함됩니다:
@group이 소유하는*@docs_group이 소유하는docs/
명명된 섹션 이후#
[Docs]
docs/**/* @group
[Section name
docs/ @docs_group
GitLab은 제목 [Section name을 무시합니다. [Docs] 섹션에는 다음 두 가지 규칙이 포함됩니다:
@group이 소유하는docs/**/*@docs_group이 소유하는docs/
잘못된 형식의 소유자#
각 항목에는 소유자가 하나 이상 있어야 합니다. 잘못된 형식의 소유자는 유효하지 않으며 무시됩니다:
/path/* @group user_without_at_symbol @user_with_at_symbol
이 항목은 @group과 @user_with_at_symbol 이 소유합니다.
접근 불가능하거나 잘못된 소유자#
GitLab은 접근할 수 없거나 잘못된 소유자를 무시합니다. 예를 들면 다음과 같습니다:
* @group @grou @username @i_left @i_dont_exist example@gitlab.com invalid@gitlab.com
@group, @username, example@gitlab.com만 접근 가능하면 GitLab은 나머지를 무시합니다.
소유자가 없는 경우#
항목에 소유자가 없거나 접근 가능한 소유자가 하나도 없으면 그 항목은 유효하지 않습니다. 이 규칙은 충족될 수 없으므로 GitLab은 머지 리퀘스트에서 해당 규칙을 자동으로 승인 처리합니다.
보호된 브랜치에 Require code owner approval 이 활성화되어 있으면 소유자가 없는
규칙도 그대로 적용됩니다.
최소 승인 수#
섹션에 승인 수를 정의할 때
최소 승인 수는 1 입니다. 승인 수를 0으로 설정하면
GitLab은 승인 한 건을 요구합니다.