코드 소유자 개발 지침

이 문서는 기여자들이 코드 소유자의 코드 설계를 이해하는 데 도움을 주기 위해 작성되었습니다. 이 기능의 코드에 변경을 가하기 전에 이 문서를 읽어야 합니다.

이 문서는 코드가 자주 변경될 수 있기 때문에 코드 설계에 대한 개요로 의도적으로 한정되어 있습니다. 기능의 특정 부분이 어떻게 작동하는지 이해하려면 코드와 사양을 확인하세요. 여기의 세부정보는 코드 소유자 기능의 주요 구성 요소가 어떻게 작동하는지 설명합니다.

note
이 문서에 언급된 코드베이스의 부분이 업데이트되거나 삭제되거나 새로운 부분이 추가되면 이 문서를 업데이트해야 합니다.

비즈니스 로직

코드 소유자에 대한 모든 비즈니스 로직은 Gitlab::CodeOwners 네임스페이스에 위치해 있습니다. 코드 소유자는 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에 정의되어 있습니다.

코드 소유자가 Git 액세스 확인 실행 순서에 위치하는 곳

Gitlab::Checks::DiffCheck#file_paths_validations는 비어 있는 배열 또는 LFS가 활성화되고 파일 잠금이 있는 경우 #lfs_file_locks_validation의 단일 멤버가 포함된 배열을 반환합니다. 이 파일의 EE 버전에서 #validate_code_owners의 반환 결과는 EE::Gitlab::Checks::DiffCheck#file_paths_validations의 마지막에 삽입됩니다. LFS 체크는 코드 소유자 체크 이전에 수행됩니다.

이 체크는 #validations_for_path에 나열된 체크 이후에 실행되며, 이는 EE 버전에서만 존재하며 #path_locks_validation#file_name_validation을 포함합니다. 이는 경로 잠금 체크가 흐름에서 코드 소유자 체크보다 먼저 실행됨을 의미합니다.

체크 순서는 다음과 같습니다 (LFS만 비-EE 기능으로 존재):

  • 경로 잠금
  • 파일 이름
    • 예를 들어 비밀을 포함하는 파일 id_rsa 차단
    • PushRule#file_name_regex와 일치하는 파일 차단
  • LFS 파일 잠금
  • 코드 소유자

관련 모델

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에 정의되어 있으며 다음 용도로 사용됩니다:

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

흐름

이 플로우차트는 다양한 기능에 대해 컨트롤러에서 모델로의 흐름을 설명하는 데 도움이 될 것입니다.

코드 소유자 구현의 많은 부분은 클래스의 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::CodeOwners::Validator Gitlab::CodeOwners::Validator --> ProtectedBranch Gitlab::CodeOwners::Validator --> 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::CodeOwners::Validator Gitlab::CodeOwners::Validator --> ProtectedBranch Gitlab::CodeOwners::Validator --> Gitlab::CodeOwners::Loader Gitlab::CodeOwners::Loader --> Gitlab::CodeOwners::Entry

머지 요청 승인 규칙으로 코드 소유자 규칙 동기화

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