diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/services/merge_requests/base_service.rb | 26 | ||||
-rw-r--r-- | app/services/merge_requests/create_pipeline_service.rb | 37 |
2 files changed, 38 insertions, 25 deletions
diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb index bb9062e9b40..2cfed62ce49 100644 --- a/app/services/merge_requests/base_service.rb +++ b/app/services/merge_requests/base_service.rb @@ -60,31 +60,7 @@ module MergeRequests end def create_pipeline_for(merge_request, user) - return unless can_create_pipeline_for?(merge_request) - - create_detached_merge_request_pipeline(merge_request, user) - end - - def create_detached_merge_request_pipeline(merge_request, user) - if can_use_merge_request_ref?(merge_request) - Ci::CreatePipelineService.new(merge_request.source_project, user, - ref: merge_request.ref_path) - .execute(:merge_request_event, merge_request: merge_request) - else - Ci::CreatePipelineService.new(merge_request.source_project, user, - ref: merge_request.source_branch) - .execute(:merge_request_event, merge_request: merge_request) - end - end - - def can_create_pipeline_for?(merge_request) - ## - # UpdateMergeRequestsWorker could be retried by an exception. - # pipelines for merge request should not be recreated in such case. - return false if merge_request.find_actual_head_pipeline&.triggered_by_merge_request? - return false if merge_request.has_no_commits? - - true + MergeRequests::CreatePipelineService.new(project, user).execute(merge_request) end def can_use_merge_request_ref?(merge_request) diff --git a/app/services/merge_requests/create_pipeline_service.rb b/app/services/merge_requests/create_pipeline_service.rb new file mode 100644 index 00000000000..03246cc1920 --- /dev/null +++ b/app/services/merge_requests/create_pipeline_service.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +module MergeRequests + class CreatePipelineService < MergeRequests::BaseService + def execute(merge_request) + return unless can_create_pipeline_for?(merge_request) + + create_detached_merge_request_pipeline(merge_request) + end + + def create_detached_merge_request_pipeline(merge_request) + if can_use_merge_request_ref?(merge_request) + Ci::CreatePipelineService.new(merge_request.source_project, current_user, + ref: merge_request.ref_path) + .execute(:merge_request_event, merge_request: merge_request) + else + Ci::CreatePipelineService.new(merge_request.source_project, current_user, + ref: merge_request.source_branch) + .execute(:merge_request_event, merge_request: merge_request) + end + end + + def can_create_pipeline_for?(merge_request) + ## + # UpdateMergeRequestsWorker could be retried by an exception. + # pipelines for merge request should not be recreated in such case. + return false if !allow_duplicate && merge_request.find_actual_head_pipeline&.triggered_by_merge_request? + return false if merge_request.has_no_commits? + + true + end + + def allow_duplicate + params[:allow_duplicate] + end + end +end |