승인 규칙 개발 지침

이 문서는 Merge Request 승인 규칙에 관련된 모든 기능의 백엔드 디자인과 흐름을 설명합니다.

이는 기여자들이 코드 디자인을 이해하기 쉽게 하고, 기능과 구현이 발전함에 따라 개선할 부분이 있는지 확인하는 데 도움이 될 것으로 기대합니다.

구현 세부 정보가 너무 많지 않도록 의도되어 있으며, 자주 변경될 수 있는 만큼 구현되지 않았습니다. 코드가 그러한 것들을 더 잘 설명해야 합니다. 여기에 언급된 컴포넌트는 승인 규칙 기능이 작동하기 위한 응용 프로그램의 주요 부분입니다.

note
이 문서는 변경되거나 제거되는 코드베이스의 일부가 변경되거나 제거되거나 새로운 컴포넌트가 추가될 때 적절하게 업데이트되어야 하는 동적인 문서입니다.

데이터 모델

erDiagram Project ||--o{ MergeRequest: " " Project ||--o{ ApprovalProjectRule: " " ApprovalProjectRule }o--o{ User: " " ApprovalProjectRule }o--o{ Group: " " ApprovalProjectRule }o--o{ ProtectedBranch: " " MergeRequest ||--|| ApprovalState: " " ApprovalState ||--o{ ApprovalWrappedRule: " " MergeRequest ||--o{ Approval: " " MergeRequest ||--o{ ApprovalMergeRequestRule: " " ApprovalMergeRequestRule }o--o{ User: " " ApprovalMergeRequestRule }o--o{ Group: " " ApprovalMergeRequestRule ||--o| ApprovalProjectRule: " "

ProjectMergeRequest

ProjectMergeRequest 모델은 ee/app/models/ee/project.rbee/app/models/ee/merge_request.rb에 정의되어 있습니다. 이 모델들은 승인 규칙이 EE 전용 기능이기 때문에 EE 버전을 확장합니다. 여기에는 Merge Request 승인과 관련된 연결 및 기타 관련된 내용이 정의되어 있습니다.

ApprovalState

erDiagram MergeRequest ||--|| ApprovalState: " "

ApprovalState 클래스는 ee/app/models/approval_state.rb에 정의되어 있습니다. 이 클래스는 실제 ActiveRecord 모델은 아닙니다. 이 클래스는 특정 Merge Request의 승인 상태와 관련된 모든 논리를 캡슐화합니다.

  • 대상 브랜치를 기반으로 Merge Request에 적용되는 승인 규칙 알기
  • 특정 대상 브랜치에 적용되는 승인 규칙 알기
  • 모든 규칙이 승인되었는지 확인하기
  • 승인이 필요한지 확인하기
  • 몇 개의 승인이 승인되었는지 또는 아직 필요한지 알기

이는 프로젝트(ApprovalProjectRule) 또는 Merge Request(ApprovalMergeRequestRule)에서 승인 규칙 데이터를 가져와 ApprovalWrappedRule로 래핑합니다.

ApprovalProjectRule

erDiagram Project ||--o{ ApprovalProjectRule: " " ApprovalProjectRule }o--o{ User: " " ApprovalProjectRule }o--o{ Group: " " ApprovalProjectRule }o--o{ ProtectedBranch: " "

ApprovalProjectRule 모델은 ee/app/models/approval_project_rule.rb에 정의되어 있습니다.

프로젝트 설정 또는 프로젝트 수준 승인 API를 통해 승인 규칙이 추가/편집/제거될 때 레코드가 생성/업데이트/삭제됩니다. ApprovalState 모델은 이러한 레코드를 승인 규칙이 덮어쓰이지 않을 때 가져옵니다.

protected_branches 속성은 규칙이 보호된 브랜치에 적용될 때 설정되고 사용됩니다. 이 기능에 대한 자세한 정보는 보호된 브랜치용 승인을 참조하세요.

ApprovalMergeRequestRule

erDiagram MergeRequest ||--o{ ApprovalMergeRequestRule: " " ApprovalMergeRequestRule }o--o{ User: " " ApprovalMergeRequestRule }o--o{ Group: " " ApprovalMergeRequestRule ||--o| ApprovalProjectRule: " "

ApprovalMergeRequestRule 모델은 ee/app/models/approval_merge_request_rule.rb에 정의되어 있습니다.

Merge Request 작성/편집 양식 또는 Merge Request 수준 승인 API을 통해 규칙이 추가/편집/제거될 때 레코드가 생성/업데이트/삭제됩니다.

approval_project_rule은 기존의 ApprovalProjectRule에서 기반을 둘 때 설정됩니다.

ApprovalMergeRequestRuleapproval_project_rule에서 상속받으므로 protected_branches가 없습니다.

ApprovalWrappedRule

erDiagram ApprovalState ||--o{ ApprovalWrappedRule: " "

ApprovalWrappedRuleee/app/modes/approval_wrapped_rule.rb에 정의되어 있으며 ActiveRecord 모델은 아닙니다. 이 클래스는 ApprovalProjectRule 또는 ApprovalMergeRequestRule을 일반적인 인터페이스로 래핑하는 데 사용됩니다.

  • ApprovalWrappedAnyApprovalRule - any_approver 규칙을 래핑하는 데 사용됩니다.
  • ApprovalWrappedCodeOwnerRule - code_owner 규칙을 래핑하는 데 사용됩니다.

이 클래스는 대부분의 책임을 래핑한 승인 규칙으로 위임하지만 다음과 같은 책임도 집니다:

  • 승인 규칙이 승인되었는지 확인하기
  • 승인 규칙에게 주어진 승인이나 여전히 필요한 승인 양을 알기

이는 승인 규칙 및 Merge Request의 Approval 레코드에서 이 정보를 가져옵니다.

Approval

erDiagram MergeRequest ||--o{ Approval: " "

Approval 모델은 ee/app/models/approval.rb에 정의되어 있습니다. 이 모델은 Merge Request에 대한 승인에 대한 정보를 저장합니다.

좋은 승인/폐지가 있을 때마다 레코드가 생성/삭제됩니다.

컨트롤러와 서비스

승인 규칙 기능에 사용되는 다음 컨트롤러와 서비스입니다.

API::ProjectApprovalSettings

이 비공개 API는 ee/lib/api/project_approval_settings.rb에 정의되어 있습니다.

다음에 사용됩니다:

  • 프로젝트 설정의 승인 규칙 나열
  • 프로젝트 설정에서 규칙 생성/업데이트/삭제
  • Merge Request 양식에서 승인 규칙 나열

Projects::MergeRequests::CreationsController

이 컨트롤러는 app/controllers/projects/merge_requests/creations_controller.rb에 정의되어 있습니다.

이 컨트롤러의 create 액션은 Merge Request 양식이 제출될 때 사용됩니다. approval_rules_attributes 매개변수를 허용하여 ApprovalMergeRequestRule 레코드를 생성/업데이트/삭제합니다. 이 매개변수를 통해 MergeRequests::CreateService를 실행할 때 전달됩니다.

Projects::MergeRequestsController

이 컨트롤러는 app/controllers/projects/merge_requests_controller.rb에 정의되어 있습니다.

이 컨트롤러의 update 액션은 편집된 Merge Request 양식이 제출될 때 사용됩니다. Projects::MergeRequests::CreationsController와 유사하지만 MergeRequests::UpdateService를 실행합니다.

API::MergeRequestApprovals

이 API는 ee/lib/api/merge_request_approvals.rb에 정의되어 있습니다.

승인 API 엔드포인트는 Merge Request 페이지가 로드될 때 요청됩니다.

/projects/:id/merge_requests/:merge_request_iid/approval_settings는 다음과 같이 사용되는 프라이빗 API 엔드포인트입니다:

  • 편집된 Merge Request 양식에서 승인 규칙 나열.
  • Merge Request 페이지에서 승인 규칙 나열.

UI 및 API를 통해 MR을 승인/비승인할 때는 Merge Request 승인 API 엔드포인트 또는 Merge Request 승인 취소 API 엔드포인트가 요청됩니다. 이는 MergeRequests::ApprovalServiceMergeRequests::RemoveApprovalService를 실행합니다.

API::ProjectApprovalRulesAPI::MergeRequestApprovalRules

이 API는 ee/lib/api/project_approval_rules.rbee/lib/api/merge_request_approval_rules.rb에 정의되어 있습니다.

Merge request approvals API를 통해 프로젝트 및 Merge Request 수준의 규칙을 나열/생성/업데이트/삭제하는 데 사용됩니다.

ApprovalRules::CreateService, ApprovalRules::UpdateService, ApprovalRules::ProjectRuleDestroyService, 및 ApprovalRules::MergeRequestRuleDestroyService를 실행합니다.

ApprovalRules::ParamsFilteringService

이 서비스는 ee/app/services/approval_rules/params_filtering_service.rb에 정의되어 있습니다.

이는 MergeRequests::CreateServiceMergeRequests::UpdateService가 실행될 때만 호출됩니다.

다음 작업을 수행합니다:

  • 사용자가 승인 규칙을 업데이트할 수 없는 경우 제거합니다.
  • 사용자 ID를 프로젝트 멤버 여부에 따라 필터링합니다.
  • 사용자가 볼 수 있는 그룹 ID를 필터링합니다.
  • any_approver 규칙 식별.
  • 지정된 경우 숨겨진 그룹을 추가합니다.
  • 대상 브랜치에 적용되지 않는 (Merge Request 대상 브랜치에 적용되지 않는 규칙) 사용자 정의 불가능한 승인 규칙을 추가합니다.

ApprovalRules::CreateService

이 서비스는 ee/app/services/approval_rules/create_service.rb에 정의되어 있습니다.

Merge Request 또는 프로젝트 수준에서 승인 규칙을 생성하는 책임이 있습니다.

다음 상황에서 호출됩니다:

  • UI를 통해 프로젝트 수준에서 승인 규칙을 생성할 때.
  • API::ProjectApprovalRules /projects/:id/approval_rules 엔드포인트를 통해 프로젝트 수준에서 승인 규칙을 생성할 때.
  • API::MergeRequestApprovalRules /projects/:id/merge_requests/:merge_request_iid/approval_rules 엔드포인트를 통해 Merge Request 수준의 규칙을 생성할 때.

UI를 통해 생성된 Merge Request 수준의 규칙은 이 서비스를 사용하지 않습니다. Projects::MergeRequests::CreationsController를 참조하세요.

Flow

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

일부 CRUD API 엔드포인트는 간단하므로 일부러 건너뛰었습니다.

웹 UI를 통해 승인 규칙이 포함된 Merge Request 생성

graph LR Projects::MergeRequests::CreationsController --> MergeRequests::CreateService MergeRequests::CreateService --> ApprovalRules::ParamsFilteringService ApprovalRules::ParamsFilteringService --> MergeRequests::CreateService MergeRequests::CreateService --> MergeRequest MergeRequest --> db[(Database)] MergeRequest --> User MergeRequest --> Group MergeRequest --> ApprovalProjectRule User --> db[(Database)] Group --> db[(Database)] ApprovalProjectRule --> db[(Database)]

업데이트하는 경우도 동일한 플로우를 따르지만 Projects::MergeRequestsController에서 시작하여 MergeRequests::UpdateService를 실행합니다.

MR 페이지에서 Merge Request 승인 규칙 보기

graph LR API::MergeRequestApprovals --> MergeRequest MergeRequest --> ApprovalState ApprovalState --> id1{approval rules are overridden} id1{approval rules are overridden} --> |No | ApprovalProjectRule & ApprovalMergeRequestRule id1{approval rules are overridden} --> |Yes| ApprovalMergeRequestRule ApprovalState --> ApprovalWrappedRule ApprovalWrappedRule --> Approval

이 플로우는 프론트엔드 컴포넌트에서 시작됩니다. 반환된 데이터는 MR 위젯에 정보를 표시하는 데 사용됩니다.

Merge Request 승인

graph LR API::MergeRequestApprovals --> MergeRequests::ApprovalService MergeRequests::ApprovalService --> Approval Approval --> db[(Database)]

비승인하는 경우에도 동일한 플로우를 따르지만 MergeRequests::RemoveApprovalService가 실행됩니다.

TODO

  1. code_ownerreport_approver와 같은 다른 규칙 유형에 관련된 정보 추가.
  2. Merge Request 승인/비승인의 부작용에 관한 정보 추가.