Code Owners 구문 및 오류 처리
이 페이지에서는 Code Owners 파일에서 사용되는 구문 및 오류 처리에 대해 설명하고 예제 파일을 제공합니다.
Code Owners 구문
주석
#
으로 시작하는 줄은 무시됩니다:
# 이것은 주석입니다
섹션
세션은 항목의 그룹입니다. 섹션은 섹션 제목으로 시작하여 항목이 뒤따릅니다.
[섹션 이름]
/protected/file.rb @사용자명
/protected/dir/ @그룹
섹션 제목
섹션 제목은 항상 이름이 있어야 합니다. 선택 사항으로 만들 수도 있으며 또는 필요한 승인 수가 있을 수 있습니다. 섹션 제목 행에 기본 소유자 디렉터리을 추가할 수 있습니다.
# 필수 섹션
[섹션 이름]
# 선택 사항 섹션
^[섹션 이름]
# 5개의 승인이 필요한 섹션
[섹션 이름][5]
# 기본 소유자로 @username이 지정된 섹션
[섹션 이름] @username
# 기본 소유자로 @그룹 및 @서브그룹이 지정되고 2개의 승인이 필요한 섹션
[섹션 이름][2] @그룹 @서브그룹
섹션 이름
섹션 이름은 대괄호 사이에 정의됩니다. 섹션 이름은 대소문자를 구분하지 않습니다. index.md#sections-with-duplicate-names에 나온대로 중복 이름을 가진 섹션들은 결합됩니다.
[섹션 이름]
필수 섹션
필수 섹션은 섹션 이름 앞에 ^
가 포함되지 않습니다.
[필수 섹션]
선택 사항 섹션
선택 사항 섹션은 섹션 이름 앞에 ^
가 포함됩니다.
^[선택 사항 섹션]
여러 승인이 필요한 섹션
여러 승인이 필요한 섹션에는 섹션 이름 뒤에 대괄호 안에 승인 수가 포함됩니다.
[5개의 승인이 필요한 섹션][5]
기본 소유자가 있는 섹션
섹션의 항목에 기본 소유자를 정의할 수 있습니다. 이를 위해 기본 소유자를 섹션 제목 뒤에 추가합니다. ```plaintext # 기본 소유자로 @username이 지정된 섹션 [섹션 이름] @username
기본 소유자로 @그룹 및 @서브그룹이 있으며 2개의 승인이 필요한 섹션
[섹션 이름][2] @그룹 @서브그룹 ```
Code Owner 항목
각 Code Owner 항목은 하나 이상의 소유자가 포함된 경로를 포함합니다.
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 디렉터리의 모든 마크다운 파일에 일치합니다.
/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 @group
를
path: "folder", owners: " with spaces/*.md @group"
로 구문 분석합니다.
구문 분석할 수 없는 섹션
섹션 제목이 구문 분석되지 않을 경우 섹션은 다음과 같이 처리됩니다:
- 항목으로 구문 분석됩니다.
- 이전 섹션에 추가됩니다.
- 이전 섹션이 없는 경우 섹션이 기본 섹션에 추가됩니다.
예를 들어, 다음 파일에는 대괄호가 닫힌 것이 없습니다:
* @group
[섹션 이름
docs/ @docs_group
GitLab은 [섹션 이름
을 항목으로 인식합니다. 기본 섹션에는 다음과 같이 3가지 규칙이 포함됩니다:
- 기본 섹션
-
*
이@group
소유 -
[섹션
이name
소유 -
docs/
가@docs_group
소유
-
이 파일에는 Section
과 name
사이에 이스케이프되지 않은 공백이 있습니다.
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에서 이를 자동으로 승인합니다.
코드 소유자 승인 필수
가 활성화된 경우에도, 소유자 없는 규칙은 여전히 존중됩니다.필요한 승인 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