39203f1adf
This change simplifies a Pipeline processing by introducing a special new status: created. This status is used for all builds that are created for a pipeline. We are then processing next stages and queueing some of the builds (created -> pending) or skipping them (created -> skipped). This makes it possible to simplify and solve a few ordering problems with how previously builds were scheduled. This also allows us to visualise a full pipeline (with created builds). This also removes an after_touch used for updating a pipeline state parameters. Right now in various places we explicitly call a reload_status! on pipeline to force it to be updated and saved.
42 lines
1,010 B
Ruby
42 lines
1,010 B
Ruby
module Ci
|
|
class CreatePipelineBuildsService < BaseService
|
|
attr_reader :pipeline
|
|
|
|
def execute(pipeline)
|
|
@pipeline = pipeline
|
|
|
|
new_builds.map do |build_attributes|
|
|
create_build(build_attributes)
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def create_build(build_attributes)
|
|
build_attributes = build_attributes.merge(
|
|
pipeline: pipeline,
|
|
project: pipeline.project,
|
|
ref: pipeline.ref,
|
|
tag: pipeline.tag,
|
|
user: current_user,
|
|
trigger_request: trigger_request
|
|
)
|
|
pipeline.builds.create(build_attributes)
|
|
end
|
|
|
|
def new_builds
|
|
@new_builds ||= pipeline.config_builds_attributes.
|
|
reject { |build| existing_build_names.include?(build[:name]) }
|
|
end
|
|
|
|
def existing_build_names
|
|
@existing_build_names ||= pipeline.builds.pluck(:name)
|
|
end
|
|
|
|
def trigger_request
|
|
return @trigger_request if defined?(@trigger_request)
|
|
|
|
@trigger_request ||= pipeline.trigger_requests.first
|
|
end
|
|
end
|
|
end
|