푸시 규칙 개발 가이드라인
GitLab v19.1이 문서는 컨트리뷰터가 푸시 규칙의 코드 설계를 이해할 수 있도록 작성되었습니다. 이 문서는 코드가 자주 변경될 수 있으므로 코드 설계의 개요만 다루는 것을 원칙으로 합니다. 이 문서는 참조하는 코드베이스 부분이 업데이트·제거되거나 새로운 부분이 추가될 때 함께 업데이트되어야 합니다.
이 문서는 컨트리뷰터가 푸시 규칙의 코드 설계를 이해할 수 있도록 작성되었습니다. 이 기능의 코드를 수정하기 전에 이 문서를 먼저 읽어보세요.
이 문서는 코드가 자주 변경될 수 있으므로 코드 설계의 개요만 다루는 것을 원칙으로 합니다. 기능의 특정 부분이 어떻게 동작하는지 이해하려면 코드와 스펙을 직접 확인하세요. 여기에서는 푸시 규칙 기능의 주요 구성 요소가 어떻게 동작하는지 설명합니다.
이 문서는 참조하는 코드베이스 부분이 업데이트·제거되거나 새로운 부분이 추가될 때 함께 업데이트되어야 합니다.
비즈니스 로직#
비즈니스 로직은 두 곳에 주로 담겨 있습니다. PushRule 모델은 규칙에 대한 설정을 저장하며, 해당 설정을 사용하여 푸시 동작을 변경하는 검사 로직이 별도로 존재합니다.
-
PushRule: 각 푸시 규칙의 구성을 저장하는 데 사용되는 주요 모델입니다.ee/app/models/push_rule.rb에 정의되어 있습니다. -
EE::Gitlab::Checks::DiffCheck: Diff 검사는 푸시 규칙의file_name_regex에 일치하는 파일 이름과,id_rsa와 같이 알려진 시크릿 파일 이름에 해당하는 파일의 푸시를 차단합니다.ee/lib/ee/gitlab/checks/diff_check.rb에 정의되어 있습니다. -
EE::Gitlab::Checks::PushRuleCheck: 다양한 푸시 규칙 검사를 실행합니다.ee/lib/ee/gitlab/checks/push_rule_check.rb에 정의되어 있습니다. -
EE::Gitlab::Checks::PushRules::BranchCheck: 브랜치 규칙과 관련된 푸시 규칙 검사를 실행합니다.ee/lib/ee/gitlab/checks/push_rules/branch_check.rb에 정의되어 있습니다. -
EE::Gitlab::Checks::PushRules::CommitCheck: 커밋 규칙과 관련된 푸시 규칙 검사를 실행합니다.ee/lib/ee/gitlab/checks/push_rules/commit_check.rb에 정의되어 있습니다. -
EE::Gitlab::Checks::FileSizeLimtCheck: 파일 크기 규칙과 관련된 푸시 규칙 검사를 실행합니다.ee/lib/ee/gitlab/checks/file_size_limit_check.rb에 정의되어 있습니다. -
EE::Gitlab::Checks::PushRules::TagCheck: 태그 규칙과 관련된 푸시 규칙 검사를 실행합니다.ee/lib/ee/gitlab/checks/push_rules/tag_check.rb에 정의되어 있습니다.
엔트리포인트#
다음 컨트롤러와 API는 모두 푸시 규칙 로직으로 진입하는 엔트리포인트입니다:
-
Admin::PushRulesController: 전역 푸시 규칙을 관리하는 데 사용되는 컨트롤러입니다. -
Group::PushRulesController: 그룹 수준 푸시 규칙을 관리하는 데 사용되는 컨트롤러입니다. -
Project::PushRulesController: 프로젝트 수준 푸시 규칙을 관리하는 데 사용되는 컨트롤러입니다. -
Api::Internal::Base: SSH를 통해 GitLab에 푸시할 때 사용자의 푸시 허용 여부를 확인하기 위해/internal/allowed엔드포인트가 호출됩니다./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에 정의되어 있습니다.
흐름#
다음 순서도는 각 기능에서 컨트롤러부터 모델까지 이어지는 흐름을 설명하는 데 도움이 됩니다.
SSH를 통한 Git 푸시#
%%{init: { "fontFamily": "GitLab Sans" }}%% graph TD Repositories::GitHttpController --> Gitlab::GitAccess Api::Internal::Base --> Gitlab::GitAccess Gitlab::GitAccess --> Gitlab::Checks::ChangesAccess Gitlab::Checks::ChangesAccess --> Gitlab::Checks::SingleChangeAccess Gitlab::Checks::ChangesAccess --> EE::Gitlab::Checks::PushRuleCheck Gitlab::Checks::SingleChangeAccess --> Gitlab::Checks::DiffCheck EE::Gitlab::Checks::PushRuleCheck -->|태그에 푸시하는 경우에만| EE::Gitlab::Checks::PushRules::TagCheck EE::Gitlab::Checks::PushRuleCheck -->|브랜치에 푸시하는 경우에만| EE::Gitlab::Checks::PushRules::BranchCheck Gitlab::Checks::ChangesAccess --> EE::Gitlab::Checks::FileSizeLimitCheck