diff options
author | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2017-10-11 15:32:19 +0200 |
---|---|---|
committer | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2017-11-06 11:04:09 +0100 |
commit | 164b1df59025e9685e243dd89d943ff5b1122b44 (patch) | |
tree | a26685f9fa72e83320ff9d543f790afe449a076a /app/services/ci | |
parent | e2828a60679495d716ed3824959794f4d5fbf5bb (diff) | |
download | gitlab-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.rb | 39 |
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 |