InfoGrab DocsInfoGrab Docs

Code Owners 개발 가이드라인

요약

이 문서는 기여자들이 Code Owners의 코드 설계를 이해할 수 있도록 작성되었습니다. 이 문서는 코드가 자주 변경될 수 있으므로 코드 설계 방식에 대한 개요로 의도적으로 제한되어 있습니다. 이 문서는 여기서 참조하는 코드베이스의 일부가 업데이트, 삭제되거나 새로운 부분이 추가될 때 함께 업데이트되어야 합니다.

이 문서는 기여자들이 Code Owners의 코드 설계를 이해할 수 있도록 작성되었습니다. 이 기능의 코드를 변경하기 전에 이 문서를 읽어보세요.

이 문서는 코드가 자주 변경될 수 있으므로 코드 설계 방식에 대한 개요로 의도적으로 제한되어 있습니다. 기능의 특정 부분이 어떻게 작동하는지 이해하려면 코드와 스펙을 직접 확인하세요. 여기에서 설명하는 내용은 Code Owners 기능의 주요 구성 요소가 어떻게 작동하는지를 설명합니다.

이 문서는 여기서 참조하는 코드베이스의 일부가 업데이트, 삭제되거나 새로운 부분이 추가될 때 함께 업데이트되어야 합니다.

비즈니스 로직#

Code Owners에 관한 모든 비즈니스 로직은 Gitlab::CodeOwners 네임스페이스에 위치합니다. Code Owners는 EE 전용 기능이므로 파일은 ./ee 디렉터리에만 존재합니다.

  • Gitlab::CodeOwners: code owner 규칙과 상호작용하는 데 사용되는 주요 모듈입니다.

./ee/lib/gitlab/code_owners.rb에 정의되어 있습니다.

  • Gitlab::CodeOwners::File: CODEOWNERS 파일을 래핑하고 클래스의 공개 메서드를 통해 데이터를 노출합니다.

./ee/lib/gitlab/code_owners/file.rb에 정의되어 있습니다.

  • Gitlab::CodeOwners::Section: CODEOWNERS 파일의 섹션 헤딩을 래핑하고 다양한 부분을 파싱합니다.

./ee/lib/gitlab/code_owners/section.rb에 정의되어 있습니다.

  • Gitlab::CodeOwners::Entry: CODEOWNERS 파일의 항목(패턴 및 owner 라인)을 래핑하고 클래스의 공개 메서드를 통해 데이터를 노출합니다.

./ee/lib/gitlab/code_owners/entry.rb에 정의되어 있습니다.

  • Gitlab::CodeOwners::Loader: 올바른 CODEOWNER 파일을 찾아 Gitlab::CodeOwners::File 인스턴스로 콘텐츠를 로드합니다.

./ee/lib/gitlab/code_owners/loader.rb에 정의되어 있습니다.

  • Gitlab::CodeOwners::ReferenceExtractor: 텍스트에서 CODEOWNER 사용자, 그룹 및 이메일 참조를 추출합니다.

./ee/lib/gitlab/code_owners/reference_extractor.rb에 정의되어 있습니다.

  • Gitlab::CodeOwners::UsersLoader: 올바른 CODEOWNER 파일을 찾아 Gitlab::CodeOwners::File 인스턴스로 콘텐츠를 로드합니다.

./ee/lib/gitlab/code_owners/users_loader.rb에 정의되어 있습니다.

  • Gitlab::CodeOwners::GroupsLoader: 올바른 CODEOWNER 파일을 찾아 Gitlab::CodeOwners::File 인스턴스로 콘텐츠를 로드합니다.

./ee/lib/gitlab/code_owners/groups_loader.rb에 정의되어 있습니다.

  • Gitlab::Checks::Diffs::CodeOwnersCheck: require_code_owner_approval이 활성화된 보호된 브랜치에 사용자가 푸시할 때 CODEOWNERS 항목의 파일이 변경되지 않았는지 검증합니다.

./ee/lib/gitlab/checks/diffs/code_owners_check.rb에 정의되어 있습니다.

Code Owners의 Git 접근 검사 실행 순서#

Gitlab::Checks::DiffCheck#file_paths_validations는 빈 배열을 반환하거나, LFS가 활성화되어 있고 파일 잠금이 존재하는 경우 #lfs_file_locks_validation 결과의 단일 멤버가 있는 배열을 반환합니다. 이 파일의 EE 버전에서 #validate_code_owners의 반환 결과는 EE::Gitlab::Checks::DiffCheck#file_paths_validations에서 이 목록의 끝에 삽입됩니다. LFS 검사는 Code Owners 검사보다 먼저 수행됩니다.

이러한 검사는 EE 버전에만 존재하는 #validations_for_path에 나열된 검사 이후에 실행되며, #path_locks_validation#file_name_validation을 포함합니다. 즉, Path Locks에 대한 검사가 플로우에서 Code Owners 검사보다 먼저 수행됩니다.

EE에서의 검사 순서는 다음과 같습니다(LFS만 비EE 기능으로 존재):

  • Path Locks

  • 파일명

시크릿이 포함된 파일(예: id_rsa)을 차단합니다.

  • PushRule#file_name_regex와 일치하는 파일을 차단합니다.

  • LFS File Locks

  • Code Owners

관련 모델#

ProtectedBranch#

ProtectedBranch 모델은 app/models/protected_branch.rb에 정의되어 있으며 ee/app/models/concerns/ee/protected_branch.rb에서 확장됩니다. EE 버전에는 파일이 CODEOWNERS에 나열되어 있을 경우 보호된 브랜치에 직접 변경 사항이 푸시되는 것을 방지하는 require_code_owner_approval이라는 칼럼이 포함되어 있습니다.

ApprovalMergeRequestRule#

ApprovalMergeRequestRule 모델은 ee/app/models/approval_merge_request_rule.rb에 정의되어 있습니다. 이 모델은 머지 리퀘스트에 대한 승인 규칙을 저장합니다. code_owner 유형 규칙을 포함한 여러 규칙 유형을 사용합니다.

컨트롤러 및 서비스#

아래의 컨트롤러 및 서비스는 승인 규칙 기능이 작동하는 데 사용됩니다:

Api::Internal::Base#

/internal/allowed 엔드포인트는 GitLab에 푸시할 때 사용자가 푸시를 허용받았는지 확인하기 위해 호출됩니다. /internal/allowed 엔드포인트는 Gitlab::Checks::DiffCheck를 수행합니다. EE에서는 code owner 검사가 포함됩니다.

lib/api/internal/base.rb에 정의되어 있습니다.

Repositories::GitHttpController#

HTTP를 통해 GitLab에 변경 사항이 푸시될 때 컨트롤러는 사용자가 푸시를 허용받았는지 확인하기 위해 접근 검사를 수행합니다. 검사는 Gitlab::Checks::DiffCheck를 수행합니다. EE에서는 Code Owner 검사가 포함됩니다.

app/controllers/repositories/git_http_controller.rb에 정의되어 있습니다.

EE::Gitlab::Checks::DiffCheck#

이 모듈은 CE의 Gitlab::Checks::DiffChecks 클래스를 확장하고 code owner 검증을 추가합니다. Gitlab::Checks::Diffs::CodeOwnersCheck 클래스를 사용하여 사용자가 브랜치에 code owner 승인이 필요한 경우 CODEOWNER에 나열된 파일을 보호된 브랜치에 직접 푸시하지 않는지 검증합니다.

MergeRequests::SyncCodeOwnerApprovalRules#

이 서비스는 services/merge_requests/sync_code_owner_approval_rules.rb에 정의되어 있으며 다음 용도로 사용됩니다:

  • 머지 리퀘스트에 새로운 변경 사항이 푸시될 때 오래된 code owner 승인 규칙을 삭제합니다.

  • CODEOWNER 파일에도 나열된 머지 리퀘스트의 변경된 각 파일에 대해 code owner 승인 규칙을 생성합니다.

플로우#

다음 플로우차트는 다양한 기능에 대해 컨트롤러에서 모델로 이어지는 플로우를 설명하는 데 도움이 됩니다.

Code Owners 구현의 대부분은 클래스의 EE 변형에 존재합니다.

SSH를 통해 require_code_owner_approval이 활성화된 보호된 브랜치에 변경 사항 푸시#

%%{init: { "fontFamily": "GitLab Sans" }}%% graph TD Api::Internal::Base --> Gitlab::GitAccess Gitlab::GitAccess --> Gitlab::Checks::DiffCheck Gitlab::Checks::DiffCheck --> Gitlab::Checks::Diffs::CodeOwnersCheck Gitlab::Checks::Diffs::CodeOwnersCheck --> ProtectedBranch Gitlab::Checks::Diffs::CodeOwnersCheck --> Gitlab::CodeOwners::Loader Gitlab::CodeOwners::Loader --> Gitlab::CodeOwners::Entry

HTTPS를 통해 require_code_owner_approval이 활성화된 보호된 브랜치에 변경 사항 푸시#

%%{init: { "fontFamily": "GitLab Sans" }}%% graph TD Repositories::GitHttpController --> Gitlab::GlRepository Gitlab::GlRepository --> Gitlab::GitAccessProject Gitlab::GitAccessProject --> Gitlab::Checks::DiffCheck Gitlab::Checks::DiffCheck --> Gitlab::Checks::Diffs::CodeOwnersCheck Gitlab::Checks::Diffs::CodeOwnersCheck --> ProtectedBranch Gitlab::Checks::Diffs::CodeOwnersCheck --> Gitlab::CodeOwners::Loader Gitlab::CodeOwners::Loader --> Gitlab::CodeOwners::Entry

머지 리퀘스트 승인 규칙에 code owner 규칙 동기화#

%%{init: { "fontFamily": "GitLab Sans" }}%% graph TD EE::ProtectedBranches::CreateService --> MergeRequest::SyncCodeOwnerApprovalRules EE::MergeRequestRefreshService --> MergeRequest::SyncCodeOwnerApprovalRules EE::MergeRequests::ReloadMergeHeadDiffService --> MergeRequest::SyncCodeOwnerApprovalRules EE::MergeRequests::CreateService --> MergeRequests::SyncCodeOwnerApprovalRulesWorker EE::MergeRequests::UpdateService --> MergeRequests::SyncCodeOwnerApprovalRulesWorker MergeRequests::SyncCodeOwnerApprovalRulesWorker --> MergeRequest::SyncCodeOwnerApprovalRules MergeRequest::SyncCodeOwnerApprovalRules --> id1{delete outdated code owner rules} MergeRequest::SyncCodeOwnerApprovalRules --> id2{create rule for each code owner entry}

Code Owners 개발 가이드라인

GitLab v19.1
원문 보기
요약

이 문서는 기여자들이 Code Owners의 코드 설계를 이해할 수 있도록 작성되었습니다. 이 문서는 코드가 자주 변경될 수 있으므로 코드 설계 방식에 대한 개요로 의도적으로 제한되어 있습니다. 이 문서는 여기서 참조하는 코드베이스의 일부가 업데이트, 삭제되거나 새로운 부분이 추가될 때 함께 업데이트되어야 합니다.

이 문서는 기여자들이 Code Owners의 코드 설계를 이해할 수 있도록 작성되었습니다. 이 기능의 코드를 변경하기 전에 이 문서를 읽어보세요.

이 문서는 코드가 자주 변경될 수 있으므로 코드 설계 방식에 대한 개요로 의도적으로 제한되어 있습니다. 기능의 특정 부분이 어떻게 작동하는지 이해하려면 코드와 스펙을 직접 확인하세요. 여기에서 설명하는 내용은 Code Owners 기능의 주요 구성 요소가 어떻게 작동하는지를 설명합니다.

이 문서는 여기서 참조하는 코드베이스의 일부가 업데이트, 삭제되거나 새로운 부분이 추가될 때 함께 업데이트되어야 합니다.

비즈니스 로직#

Code Owners에 관한 모든 비즈니스 로직은 Gitlab::CodeOwners 네임스페이스에 위치합니다. Code Owners는 EE 전용 기능이므로 파일은 ./ee 디렉터리에만 존재합니다.

  • Gitlab::CodeOwners: code owner 규칙과 상호작용하는 데 사용되는 주요 모듈입니다.

./ee/lib/gitlab/code_owners.rb에 정의되어 있습니다.

  • Gitlab::CodeOwners::File: CODEOWNERS 파일을 래핑하고 클래스의 공개 메서드를 통해 데이터를 노출합니다.

./ee/lib/gitlab/code_owners/file.rb에 정의되어 있습니다.

  • Gitlab::CodeOwners::Section: CODEOWNERS 파일의 섹션 헤딩을 래핑하고 다양한 부분을 파싱합니다.

./ee/lib/gitlab/code_owners/section.rb에 정의되어 있습니다.

  • Gitlab::CodeOwners::Entry: CODEOWNERS 파일의 항목(패턴 및 owner 라인)을 래핑하고 클래스의 공개 메서드를 통해 데이터를 노출합니다.

./ee/lib/gitlab/code_owners/entry.rb에 정의되어 있습니다.

  • Gitlab::CodeOwners::Loader: 올바른 CODEOWNER 파일을 찾아 Gitlab::CodeOwners::File 인스턴스로 콘텐츠를 로드합니다.

./ee/lib/gitlab/code_owners/loader.rb에 정의되어 있습니다.

  • Gitlab::CodeOwners::ReferenceExtractor: 텍스트에서 CODEOWNER 사용자, 그룹 및 이메일 참조를 추출합니다.

./ee/lib/gitlab/code_owners/reference_extractor.rb에 정의되어 있습니다.

  • Gitlab::CodeOwners::UsersLoader: 올바른 CODEOWNER 파일을 찾아 Gitlab::CodeOwners::File 인스턴스로 콘텐츠를 로드합니다.

./ee/lib/gitlab/code_owners/users_loader.rb에 정의되어 있습니다.

  • Gitlab::CodeOwners::GroupsLoader: 올바른 CODEOWNER 파일을 찾아 Gitlab::CodeOwners::File 인스턴스로 콘텐츠를 로드합니다.

./ee/lib/gitlab/code_owners/groups_loader.rb에 정의되어 있습니다.

  • Gitlab::Checks::Diffs::CodeOwnersCheck: require_code_owner_approval이 활성화된 보호된 브랜치에 사용자가 푸시할 때 CODEOWNERS 항목의 파일이 변경되지 않았는지 검증합니다.

./ee/lib/gitlab/checks/diffs/code_owners_check.rb에 정의되어 있습니다.

Code Owners의 Git 접근 검사 실행 순서#

Gitlab::Checks::DiffCheck#file_paths_validations는 빈 배열을 반환하거나, LFS가 활성화되어 있고 파일 잠금이 존재하는 경우 #lfs_file_locks_validation 결과의 단일 멤버가 있는 배열을 반환합니다. 이 파일의 EE 버전에서 #validate_code_owners의 반환 결과는 EE::Gitlab::Checks::DiffCheck#file_paths_validations에서 이 목록의 끝에 삽입됩니다. LFS 검사는 Code Owners 검사보다 먼저 수행됩니다.

이러한 검사는 EE 버전에만 존재하는 #validations_for_path에 나열된 검사 이후에 실행되며, #path_locks_validation#file_name_validation을 포함합니다. 즉, Path Locks에 대한 검사가 플로우에서 Code Owners 검사보다 먼저 수행됩니다.

EE에서의 검사 순서는 다음과 같습니다(LFS만 비EE 기능으로 존재):

  • Path Locks

  • 파일명

시크릿이 포함된 파일(예: id_rsa)을 차단합니다.

  • PushRule#file_name_regex와 일치하는 파일을 차단합니다.

  • LFS File Locks

  • Code Owners

관련 모델#

ProtectedBranch#

ProtectedBranch 모델은 app/models/protected_branch.rb에 정의되어 있으며 ee/app/models/concerns/ee/protected_branch.rb에서 확장됩니다. EE 버전에는 파일이 CODEOWNERS에 나열되어 있을 경우 보호된 브랜치에 직접 변경 사항이 푸시되는 것을 방지하는 require_code_owner_approval이라는 칼럼이 포함되어 있습니다.

ApprovalMergeRequestRule#

ApprovalMergeRequestRule 모델은 ee/app/models/approval_merge_request_rule.rb에 정의되어 있습니다. 이 모델은 머지 리퀘스트에 대한 승인 규칙을 저장합니다. code_owner 유형 규칙을 포함한 여러 규칙 유형을 사용합니다.

컨트롤러 및 서비스#

아래의 컨트롤러 및 서비스는 승인 규칙 기능이 작동하는 데 사용됩니다:

Api::Internal::Base#

/internal/allowed 엔드포인트는 GitLab에 푸시할 때 사용자가 푸시를 허용받았는지 확인하기 위해 호출됩니다. /internal/allowed 엔드포인트는 Gitlab::Checks::DiffCheck를 수행합니다. EE에서는 code owner 검사가 포함됩니다.

lib/api/internal/base.rb에 정의되어 있습니다.

Repositories::GitHttpController#

HTTP를 통해 GitLab에 변경 사항이 푸시될 때 컨트롤러는 사용자가 푸시를 허용받았는지 확인하기 위해 접근 검사를 수행합니다. 검사는 Gitlab::Checks::DiffCheck를 수행합니다. EE에서는 Code Owner 검사가 포함됩니다.

app/controllers/repositories/git_http_controller.rb에 정의되어 있습니다.

EE::Gitlab::Checks::DiffCheck#

이 모듈은 CE의 Gitlab::Checks::DiffChecks 클래스를 확장하고 code owner 검증을 추가합니다. Gitlab::Checks::Diffs::CodeOwnersCheck 클래스를 사용하여 사용자가 브랜치에 code owner 승인이 필요한 경우 CODEOWNER에 나열된 파일을 보호된 브랜치에 직접 푸시하지 않는지 검증합니다.

MergeRequests::SyncCodeOwnerApprovalRules#

이 서비스는 services/merge_requests/sync_code_owner_approval_rules.rb에 정의되어 있으며 다음 용도로 사용됩니다:

  • 머지 리퀘스트에 새로운 변경 사항이 푸시될 때 오래된 code owner 승인 규칙을 삭제합니다.

  • CODEOWNER 파일에도 나열된 머지 리퀘스트의 변경된 각 파일에 대해 code owner 승인 규칙을 생성합니다.

플로우#

다음 플로우차트는 다양한 기능에 대해 컨트롤러에서 모델로 이어지는 플로우를 설명하는 데 도움이 됩니다.

Code Owners 구현의 대부분은 클래스의 EE 변형에 존재합니다.

SSH를 통해 require_code_owner_approval이 활성화된 보호된 브랜치에 변경 사항 푸시#

%%{init: { "fontFamily": "GitLab Sans" }}%% graph TD Api::Internal::Base --> Gitlab::GitAccess Gitlab::GitAccess --> Gitlab::Checks::DiffCheck Gitlab::Checks::DiffCheck --> Gitlab::Checks::Diffs::CodeOwnersCheck Gitlab::Checks::Diffs::CodeOwnersCheck --> ProtectedBranch Gitlab::Checks::Diffs::CodeOwnersCheck --> Gitlab::CodeOwners::Loader Gitlab::CodeOwners::Loader --> Gitlab::CodeOwners::Entry

HTTPS를 통해 require_code_owner_approval이 활성화된 보호된 브랜치에 변경 사항 푸시#

%%{init: { "fontFamily": "GitLab Sans" }}%% graph TD Repositories::GitHttpController --> Gitlab::GlRepository Gitlab::GlRepository --> Gitlab::GitAccessProject Gitlab::GitAccessProject --> Gitlab::Checks::DiffCheck Gitlab::Checks::DiffCheck --> Gitlab::Checks::Diffs::CodeOwnersCheck Gitlab::Checks::Diffs::CodeOwnersCheck --> ProtectedBranch Gitlab::Checks::Diffs::CodeOwnersCheck --> Gitlab::CodeOwners::Loader Gitlab::CodeOwners::Loader --> Gitlab::CodeOwners::Entry

머지 리퀘스트 승인 규칙에 code owner 규칙 동기화#

%%{init: { "fontFamily": "GitLab Sans" }}%% graph TD EE::ProtectedBranches::CreateService --> MergeRequest::SyncCodeOwnerApprovalRules EE::MergeRequestRefreshService --> MergeRequest::SyncCodeOwnerApprovalRules EE::MergeRequests::ReloadMergeHeadDiffService --> MergeRequest::SyncCodeOwnerApprovalRules EE::MergeRequests::CreateService --> MergeRequests::SyncCodeOwnerApprovalRulesWorker EE::MergeRequests::UpdateService --> MergeRequests::SyncCodeOwnerApprovalRulesWorker MergeRequests::SyncCodeOwnerApprovalRulesWorker --> MergeRequest::SyncCodeOwnerApprovalRules MergeRequest::SyncCodeOwnerApprovalRules --> id1{delete outdated code owner rules} MergeRequest::SyncCodeOwnerApprovalRules --> id2{create rule for each code owner entry}