diff options
author | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2017-09-26 10:54:56 +0300 |
---|---|---|
committer | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2017-09-26 10:54:56 +0300 |
commit | 61dc0b7dc7aeffc1b70bdde84864dccd90f7d655 (patch) | |
tree | 4fbf8599d8646f379555349f6e8928e4ad4f2830 /app/services/ci | |
parent | 7cfaccd6edba11e43963bbd4dcb5c2bb3c71d9f4 (diff) |
Extract pipeline persistence to a separate chain class
Diffstat (limited to 'app/services/ci')
-rw-r--r-- | app/services/ci/create_pipeline_service.rb | 53 |
1 files changed, 21 insertions, 32 deletions
diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb index c5a5d9fc527..0386c1e8829 100644 --- a/app/services/ci/create_pipeline_service.rb +++ b/app/services/ci/create_pipeline_service.rb @@ -3,9 +3,10 @@ module Ci attr_reader :pipeline SEQUENCE = [Gitlab::Ci::Pipeline::Chain::Validate, - Gitlab::Ci::Pipeline::Chain::Skip].freeze + Gitlab::Ci::Pipeline::Chain::Skip, + Gitlab::Ci::Pipeline::Chain::Create].freeze - def execute(source, ignore_skip_ci: false, save_on_errors: true, trigger_request: nil, schedule: nil) + def execute(source, ignore_skip_ci: false, save_on_errors: true, trigger_request: nil, schedule: nil, &block) @pipeline = Ci::Pipeline.new( source: source, project: project, @@ -19,43 +20,31 @@ module Ci protected: project.protected_for?(ref) ) - command = OpenStruct.new(ignore_skip_ci: ignore_skip_ci, - save_incompleted: save_on_errors, - trigger_request: trigger_request, - schedule: schedule, - project: project, - current_user: current_user) + @pipeline.tap do |pipeline| + command = OpenStruct.new(ignore_skip_ci: ignore_skip_ci, + save_incompleted: save_on_errors, + trigger_request: trigger_request, + schedule: schedule, + seeds_block: block, + project: project, + current_user: current_user) - sequence = SEQUENCE.map { |chain| chain.new(pipeline, command) } + sequence = SEQUENCE.map { |chain| chain.new(pipeline, command) } - done = sequence.any? do |chain| - chain.perform! - chain.break? - end - - update_merge_requests_head_pipeline if pipeline.persisted? - - return pipeline if done + sequence_complete = sequence.none? do |chain| + chain.perform! + chain.break? + end - begin - Ci::Pipeline.transaction do - pipeline.save! + update_merge_requests_head_pipeline if pipeline.persisted? - yield(pipeline) if block_given? + if sequence_complete + cancel_pending_pipelines if project.auto_cancel_pending_pipelines? + pipeline_created_counter.increment(source: source) - Ci::CreatePipelineStagesService - .new(project, current_user) - .execute(pipeline) + pipeline.process! end - rescue ActiveRecord::RecordInvalid => e - return error("Failed to persist the pipeline: #{e}") end - - update_merge_requests_head_pipeline if pipeline.persisted? - cancel_pending_pipelines if project.auto_cancel_pending_pipelines? - pipeline_created_counter.increment(source: source) - - pipeline.tap(&:process!) end private |