Code Owners 개발 지침

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

이 문서는 코드가 자주 변경될 수 있기 때문에 코드가 어떻게 작동하는지 이해하기 위해 특정 부분을 보려면 코드와 스펙을 확인해야 합니다. 여기에 있는 세부 정보는 Code Owners 기능의 주요 컴포넌트가 어떻게 작동하는지를 설명합니다.

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

비즈니스 로직

코드 소유자의 모든 비즈니스 로직은 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가 활성화되어 있고 파일 잠금이 있는 경우에는 #lfs_file_locks_validation 결과의 단일 멤버가 있는 배열을 반환합니다. EE 버전의 경우 이 파일에서의 #validate_code_owners의 반환 결과는 EE::Gitlab::Checks::DiffCheck#file_paths_validations의 리스트 끝에 삽입됩니다. 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 버전에는 require_code_owner_approval이라는 열이 포함되어 있어 보호된 브랜치로 직접 변경을 푸시하는 것을 방지합니다. 파일이 CODEOWNERS에 나열되어 있는 경우에만 변경을 방지합니다.

ApprovalMergeRequestRule

ApprovalMergeRequestRule 모델은 ee/app/models/approval_merge_request_rule.rb에 정의되어 있습니다. 해당 모델은 Merge Request의 승인 규칙을 저장합니다. 우리는 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에서는 Code Owner 확인이 포함됩니다.

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

EE::Gitlab::Checks::DiffCheck

이 모듈은 CE의 Gitlab::Checks::DiffChecks 클래스를 확장하고 코드 소유자 유효성 검사를 추가합니다. 보호된 브랜치로 사용자가 CODEOWNER에 나열된 파일을 직접 푸시하는 것을 확인하기 위해 Gitlab::CodeOwner::Validator 클래스를 사용합니다.

MergeRequests::SyncCodeOwnerApprovalRules

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

  • 변경 사항이 Merge Request에 푸시될 때 구식 코드 소유자 승인 규칙을 삭제합니다.
  • CODEOWNER 파일에 나열된 Merge Request의 각 변경된 파일에 대한 코드 소유자 승인 규칙을 생성합니다.

플로우

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

다음 클래스의 EE 변형에 대부분의 Code Owners 구현이 존재하는 점을 주의하세요.

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

Api::Internal::Base
Gitlab::GitAccess
Gitlab::Checks::DiffCheck
Gitlab::CodeOwners::Validator
ProtectedBranch
Gitlab::CodeOwners::Loader
Gitlab::CodeOwners::Entry

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

Repositories::GitHttpController
Gitlab::GlRepository
Gitlab::GitAccessProject
Gitlab::Checks::DiffCheck
Gitlab::CodeOwners::Validator
ProtectedBranch
Gitlab::CodeOwners::Loader
Gitlab::CodeOwners::Entry

코드 소유자 규칙을 Merge Request 승인 규칙으로 동기화

EE::ProtectedBranches::CreateService
MergeRequest::SyncCodeOwnerApprovalRules
EE::MergeRequestRefreshService
EE::MergeRequests::ReloadMergeHeadDiffService
EE::MergeRequests::CreateService
MergeRequests::SyncCodeOwnerApprovalRulesWorker
EE::MergeRequests::UpdateService
delete outdated code owner rules
create rule for each code owner entry