Code Owners 구문 및 오류 처리

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

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

Code Owners 구문

주석

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

# 이것은 주석입니다

섹션

섹션은 항목들의 그룹입니다. 섹션은 대괄호 안의 섹션 헤딩으로 시작하고 그 뒤에 항목들이 옵니다.

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

섹션 헤딩

섹션 헤딩은 항상 이름이 있어야 합니다. 선택 사항으로 만들거나 일정 수의 승인을 필요로 할 수 있습니다. 섹션 헤딩 라인에 기본 소유자 디렉터리을 추가할 수도 있습니다.

# 필수 섹션
[섹션 이름]

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

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

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

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

섹션 이름

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

[섹션 이름]

필수 섹션

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

[필수 섹션]

선택사항 섹션

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

^[선택 사항 섹션]

다중 승인이 필요한 섹션

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

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

기본 소유자가 있는 섹션

섹션 내 항목에 기본 소유자를 정의할 수 있습니다. 섹션 헤딩에 소유자들을 추가하여 완료할 수 있습니다.

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

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

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 디렉터리 안의 모든 markdown 파일
/docs/*.md @username

# 어떤 파일 형식이든 `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(**)는 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

항목 소유자로서의 그룹

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

/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

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
    • [섹션의 소유자는 이름
    • docs/의 소유자는 @docs_group

이 파일은 Sectionname 사이에 공백이 누락되어 있습니다. GitLab은 의도된 헤딩을 항목으로 인식합니다:

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

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

그러면 [문서] 섹션은 다음과 같이 3가지 규칙이 포함됩니다:

  • docs/**/*의 소유자는 @group
  • [섹션의 소유자는 이름]{2} @group
  • docs/의 소유자는 @docs_group

잘못된 소유자

유효한 항목은 각 항목이 하나 이상의 소유자를 포함해야 합니다. 잘못된 소유자는 무시됩니다. 예를 들어 /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을 무시합니다.

누가 접근 가능한지에 대한 자세한 내용은 그룹을 Code Owner로 추가를 참조하십시오.

소유자 없음

특정 항목에 소유자가 없거나 접근할 수 없는 소유자가 없는 경우 해당 항목은 유효하지 않습니다. 이 규칙은 절대 충족될 수 없으므로 GitLab에서는 Merge Request에서 자동으로 승인합니다.

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

필요한 승인이 1 미만인 경우

섹션의 승인 횟수를 정의할 때, 최소 승인 횟수는 1입니다. 승인 횟수를 0으로 설정하면 GitLab에서는 하나의 승인을 요구합니다.

CODEOWNERS 파일 예시

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

# app/ @commented-rule

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

# 탭이나 공백을 사용하여 여러 코드 소유자를 지정하세요:
* @multiple @code @owners

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

# `#`이 포함된 파일에 접근하려면 number sign을 이스케이핑하세요:
\#file_with_pound.rb @owner-file-with-pound

# 공백이나 탭으로 구분된 여러 코드 소유자를 지정하세요.
# 다음과 같은 경우, 리포지터리 루트에 있는 CODEOWNERS 파일이
# 3명의 코드 소유자(@multiple @code @owners)를 가집니다:
CODEOWNERS @multiple @code @owners

# 사용자를 매칭시키기 위해 사용자명이나 이메일 주소를 사용하세요.
# 그 외의 모든 것은 무시됩니다. 예를 들어, 이 코드는
# LICENSE 파일의 소유자로 `@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