Code Owners 개발 지침

이 문서는 Code Owners의 코드 디자인을 이해하는 데 도움을 주기 위해 작성되었습니다.이 기능의 코드를 변경하기 전에 이 문서를 꼭 읽어보세요.

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

참고: 이 문서는 이 문서에서 참조된 코드베이스의 부분이 업데이트되거나 제거되거나 새로운 부분이 추가될 때 업데이트되어야 합니다.

비즈니스 로직

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

  • Gitlab::CodeOwners: 코드 소유자 규칙과 상호 작용하는 데 사용되는 주요 모듈입니다.
    • ./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 파일에서 항목(패턴 및 소유자 라인)을 래핑하고 클래스의 공개 메서드를 통해 데이터를 노출합니다.
    • ./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::CodeOwners::Validator: 사용자가 require_code_owner_approval를 활성화한 보호된 브랜치로 푸시할 때 CODEOWNERS 항목의 파일이 변경되지 않았는지를 유효성 검사합니다.
    • ./ee/lib/gitlab/code_owners/validator.rb에 정의됨.

Code Owners의 Git 액세스 확인 실행 순서

Gitlab::Checks::DiffCheck#file_paths_validations은 LFS가 활성화되어 있고 파일 잠금이 있는 경우에는 빈 배열이나 결과의 단일 멤버가 포함된 배열을 반환합니다. 이 파일의 EE 버전에서 #validate_code_owners의 반환 결과는 이 목록의 끝에 삽입됩니다. LFS 확인은 Code Owners 확인 이전에 수행됩니다.

이러한 확인은 #validations_for_path에 나열된 확인 이후에 실행되며, 이는 EE 버전에만 존재하며 #path_locks_validation#file_name_validation을 포함합니다. 이는 경로 잠금의 확인이 코드 소유자의 확인 이전에 발생한다는 것을 의미합니다.

EE의 확인 순서는 다음과 같습니다(비 EE 기능으로는 LFS만 존재함):

  • 경로 잠금
  • 파일 이름
    • 예를 들어 id_rsa와 같은 비밀을 포함하는 파일 차단
    • PushRule#file_name_regex와 일치하는 파일 차단
  • LFS 파일 잠금
  • 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에서는 코드 소유자 확인이 포함됩니다.

lib/api/internal/base.rb에서 정의됨.

Repositories::GitHttpController

변경 사항이 HTTP를 통해 GitLab에 푸시되면 컨트롤러는 액세스 확인을 수행하여 사용자가 푸시할 수 있는지 확인합니다. 이 확인은 Gitlab::Checks::DiffCheck를 수행합니다. EE에서 코드 소유자 확인이 포함됩니다.

app/controllers/repositories/git_http_controller.rb에서 정의됨.

EE::Gitlab::Checks::DiffCheck

이 모듈은 CE Gitlab::Checks::DiffChecks 클래스를 확장하고 코드 소유자 유효성을 추가합니다. 이는 Gitlab::CodeOwner::Validator 클래스를 사용하여 사용자가 CODEOWNER에 나열된 파일을 직접 보호된 브랜치로 푸시하지 않으면서 브랜치가 코드 소유자 승인을 필요로 할 때입니다.

MergeRequests::SyncCodeOwnerApprovalRules

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

  • 변경 사항이 병합 요청에 새로 푸시될 때 오래된 코드 소유자 승인 규칙을 삭제합니다.
  • 코드 소유자 파일에 나열된 각 변경된 파일에 대해 병합 요청에 코드 소유자 승인 규칙을 생성합니다.

플로우

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

코드 소유자 구현의 많은 사례가 클래스의 EE 변형에 존재함을 유의하십시오.

SSH를 통해 보호된 브랜치에 require_code_owner_approval가 활성화된 상태로 변경 사항을 푸시

graph TD Api::Internal::Base --> Gitlab::GitAccess Gitlab::GitAccess --> Gitlab::Checks::DiffCheck Gitlab::Checks::DiffCheck --> Gitlab::CodeOwners::Validator Gitlab::CodeOwners::Validator --> ProtectedBranch Gitlab::CodeOwners::Validator --> Gitlab::CodeOwners::Loader Gitlab::CodeOwners::Loader --> Gitlab::CodeOwners::Entry

HTTPS를 통해 보호된 브랜치에 require_code_owner_approval가 활성화된 상태로 변경 사항을 푸시

graph TD Repositories::GitHttpController --> Gitlab::GlRepository Gitlab::GlRepository --> Gitlab::GitAccessProject Gitlab::GitAccessProject --> Gitlab::Checks::DiffCheck Gitlab::Checks::DiffCheck --> Gitlab::CodeOwners::Validator Gitlab::CodeOwners::Validator --> ProtectedBranch Gitlab::CodeOwners::Validator --> Gitlab::CodeOwners::Loader Gitlab::CodeOwners::Loader --> Gitlab::CodeOwners::Entry

코드 소유자 규칙을 병합 요청 승인 규칙에 동기화

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{오래된 코드 소유자 규칙 삭제} MergeRequest::SyncCodeOwnerApprovalRules --> id2{각 코드 소유자 항목에 대한 규칙 생성}