코드 소유자 개발 지침
- GitLab 15.10에서 소개됨.
이 문서는 기여자들이 코드 소유자의 코드 설계를 이해하는 데 도움을 주기 위해 작성되었습니다. 이 기능의 코드에 변경을 가하기 전에 이 문서를 읽어야 합니다.
이 문서는 코드가 자주 변경될 수 있기 때문에 코드 설계에 대한 개요로 의도적으로 한정되어 있습니다. 기능의 특정 부분이 어떻게 작동하는지 이해하려면 코드와 사양을 확인하세요. 여기의 세부정보는 코드 소유자 기능의 주요 구성 요소가 어떻게 작동하는지 설명합니다.
비즈니스 로직
코드 소유자에 대한 모든 비즈니스 로직은 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
변형에 존재합니다.