diff options
author | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2017-09-26 09:54:56 +0200 |
---|---|---|
committer | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2017-09-26 09:54:56 +0200 |
commit | 61dc0b7dc7aeffc1b70bdde84864dccd90f7d655 (patch) | |
tree | 4fbf8599d8646f379555349f6e8928e4ad4f2830 | |
parent | 7cfaccd6edba11e43963bbd4dcb5c2bb3c71d9f4 (diff) | |
download | gitlab-ce-61dc0b7dc7aeffc1b70bdde84864dccd90f7d655.tar.gz |
Extract pipeline persistence to a separate chain class
-rw-r--r-- | app/services/ci/create_pipeline_service.rb | 53 | ||||
-rw-r--r-- | lib/gitlab/ci/pipeline/chain/create.rb | 29 |
2 files changed, 50 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 diff --git a/lib/gitlab/ci/pipeline/chain/create.rb b/lib/gitlab/ci/pipeline/chain/create.rb new file mode 100644 index 00000000000..3b067ca6ace --- /dev/null +++ b/lib/gitlab/ci/pipeline/chain/create.rb @@ -0,0 +1,29 @@ +module Gitlab + module Ci + module Pipeline + module Chain + class Create < Chain::Base + def perform! + ::Ci::Pipeline.transaction do + pipeline.save! + + if @command.seeds_block + @command.seeds_block.call(pipeline) + end + + ::Ci::CreatePipelineStagesService + .new(project, current_user) + .execute(pipeline) + end + rescue ActiveRecord::RecordInvalid => e + pipeline.erros.add(:base, "Failed to persist the pipeline: #{e}") + end + + def break? + !pipeline.persisted? + end + end + end + end + end +end |