푸시 규칙 개발 지침

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

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

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

비즈니스 로직

비즈니스 로직은 두 개의 주요 위치에 포함되어 있습니다. 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::PushRules::FileSizeCheck: 파일 크기 규칙과 관련된 푸시 규칙 검사를 실행합니다.
    • ee/lib/ee/gitlab/checks/push_rules/file_size_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: 이 /internal/allowed 엔드포인트는 SSH를 통해 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에 정의됨.

흐름

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

Git SSH를 통한 푸시

%%{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 EE::Gitlab::Checks::PushRuleCheck --> EE::Gitlab::Checks::PushRules::FileSizeCheck

참고:

PushRuleCheckparallel_push_checks 기능 플래그가 활성화된 경우에만 체크를 병렬로 트리거합니다.

그렇지 않으면 태그 또는 브랜치 체크가 먼저 실행되고 그 다음 파일 크기가 확인됩니다.