summaryrefslogtreecommitdiff
path: root/app/services/ci
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2017-10-11 15:32:19 +0200
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2017-11-06 11:04:09 +0100
commit164b1df59025e9685e243dd89d943ff5b1122b44 (patch)
treea26685f9fa72e83320ff9d543f790afe449a076a /app/services/ci
parente2828a60679495d716ed3824959794f4d5fbf5bb (diff)
downloadgitlab-ce-164b1df59025e9685e243dd89d943ff5b1122b44.tar.gz
Extract ensure stage service from commit status class
Diffstat (limited to 'app/services/ci')
-rw-r--r--app/services/ci/ensure_stage_service.rb39
1 files changed, 39 insertions, 0 deletions
diff --git a/app/services/ci/ensure_stage_service.rb b/app/services/ci/ensure_stage_service.rb
new file mode 100644
index 00000000000..dc2f49e8db1
--- /dev/null
+++ b/app/services/ci/ensure_stage_service.rb
@@ -0,0 +1,39 @@
+module Ci
+ ##
+ # We call this service everytime we persist a CI/CD job.
+ #
+ # In most cases a job should already have a stage assigned, but in cases it
+ # doesn't have we need to either find existing one or create a brand new
+ # stage.
+ #
+ class EnsureStageService < BaseService
+ def execute(build)
+ @build = build
+
+ return if build.stage_id.present?
+ return if build.invalid?
+
+ ensure_stage.tap do |stage|
+ build.stage_id = stage.id
+
+ yield stage if block_given?
+ end
+ end
+
+ private
+
+ def ensure_stage
+ find_stage || create_stage
+ end
+
+ def find_stage
+ @build.pipeline.stages.find_by(name: @build.stage)
+ end
+
+ def create_stage
+ Ci::Stage.create!(name: @build.stage,
+ pipeline: @build.pipeline,
+ project: @build.project)
+ end
+ end
+end