Merge 가능성 프레임워크
초안 작업은 정의가 더 명확한 Merge 가능성 프레임워크에서 시작되었습니다.
원래 Merge 가능성 지식은 백엔드와 프론트엔드 전체에 퍼져 있었습니다. 이 작업은 일부 Merge 가능성 기준을 백엔드 내부의 동일한 위치로 통합하는 것이었습니다. 이를 통해 프론트엔드는 단순히 API를 사용하고 오류를 표시할 수 있게 되었습니다.
새로운 체크 추가
새로운 Merge 체크를 추가할 때 몇 가지 선택을 해야 합니다.
- 이 체크는 건너뛸 수 있는지, 체크 통과시 Merge 기능의 일부입니까?
- 이 체크는 캐시할 수 있는지?
- 만약 가능하다면, 적절한 캐시 키는 무엇입니까?
- 이 체크는 켜거나 끌 수 있는 설정을 가지고 있습니까?
이러한 질문에 답한 후에 새로운 체크를 생성할 수 있습니다.
Merge 가능성 체크는 app/services/merge_requests/mergeability/
아래에 있습니다.
-
새로운 체크를 만들려면 다음을 기본으로 사용할 수 있습니다:
# frozen_string_literal: true module MergeRequests module Mergeability class CheckCiStatusService < CheckBaseService identifier :ci_must_pass # 어떤 체크가 실패했는지를 나타내는 식별자 description 'CI가 통과했는지 확인합니다' # GraphQL을 통해 리턴되는 체크 설명 def execute # 만약 Merge 체크가 설정 뒤에 있다면, 설정이 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의 건너뛰기 여부는 Merge 시 체크 통과 기능과 관련이 있습니다 paramas[:skip_ci_check].present? end # 여기서 true를 반환하면, cache_key 메서드를 생성하고 # 올바르게 무효화 할 수 있는 적절한 캐시 키를 제공해야 합니다. def cacheable? false end end end end
-
def mergeable_state_checks
메서드에 새로운 체크를 추가합니다. - 새로운 체크를
app/graphql/types/merge_requests/detailed_merge_status_enum.rb
의 GraphQL enum에 추가합니다. -
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
.
고려 사항
- 건너뛸 수 있는가? Merge 시 체크 통과 작업의 일부인 경우 건너뛰기 가능한 체크를 추가해야 합니다. 그렇지 않으면 false를 반환해야 합니다.
- 성능: 이러한 Merge 가능성 체크는 매우 빈번하게 실행되기 때문에 성능이 중요합니다. 새로운 Merge 가능성 체크의 성능을 확인하는 것이 중요합니다. 일반적으로 약 10-20ms 정도가 예상됩니다.
-
캐싱도 옵션입니다.
def cacheable?
메서드를 true로 설정하고, 그 경우에는 특정 체크를 위한 캐시 키를 설정하는 다른 메서드def cache_key
를 만들어야 합니다. 캐시 무효화는 종종 까다로울 수 있으며, 캐시 키의 모든 엣지 케이스를 고려해야 합니다. 시간을 10-20ms 수준으로 유지한다면 캐싱은 필요하지 않습니다. -
체크의 시간을 메트릭하세요. 각 체크를
app/services/merge_requests/mergeability/logger.rb
클래스를 통해 메트릭한 후 Kibana에서 볼 수 있습니다.
클래스가 어떻게 함께 작동하는가
- Merge 가능성 프레임워크를 호출하는 주요 메서드는
def mergeable?
와DetailedMergeStatusService
입니다. - 이러한 메서드는 반복되는 Merge 가능성 체크, 캐싱 및 instrumentation을 처리하는
RunChecksService
클래스를 호출합니다.
Merge 시 체크 통과
Merge 시 체크 통과 기능에 체크를 추가하려면 다음을 수행해야 합니다:
- 해당 클래스에서 체크를 건너뛸 수 있도록 허용합니다.
-
skipped_mergeable_checks
메서드의 디렉터리에 매개변수를 추가합니다.
향후 작업
- 현재 승인 체크의 성능이 주요 고려 사항입니다. 이 체크를 캐시할 수 있도록 시도해 보았지만 무효화해야 하는 케이스가 많이 있습니다.