Code Owners 구문 및 오류 처리

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

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

Code Owners 구문

주석

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

# 이것은 주석입니다

섹션

세션은 항목의 그룹입니다. 섹션은 섹션 제목으로 시작하여 항목이 뒤따릅니다.

[섹션 이름]
/protected/file.rb @사용자명
/protected/dir/ @그룹

섹션 제목

섹션 제목은 항상 이름이 있어야 합니다. 선택 사항으로 만들 수도 있으며 또는 필요한 승인 수가 있을 수 있습니다. 섹션 제목 행에 기본 소유자 디렉터리을 추가할 수 있습니다.

# 필수 섹션
[섹션 이름]

# 선택 사항 섹션
^[섹션 이름]

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

# 기본 소유자로 @username이 지정된 섹션
[섹션 이름] @username

# 기본 소유자로 @그룹 및 @서브그룹이 지정되고 2개의 승인이 필요한 섹션
[섹션 이름][2] @그룹 @서브그룹

섹션 이름

섹션 이름은 대괄호 사이에 정의됩니다. 섹션 이름은 대소문자를 구분하지 않습니다. index.md#sections-with-duplicate-names에 나온대로 중복 이름을 가진 섹션들은 결합됩니다.

[섹션 이름]

필수 섹션

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

[필수 섹션]

선택 사항 섹션

선택 사항 섹션은 섹션 이름 앞에 ^가 포함됩니다.

^[선택 사항 섹션]

여러 승인이 필요한 섹션

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

[5개의 승인이 필요한 섹션][5]
note
선택 사항 섹션은 필요한 승인 수를 무시합니다.

기본 소유자가 있는 섹션

섹션의 항목에 기본 소유자를 정의할 수 있습니다. 이를 위해 기본 소유자를 섹션 제목 뒤에 추가합니다. ```plaintext # 기본 소유자로 @username이 지정된 섹션 [섹션 이름] @username

기본 소유자로 @그룹 및 @서브그룹이 있으며 2개의 승인이 필요한 섹션

[섹션 이름][2] @그룹 @서브그룹 ```

Code Owner 항목

각 Code Owner 항목은 하나 이상의 소유자가 포함된 경로를 포함합니다.

README.md @username1
note
섹션 내에 항목이 중복되는 경우 각 섹션에서 마지막 항목이 사용됩니다.

상대 경로

경로가 /로 시작하지 않으면 경로는 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 디렉터리의 모든 마크다운 파일에 일치합니다.
/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

Globstar 경로

Globstar(**)를 사용하여 제로 또는 그 이상의 디렉터리와 하위 디렉터리와 일치시킬 수 있습니다.

# 이것은 /docs/index.md, /docs/api/index.md, /docs/api/graphql/index.md에 일치합니다.
/docs/**/index.md

항목 소유자

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

/path/to/entry.rb @그룹
/path/to/entry.rb @그룹/서브그룹
/path/to/entry.rb @사용자
/path/to/entry.rb @그룹 @그룹/서브그룹 @사용자

항목 소유자로서의 그룹

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

/path/to/entry.rb @그룹
/path/to/entry.rb @그룹/서브그룹
/path/to/entry.rb @그룹 @그룹/서브그룹

사용자로서의 항목 소유자

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

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

Code Owners의 오류 처리

  • 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 소유

이 파일에는 Sectionname 사이에 이스케이프되지 않은 공백이 있습니다. GitLab은 의도한 섹션 제목을 항목으로 인식합니다:

[Docs]
docs/**/* @group

[섹션 이름]{2} @group
docs/ @docs_group

그러면 [Docs] 섹션에는 다음과 같이 3가지 규칙이 포함됩니다:

  • docs/**/*@group 소유
  • [섹션name]{2} @group 소유
  • 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은 Merge Request에서 이를 자동으로 승인합니다.

note
보호된 브랜치에 코드 소유자 승인 필수가 활성화된 경우에도, 소유자 없는 규칙은 여전히 존중됩니다.

필요한 승인 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

# 공백이나 탭으로 구분된 여러 코드 소유자를 지정할 수 있습니다.
# 다음 예시에서 repo의 루트의 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

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

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