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가 활성화되어 있고 파일 잠금이 있는 경우에는 #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 구현이 존재하는 점을 주의하세요.