코드 소유자 구문 및 오류 처리

Tier: Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

이 페이지에서는 코드 소유자 파일에서 사용되는 구문과 오류 처리에 대해 설명하고, 예제 파일을 제공합니다.

코드 소유자 구문

주석

#로 시작하는 줄은 무시됩니다:

# 이것은 주석입니다

섹션

섹션은 항목의 그룹입니다. 섹션은 대괄호로 둘러싸인 섹션 제목으로 시작하며, 뒤이어 항목이 옵니다.

[섹션 이름]  
/path/of/protected/file.rb @username  
/path/of/protected/dir/ @group  

섹션 제목

섹션 제목은 항상 이름이 있어야 합니다. 선택적으로 만들거나 특정 수의 승인이 필요하도록 설정할 수 있습니다. 섹션 제목 줄에 기본 소유자 목록을 추가할 수 있습니다.

# 필수 섹션  
[섹션 이름]  

# 선택적 섹션  
^[섹션 이름]  

# 5개의 승인이 필요한 섹션  
[섹션 이름][5]  

# @username을 기본 소유자로 하는 섹션  
[섹션 이름] @username  

# @group과 @subgroup을 기본 소유자로 하고 2개의 승인이 필요한 섹션  
[섹션 이름][2] @group @subgroup  

섹션 이름

섹션 이름은 대괄호로 둘러싸인 사이에 정의됩니다. 섹션 이름은 대소문자를 구분하지 않습니다. 같은 이름을 가진 섹션은 결합됩니다.

[섹션 이름]  

필수 섹션

필수 섹션은 섹션 이름 앞에 ^를 포함하지 않습니다.

[필수 섹션]  

선택적 섹션

선택적 섹션은 섹션 이름 앞에 ^를 포함합니다.

^[선택적 섹션]  

여러 승인이 필요한 섹션

여러 승인이 필요한 섹션은 섹션 이름 뒤에 대괄호로 승인 수를 포함합니다.

[5개의 승인이 필요한 섹션][5]  

참고:
선택적 섹션은 필요한 승인 수를 무시합니다.

기본 소유자가 있는 섹션

섹션의 항목에 대한 기본 소유자를 정의하려면 소유자를 섹션 제목에 추가합니다.

# @username을 기본 소유자로 하는 섹션  
[섹션 이름] @username  

# @group과 @subgroup을 기본 소유자로 하고 2개의 승인이 필요한 섹션  
[섹션 이름][2] @group @subgroup  

코드 소유자 항목

각 코드 소유자 항목에는 경로와 하나 이상의 소유자가 포함됩니다.

README.md @username1  

참고:
항목이 섹션에 중복될 경우, 각 섹션에서 마지막 항목이 사용됩니다.

상대 경로

경로가 /로 시작하지 않으면 경로는 globstar로 시작하는 것처럼 처리됩니다. README.md/**/README.md와 동일하게 처리됩니다:

# 이것은 /README.md, /internal/README.md, /app/lib/README.md에 일치합니다  
README.md @username  

# 이것은 /internal/README.md, /docs/internal/README.md, /docs/api/internal/README.md에 일치합니다  
internal/README.md  

절대 경로

경로가 /로 시작하면 저장소의 루트와 일치합니다.

# 저장소의 루트에 있는 파일 이름이 `README.md`인 경우에만 일치합니다.  
/README.md  

# `/docs` 디렉토리 내에 있는 파일 이름이 `README.md`인 경우에만 일치합니다.  
/docs/README.md  

디렉토리 경로

경로가 /로 끝나면 해당 디렉토리의 모든 파일과 일치합니다.

# 이것은 `/docs/**/*`와 동일합니다  
/docs/  

와일드카드 경로

와일드카드는 경로의 하나 이상의 문자를 일치시키는 데 사용할 수 있습니다.

# docs 디렉토리의 모든 markdown 파일
/docs/*.md @username

# 모든 파일 유형의 /docs/index 파일
# 예: /docs/index.md, /docs/index.html, /docs/index.xml
/docs/index.* @username

# 이름에 'spec'이 포함된 docs 디렉토리의 모든 파일
# 예: /docs/qa_specs.rb, /docs/spec_helpers.rb, /docs/runtime.spec
/docs/*spec* @username

# docs 디렉토리 내의 한 단계 깊이 있는 README.md 파일
# 예: /docs/api/README.md
/docs/*/README.md @username

글롭스타 경로

글롭스타(**)는 0개 이상의 디렉토리와 하위 디렉토리에 일치시키는 데 사용할 수 있습니다.

# 이 경로는 /docs/index.md, /docs/api/index.md, /docs/api/graphql/index.md와 일치합니다.
docs/**/index.md

항목 소유자

항목 뒤에는 하나 이상의 소유자가 있어야 합니다. 이는 그룹, 서브그룹 및 사용자일 수 있습니다. 소유자의 순서는 중요하지 않습니다.

/path/to/entry.rb @group
/path/to/entry.rb @group/subgroup
/path/to/entry.rb @user
/path/to/entry.rb @group @group/subgroup @user

항목 소유자로서의 그룹

그룹 및 서브그룹은 항목의 소유자가 될 수 있습니다.

각 항목은 하나 이상의 소유자에게 소유될 수 있습니다.

자세한 내용은 그룹을 코드 소유자로 추가하기를 참조하세요.

/path/to/entry.rb @group
/path/to/entry.rb @group/subgroup
/path/to/entry.rb @group @group/subgroup

항목 소유자로서의 사용자

사용자는 항목의 소유자가 될 수 있습니다.

각 항목은 하나 이상의 소유자에게 소유될 수 있습니다.

/path/to/entry.rb @username1
/path/to/entry.rb @username1 @username2

코드 소유자에서의 오류 처리

  • 오류 검증이 도입됨 GitLab 16.3에서.

공백이 있는 항목

공백을 포함하는 경로는 백슬래시로 이스케이프해야 합니다: path\ with\ spaces/*.md.

백슬래시 없이, 첫 번째 공백 이후의 경로는 소유자로 파싱됩니다.

GitLab은 folder with spaces/*.md @grouppath: "folder", owners: " with spaces/*.md @group" 으로 파싱합니다.

파싱할 수 없는 섹션

섹션 제목을 파싱할 수 없는 경우, 해당 섹션은 다음과 같이 처리됩니다:

  1. 항목으로 파싱됨.
  2. 이전 섹션에 추가됨.
  3. 이전 섹션이 존재하지 않는 경우, 해당 섹션은 기본 섹션에 추가됨.

기본 섹션 이후

* @group

[섹션 이름
docs/ @docs_group

GitLab은 제목 [섹션 이름을 항목으로 인식합니다. 기본 섹션에는 3개의 규칙이 포함되어 있습니다:

  • 기본 섹션
    • *@group에 의해 소유됨
    • [섹션name에 의해 소유됨
    • docs/@docs_group에 의해 소유됨

명명된 섹션 이후

[문서]
docs/**/* @group

[섹션 이름
docs/ @docs_group

GitLab은 제목 [섹션 이름을 항목으로 인식합니다. [문서] 섹션에는 3개의 규칙이 포함되어 있습니다:

  • docs/**/*@group에 의해 소유됨
  • [섹션name에 의해 소유됨
  • docs/@docs_group에 의해 소유됨

잘못된 소유자

각 항목은 유효하려면 1명 이상의 소유자를 포함해야 하며, 잘못된 소유자는 무시됩니다.
예를 들어 /path/* @group user_without_at_symbol @user_with_at_symbol@group@user_with_at_symbol이 소유하게 됩니다.

접근할 수 없는 또는 잘못된 소유자

접근할 수 없는 또는 잘못된 소유자는 무시됩니다.
예를 들어 @group, @username, 및 example@gitlab.com이 프로젝트에서 접근 가능하고, 다음과 같은 항목을 생성하는 경우:

* @group @grou @username @i_left @i_dont_exist example@gitlab.com invalid@gitlab.com

GitLab은 @grou, @i_left, @i_dont_exist, 및 invalid@gitlab.com을 무시합니다.

접근 가능한 사용자에 대한 자세한 정보는 Add a group as a Code Owner에서 확인하십시오.

소유자가 없는 경우

항목에 소유자가 없거나, 접근 가능한 소유자가 존재하지 않는 경우, 해당 항목은 유효하지 않습니다.
이 규칙은 절대 만족될 수 없기 때문에, GitLab은 병합 요청에서 이를 자동 승인합니다.

참고:
보호된 브랜치에 Require code owner approval이 활성화된 경우, 소유자가 없는 규칙도 여전히 적용됩니다.

1개 미만의 필수 승인 필요

섹션의 승인 수 정의하기에서 최소 승인 수는 1입니다.
승인 수를 0으로 설정하면 GitLab은 1개의 승인을 요청합니다.

예시 CODEOWNERS 파일

# 이것은 CODEOWNERS 파일의 예시입니다.
# `#`로 시작하는 줄은 무시됩니다.

# app/ @commented-rule

# 와일드카드를 사용하여 기본 코드 소유자를 지정합니다:
* @default-codeowner

# 탭 또는 공백을 사용하여 여러 코드 소유자를 지정합니다:
* @multiple @code @owners

# 파일 내에서 나중에 정의된 규칙은 이전에 정의된 규칙보다 우선합니다.
# 예를 들어, `.rb`로 끝나는 모든 파일에 대해:
*.rb @ruby-owner

# `#`가 있는 파일도 파운드 기호를 이스케이프하여 접근할 수 있습니다:
\#file_with_pound.rb @owner-file-with-pound

# 공백 또는 탭으로 구분된 여러 코드 소유자를 지정합니다.
# 다음 경우를 예로 들어 루트 레포의 CODEOWNERS 파일에는 3명의 코드 소유자(@multiple @code @owners)가 있습니다:
CODEOWNERS @multiple @code @owners

# 사용자 이름이나 이메일 주소를 사용하여 사용자를 일치시킬 수 있습니다.
# 나머지는 무시됩니다. 예를 들어, 이 코드는 `@legal`과 이메일 `janedoe@gitlab.com`을
# LICENSE 파일의 소유자로 지정합니다:
LICENSE @legal this_does_not_match janedoe@gitlab.com

# 그룹 이름을 사용하여 그룹을 일치시키고, 중첩 그룹을 사용하여
# 해당 그룹을 파일의 소유자로 지정합니다:
README @group @group/with-nested/subgroup

# 경로를 `/`로 끝내면 해당 디렉터리에 포함된 모든 파일의 코드 소유자를 지정합니다. 
# 모든 수준에서:
 /docs/ @all-docs

# 경로를 `/*`로 끝내면 디렉터리의 모든 파일에 대한 코드 소유자를 지정하지만 
# 더 깊은 곳에는 지정하지 않습니다. 이 코드는 `docs/index.md`와 일치하나 
# `docs/projects/index.md`와는 일치하지 않습니다:
/docs/* @root-docs

# `/**`를 포함하여 디렉터리에 있는 모든 하위 디렉터리의 코드 소유자를 지정합니다.
# 이 규칙은 `docs/projects/index.md` 또는 `docs/development/index.md`와 일치합니다:
/docs/**/*.md @root-docs

# 이 코드는 저장소 내 어디에서나 중첩된 `lib` 디렉터리와 일치합니다:
lib/ @lib-owner

# 이 코드는 저장소의 루트에 있는 `config` 디렉터리에만 일치합니다:
/config/ @config-owner

# 경로에 공백이 포함된 경우 다음과 같이 이스케이프합니다:
path\ with\ spaces/ @space-owner

# 코드 소유자 섹션:
[Documentation]
ee/docs    @docs
docs       @docs

# 섹션에 대한 기본 소유자 사용. 이 경우 모든 파일(*)은 개발 팀에 의해 소유되며
# README.md와 data-models는 다른 팀에 의해 소유됩니다.
[Development] @dev-team
*
README.md @docs-team
data-models/ @data-science-team

# 이 섹션은 이전에 정의된 [Documentation] 섹션과 결합됩니다:
[DOCUMENTATION]
README.md  @docs