Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2017-09-26 10:54:56 +0300
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2017-09-26 10:54:56 +0300
commit61dc0b7dc7aeffc1b70bdde84864dccd90f7d655 (patch)
tree4fbf8599d8646f379555349f6e8928e4ad4f2830 /app/services/ci
parent7cfaccd6edba11e43963bbd4dcb5c2bb3c71d9f4 (diff)
Extract pipeline persistence to a separate chain class
Diffstat (limited to 'app/services/ci')
-rw-r--r--app/services/ci/create_pipeline_service.rb53
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