Code Owners 구문 및 오류 처리

Tier: 프리미엄, 얼티밋 Offering: GitLab.com, Self-managed, GitLab Dedicated

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

Code Owners 구문

주석

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

# 이것은 주석입니다

섹션

섹션은 항목의 그룹입니다. 섹션은 대괄호 안에 섹션 제목으로 시작하여 항목들이 이어집니다.

[섹션 이름]
/보호된/파일/경로.rb @사용자명
/보호된/디렉토리/경로/ @그룹

섹션 제목

섹션 제목은 항상 이름이 있어야 합니다. 옵셔널하게 만들 수도 있고, 특정 수의 승인을 요구할 수도 있습니다. 섹션 제목 행에 기본 소유자 목록을 추가할 수 있습니다.

# 필수 섹션
[섹션 이름]

# 옵션 섹션
^[섹션 이름]

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

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

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

섹션 이름

섹션 이름은 대괄호 안에 정의됩니다. 섹션 이름은 대소문자를 가리지 않습니다. 중복된 이름을 가진 섹션은 합쳐집니다.

[섹션 이름]

필수 섹션

필수 섹션에는 섹션 이름 앞에 ^가 없습니다.

[필수 섹션]

옵션 섹션

옵션 섹션에는 섹션 이름 앞에 ^가 포함됩니다.

^[옵션 섹션]

여러 승인이 필요한 섹션

여러 승인이 필요한 섹션에는 섹션 이름 뒤의 대괄호 안에 승인 수가 포함됩니다.

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

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

기본 소유자가 있는 섹션

섹션 내 항목에 대한 기본 소유자를 섹션 제목에 추가하여 정의할 수 있습니다.

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

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

Code Owner 항목

각 Code Owner 항목에는 하나 이상의 소유자가 포함됩니다.

README.md @username1

참고: 섹션 내 항목이 중복되면, 각 섹션에서 마지막 항목이 사용됩니다.

상대 경로

경로가 /로 시작하지 않으면 해당 경로는 글로브스타로 시작한 것처럼 처리됩니다. 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` 디렉토리에 있는 모든 마크다운 파일
/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

항목 소유자

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

/항목/경로.rb @그룹
/항목/경로.rb @그룹/서브그룹
/항목/경로.rb @사용자
/항목/경로.rb @그룹 @그룹/서브그룹 @사용자

항목 소유자로 그룹 사용

그룹과 서브그룹은 항목의 소유자가 될 수 있습니다. 각 항목은 하나 이상의 소유자가 될 수 있습니다. 자세한 내용은 그룹을 Code Owner로 추가하기를 참조하십시오.

/항목/경로.rb @그룹
/항목/경로.rb @그룹/서브그룹
/항목/경로.rb @그룹 @그룹/서브그룹

항목 소유자로 사용자 사용

사용자는 항목의 소유자가 될 수 있습니다. 각 항목은 하나 이상의 소유자가 될 수 있습니다.

/항목/경로.rb @username1
/항목/경로.rb @username1 @username2

Code Owners의 오류 처리

  • GitLab 16.3에서 도입된 오류 확인 ### 공백이 포함된 항목

공백이 포함된 경로는 백슬래시로 이스케이핑해야 합니다: path\ with\ spaces/*.md. 백슬래시 없이 첫 번째 공백 이후의 경로는 소유자로 구문 분석됩니다. GitLab은 folder with spaces/*.md @group경로: "folder", 소유자: " with spaces/*.md @group"로 파싱합니다.

구문 분석할 수 없는 섹션

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

  1. 항목으로 파싱됨.
  2. 이전 섹션에 추가됨.
  3. 이전 섹션이 없으면, 기본 섹션에 추가됨.

기본 섹션 이후

* @group

[섹션 이름
docs/ @docs_group

GitLab은 [섹션 이름 제목을 항목으로 인식합니다. 기본 섹션에는 3가지 규칙이 포함됩니다:

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

[Section name
docs/ @docs_group

GitLab는 [Section name 제목을 항목으로 인식합니다. [Docs] 섹션에는 다음과 같이 3가지 규칙이 포함되어 있습니다:

  • docs/**/*@group이 소유합니다.
  • [Sectionname에 의해 소유됩니다.
  • 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을 무시합니다.

액세스할 수 있는지에 대한 자세한 정보는 그룹을 코드 소유자로 추가를 참조하세요.

소유자 없음

항목에 소유자가 포함되어 있지 않거나 액세스할 수 없는 소유자가 없는 경우, 항목은 유효하지 않습니다. 이 규칙은 절대 충족될 수 없으므로, GitLab은 합병 요청에서 자동으로 승인합니다.

참고: 보호된 브랜치에서 코드 소유자 승인 필요가 활성화되어 있는 경우, 소유자가 없는 규칙은 여전히 존중됩니다.

최소 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 @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

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

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

```