병합 가능성 프레임워크
초기 작업은 더 명확한 병합 가능성 프레임워크를 시작했습니다.
원래 병합 가능성 지식은 백엔드와 프런트엔드 전체에 퍼져 있었습니다. 이 작업은 병합 가능성 기준 중 일부를 백엔드의 동일한 위치로 통합하는 것이었습니다. 이를 통해 프런트엔드에서는 API를 소비하고 오류를 표시하기만 하면 됩니다.
새로운 확인 추가
병합 가능성 확인은 app/services/merge_requests/mergeability/
아래에 있습니다.
-
새로운 확인을 만들기 위해 다음을 사용할 수 있습니다.
# frozen_string_literal: true module MergeRequests module Mergeability class CheckCiStatusService < CheckBaseService identifier :ci_must_pass description 'CI가 통과되었는지 확인합니다.' def execute # 병합 확인이 설정 뒤에 있다면, 설정이 false이면 비활성 상태를 반환합니다. return inactive unless merge_request.only_allow_merge_if_pipeline_succeeds? if merge_request.mergeable_ci_state? success else failure end end def skip? # 여기서는 param을 확인하거나 스킵할 수 없는 경우에는 false를 반환합니다. # MR의 스킵 가능 여부는 확인 통화 시 기능과 관련이 있습니다. params[:skip_ci_check].present? end def cacheable? false end end end end
-
def mergeable_state_checks
메서드에 새로운 확인을 추가합니다. - 새로운 확인을 GraphQL enum
app/graphql/types/merge_requests/detailed_merge_status_enum.rb
에 추가합니다. -
bundle exec rake gitlab:graphql:compile_docs
를 사용하여 GraphQL 문서를 업데이트합니다. -
doc/api/merge_requests.md
에서 API 문서를 업데이트합니다. - 프런트엔드를 새로운 메시지를 지원하도록 업데이트합니다:
app/assets/javascripts/vue_merge_request_widget/components/checks/message.vue
.
고려 사항
-
스킵할 수 있는지 여부가 필요합니다. 병합 확인이 병합 시에 작동하는 경우 스킵할 수 있는 확인을 추가해야 합니다.
그렇지 않으면
false
를 반환해야 합니다. - 성능: 이 병합 가능성 확인은 매우 자주 실행되므로, 성능은 큰 고려 사항입니다. 새로운 병합 가능성 확인 성능을 확인하는 것이 중요합니다. 일반적으로 약 10-20밀리초 정도가 예상됩니다.
-
캐싱도 옵션입니다.
def cacheable?
메서드를true
를 반환하도록 설정할 수 있으며, 이 경우 해당 확인의 캐시 키를 설정하는 또 다른 메서드def cache_key
를 만들어야 합니다. 캐시의 무효화는 종종 까다로울 수 있으며, 캐시 키의 모든 에지 케이스를 고려해야 합니다. 타이밍을 유지하면서 10-20밀리초 정도라면 캐싱이 필요하지 않습니다. -
확인 시간을 측정합니다. 확인 사항마다
app/services/merge_requests/mergeability/logger.rb
클래스를 통해 시간을 측정하고, 그것을 Kibana에서 볼 수 있습니다.
클래스가 함께 작동하는 방식
- 병합 가능성 프레임워크를 호출하는 주요 메서드는
def mergeable?
와DetailedMergeStatusService
입니다. - 이러한 메서드는 병합 가능성 확인을 처리하고 반복하는
RunChecksService
클래스를 호출합니다. 여기에는 캐싱 및 계측이 처리됩니다.
향후 작업
- 현재, 승인 확인의 느린 성능이 주요 관심사입니다. 이 확인을 캐시할 수 있도록 시도했지만, 무효화해야 할 에지 케이스가 많습니다.