승인 규칙 개발 가이드라인
이 문서는 병합 요청 승인 규칙에 관한 모든 관련 기능의 백엔드 설계와 흐름을 설명합니다.
이는 기여자들이 코드 설계를 더 쉽게 이해할 수 있도록 도와주고, 기능 및 구현이 발전함에 따라 개선할 부분이 있는지도 파악하는 데 도움이 될 것입니다.
구현 세부 정보가 너무 많지 않도록 하는 것이 의도된 바이며, 이는 자주 변경될 수 있기 때문입니다. 코드가 해당 내용을 더 잘 설명해야 합니다. 여기에 언급된 구성 요소들은 승인 규칙 기능이 작동하기 위한 응용 프로그램의 주요 부분입니다.
참고: 이 문서는 계속 업데이트되어야 하며, 이 문서에서 언급된 코드 베이스의 부분이 변경되거나 제거되거나 새로운 구성 요소가 추가될 때 그에 따라 업데이트되어야 합니다.
데이터 모델
Project
및 MergeRequest
Project
및 MergeRequest
모델은 ee/app/models/ee/project.rb
및 ee/app/models/ee/merge_request.rb
에 정의되어 있습니다. 이들은 승인 규칙이 EE(Enterprise Edition) 전용 기능이기 때문에 비-EE 버전을 확장합니다. 여기에는 병합 요청 승인과 관련된 연결 및 기타 관련 사항이 정의되어 있습니다.
ApprovalState
ApprovalState
클래스는 ee/app/models/approval_state.rb
에 정의되어 있습니다. 이는 실제 ActiveRecord
모델이 아닙니다. 이 클래스는 특정 병합 요청에 대한 승인 상태와 관련된 모든 논리를 캡슐화합니다. 다음과 같은 내용이 포함됩니다.
- 대상 브랜치를 기반으로 병합 요청에 적용되는 승인 규칙을 파악하는 것
- 특정 대상 브랜치에 적용되는 승인 규칙을 파악하는 것
- 모든 규칙이 승인되었는지 확인하는 것
- 승인이 필요한지 확인하는 것
- 몇 개의 승인이 승인되었거나 아직 필요한지 확인하는 것
이는 프로젝트(ApprovalProjectRule
)나 병합 요청(ApprovalMergeRequestRule
)에서 승인 규칙 데이터를 가져와 ApprovalWrappedRule
로 래핑합니다.
ApprovalProjectRule
ApprovalProjectRule
모델은 ee/app/models/approval_project_rule.rb
에 정의되어 있습니다.
프로젝트 설정 또는 프로젝트 수준 승인 API를 통해 승인 규칙을 추가/편집/제거할 때 레코드가 생성/업데이트/삭제됩니다. ApprovalState
모델은 이러한 레코드를 가져옵니다(승인 규칙이 덮어써지지 않은 경우).
protected_branches
속성은 규칙이 보호된 브랜치에 대해 범위가 지정된 경우에 설정되고 사용됩니다. 더 많은 정보는 보호된 브랜치에 대한 승인를 참조하세요.
ApprovalMergeRequestRule
ApprovalMergeRequestRule
모델은 ee/app/models/approval_merge_request_rule.rb
에 정의되어 있습니다.
병합 요청 생성/편집 양식 또는 병합 요청 수준 승인 API를 통해 규칙을 추가/편집/제거할 때 레코드가 생성/업데이트/삭제됩니다.
approval_project_rule
은 기존 ApprovalProjectRule
에서 기반을 둔 경우에 설정됩니다.
ApprovalMergeRequestRule
에는 protected_branches
가 없으며, 이는 approval_project_rule
로부터 상속받기 때문입니다.
ApprovalWrappedRule
ApprovalWrappedRule
은 ee/app/modes/approval_wrapped_rule.rb
에 정의되어 있으며, ActiveRecord
모델이 아닙니다. 이는 ApprovalProjectRule
또는 ApprovalMergeRequestRule
을 공통 인터페이스로 래핑하는 데 사용됩니다. 또한 다음과 같은 하위 유형을 가지고 있습니다.
-
ApprovalWrappedAnyApprovalRule
-any_approver
규칙을 래핑하는 데 사용됩니다. -
ApprovalWrappedCodeOwnerRule
-code_owner
규칙을 래핑하는 데 사용됩니다.
이 클래스는 대부분의 책임을 래핑하는 승인 규칙에 위임하지만 다음과 같은 것들에 대한 책임이 있습니다.
- 승인 규칙이 승인되었는지 확인하는 것
- 병합 요청에서
Approval
레코드로부터 얼마나 많은 승인을 받았는지 또는 아직 필요한지 확인하는 것
이 클래스는 이 정보를 승인 규칙 및 병합 요청으로부터 얻습니다.
승인
승인
모델은 ee/app/models/approval.rb
에서 정의됩니다. 이 모델은 병합 요청에 대한 승인에 관한 정보를 저장하는 역할을 합니다. 승인이 부여/취소될 때마다 레코드가 생성/삭제됩니다.
컨트롤러 및 서비스
아래의 컨트롤러와 서비스는 승인 규칙 기능을 실행하는 데 사용됩니다.
API::ProjectApprovalSettings
이 비공개 API는 ee/lib/api/project_approval_settings.rb
에 정의되어 있습니다.
다음을 위해 사용됩니다:
- 프로젝트 설정에서 승인 규칙 나열.
- 프로젝트 설정에서 규칙 생성/업데이트/삭제.
- 병합 요청 양식에서 승인 규칙 나열.
Projects::MergeRequests::CreationsController
이 컨트롤러는 app/controllers/projects/merge_requests/creations_controller.rb
에 정의되어 있습니다.
이 컨트롤러의 create
액션은 병합 요청 양식이 제출될 때 사용됩니다. ApprovalMergeRequestRule
레코드의 생성/업데이트/삭제를 위해 approval_rules_attributes
매개변수를 허용합니다. 이 매개변수는 MergeRequests::CreateService
를 실행할 때 함께 전달됩니다.
Projects::MergeRequestsController
이 컨트롤러는 app/controllers/projects/merge_requests_controller.rb
에 정의되어 있습니다.
이 컨트롤러의 update
액션은 병합 요청 편집 양식이 제출될 때 사용됩니다. 이전과 유사하지만 Projects::MergeRequests::CreationsController
보다는 MergeRequests::UpdateService
를 실행합니다.
API::MergeRequestApprovals
이 API는 ee/lib/api/merge_request_approvals.rb
에 정의되어 있습니다.
병합 요청 페이지가 로드될 때 승인 API 엔드포인트가 요청됩니다.
/projects/:id/merge_requests/:merge_request_iid/approval_settings
은 다음을 위해 사용되는 비공개 API 엔드포인트입니다:
- 병합 요청 편집 양식에서 승인 규칙 나열.
- 병합 요청 페이지에서 승인 규칙 나열.
UI 및 API를 통해 MR 승인/미승인 시 병합 요청 승인 API 엔드포인트나 병합 요청 미승인 API 엔드포인트가 요청됩니다. 해당되는 경우 MergeRequests::ApprovalService
및 MergeRequests::RemoveApprovalService
가 실행됩니다.
API::ProjectApprovalRules
및 API::MergeRequestApprovalRules
이러한 API는 ee/lib/api/project_approval_rules.rb
및 ee/lib/api/merge_request_approval_rules.rb
에 정의되어 있습니다.
프로젝트 및 병합 요청 수준 규칙을 나열/생성/업데이트/삭제하기 위해 병합 요청 승인 API를 통해 실행됩니다.
ApprovalRules::CreateService
, ApprovalRules::UpdateService
, ApprovalRules::ProjectRuleDestroyService
, 및 ApprovalRules::MergeRequestRuleDestroyService
가 각각 실행됩니다.
ApprovalRules::ParamsFilteringService
이 서비스는 ee/app/services/approval_rules/params_filtering_service.rb
에 정의되어 있습니다.
MergeRequests::CreateService
및 MergeRequests::UpdateService
가 실행될 때만 호출됩니다.
다음 작업을 수행합니다:
- 사용자가 승인 규칙을 업데이트할 수 없을 때 제거합니다.
- 프로젝트 멤버인지 여부에 따라 사용자 ID를 필터링합니다.
- 사용자에게 표시되는지에 따라 그룹 ID를 필터링합니다.
-
any_approver
규칙을 식별합니다. - 지정된 경우 숨겨진 그룹을 추가합니다.
- 대상 브랜치에 적용되지 않는 규칙(해당 MR에 적용되지 않는 규칙)을 식별합니다.
ApprovalRules::CreateService
이 서비스는 ee/app/services/approval_rules/create_service.rb
에 정의되어 있습니다.
병합 요청 또는 프로젝트 수준에서 승인 규칙을 생성하는 데 사용됩니다.
다음 경우 이 서비스가 호출됩니다:
- UI를 통해 프로젝트 수준에서 승인 규칙을 생성하는 경우.
-
API::ProjectApprovalRules
/projects/:id/approval_rules
엔드포인트를 통해 프로젝트 수준에서 승인 규칙을 생성하는 경우. -
API::MergeRequestApprovalRules
/projects/:id/merge_requests/:merge_request_iid/approval_rules
엔드포인트를 통해 병합 요청 수준 규칙을 생성하는 경우.
UI를 통해 생성된 병합 요청 수준 규칙은 이 서비스를 사용하지 않습니다. Projects::MergeRequests::CreationsController를 참조하십시오.
흐름
다음 플로우차트는 컨트롤러에서 모델까지 다양한 기능을 위한 플로우를 설명하는 데 도움이 될 것입니다.
몇 가지 CRUD API 엔드포인트는 명확하므로 일부는 의도적으로 건너 뜁니다.
웹 UI를 통해 승인 규칙을 포함한 병합 요청 생성
업데이트 시에는 동일한 플로우를 따르지만 Projects::MergeRequestsController
에서 시작하여 MergeRequests::UpdateService
를 실행합니다.
MR 페이지에서의 병합 요청 승인 규칙 보기
이 흐름은 프론트엔드 컴포넌트에 의해 시작됩니다. 반환된 데이터는 MR 위젯에 정보를 표시하는 데 사용됩니다.
병합 요청 승인하기
비승인 시에는 같은 흐름을 따르지만 MergeRequests::RemoveApprovalService
가 실행됩니다.
할 일
-
code_owner
및report_approver
와 같은 다른 규칙 유형에 관련된 정보 추가. - 병합 요청 승인/비승인의 부작용에 대한 정보 추가.