module Ci class CreateBuildsService def initialize(pipeline) @pipeline = pipeline @config = pipeline.config_processor end def execute(stage, user, status, trigger_request = nil) builds_attrs = @config.builds_for_stage_and_ref(stage, @pipeline.ref, @pipeline.tag, trigger_request) # check when to create next build builds_attrs = builds_attrs.select do |build_attrs| case build_attrs[:when] when 'on_success' status == 'success' when 'on_failure' status == 'failed' when 'always' %w(success failed).include?(status) end end # don't create the same build twice builds_attrs.reject! do |build_attrs| @pipeline.builds.find_by(ref: @pipeline.ref, tag: @pipeline.tag, trigger_request: trigger_request, name: build_attrs[:name]) end builds_attrs.map do |build_attrs| build_attrs.slice!(:name, :commands, :tag_list, :options, :allow_failure, :stage, :stage_idx, :environment) build_attrs.merge!(pipeline: @pipeline, ref: @pipeline.ref, tag: @pipeline.tag, trigger_request: trigger_request, user: user, project: @pipeline.project) ## # We do not persist new builds here. # Those will be persisted when @pipeline is saved. # @pipeline.builds.new(build_attrs) end end end end