summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2017-09-26 09:54:56 +0200
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2017-09-26 09:54:56 +0200
commit61dc0b7dc7aeffc1b70bdde84864dccd90f7d655 (patch)
tree4fbf8599d8646f379555349f6e8928e4ad4f2830
parent7cfaccd6edba11e43963bbd4dcb5c2bb3c71d9f4 (diff)
downloadgitlab-ce-61dc0b7dc7aeffc1b70bdde84864dccd90f7d655.tar.gz
Extract pipeline persistence to a separate chain class
-rw-r--r--app/services/ci/create_pipeline_service.rb53
-rw-r--r--lib/gitlab/ci/pipeline/chain/create.rb29
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