Commit 593490e5 authored by Kamil Trzciński's avatar Kamil Trzciński

Extend PipelineProcessWorker to accept a list of builds

This changes used worker from `BuildProcessWorker`
to `PipelineProcessWorker` to make pipeline
processing much simpler. We process `pipeline_id`,
based on some triggers.
parent 8156e77c
...@@ -611,8 +611,8 @@ module Ci ...@@ -611,8 +611,8 @@ module Ci
end end
# rubocop: disable CodeReuse/ServiceClass # rubocop: disable CodeReuse/ServiceClass
def process!(trigger_build_name = nil) def process!(trigger_build_ids = nil)
Ci::ProcessPipelineService.new(project, user).execute(self, trigger_build_name) Ci::ProcessPipelineService.new(project, user).execute(self, trigger_build_ids)
end end
# rubocop: enable CodeReuse/ServiceClass # rubocop: enable CodeReuse/ServiceClass
......
...@@ -122,7 +122,7 @@ class CommitStatus < ApplicationRecord ...@@ -122,7 +122,7 @@ class CommitStatus < ApplicationRecord
commit_status.run_after_commit do commit_status.run_after_commit do
if pipeline_id if pipeline_id
if complete? || manual? if complete? || manual?
BuildProcessWorker.perform_async(id) PipelineProcessWorker.perform_async(pipeline_id, [id])
else else
PipelineUpdateWorker.perform_async(pipeline_id) PipelineUpdateWorker.perform_async(pipeline_id)
end end
......
...@@ -4,7 +4,7 @@ module Ci ...@@ -4,7 +4,7 @@ module Ci
class ProcessPipelineService < BaseService class ProcessPipelineService < BaseService
attr_reader :pipeline attr_reader :pipeline
def execute(pipeline, trigger_build_name = nil) def execute(pipeline, trigger_build_ids = nil)
@pipeline = pipeline @pipeline = pipeline
update_retried update_retried
...@@ -16,7 +16,7 @@ module Ci ...@@ -16,7 +16,7 @@ module Ci
# we evaluate dependent needs, # we evaluate dependent needs,
# only when the another job has finished # only when the another job has finished
success = process_builds_with_needs(trigger_build_name) || success success = process_builds_with_needs(trigger_build_ids) || success
@pipeline.update_status @pipeline.update_status
...@@ -40,12 +40,18 @@ module Ci ...@@ -40,12 +40,18 @@ module Ci
end end
end end
def process_builds_with_needs(trigger_build_name) def process_builds_with_needs(trigger_build_ids)
return false unless trigger_build_name return false unless trigger_build_ids.present?
return false unless Feature.enabled?(:ci_dag_support, project) return false unless Feature.enabled?(:ci_dag_support, project)
# rubocop: disable CodeReuse/ActiveRecord
trigger_build_names = pipeline.statuses
.where(id: trigger_build_ids)
.select(:name)
# rubocop: enable CodeReuse/ActiveRecord
created_processables created_processables
.with_needs(trigger_build_name) .with_needs(trigger_build_names)
.find_each .find_each
.map(&method(:process_build_with_needs)) .map(&method(:process_build_with_needs))
.any? .any?
......
...@@ -9,7 +9,7 @@ class BuildProcessWorker ...@@ -9,7 +9,7 @@ class BuildProcessWorker
# rubocop: disable CodeReuse/ActiveRecord # rubocop: disable CodeReuse/ActiveRecord
def perform(build_id) def perform(build_id)
CommitStatus.find_by(id: build_id).try do |build| CommitStatus.find_by(id: build_id).try do |build|
build.pipeline.process!(build.name) build.pipeline.process!([build_id])
end end
end end
# rubocop: enable CodeReuse/ActiveRecord # rubocop: enable CodeReuse/ActiveRecord
......
...@@ -7,9 +7,10 @@ class PipelineProcessWorker ...@@ -7,9 +7,10 @@ class PipelineProcessWorker
queue_namespace :pipeline_processing queue_namespace :pipeline_processing
# rubocop: disable CodeReuse/ActiveRecord # rubocop: disable CodeReuse/ActiveRecord
def perform(pipeline_id) def perform(pipeline_id, build_ids = nil)
Ci::Pipeline.find_by(id: pipeline_id) Ci::Pipeline.find_by(id: pipeline_id).try do |pipeline|
.try(:process!) pipeline.process!(build_ids)
end
end end
# rubocop: enable CodeReuse/ActiveRecord # rubocop: enable CodeReuse/ActiveRecord
end end
...@@ -10,7 +10,7 @@ describe BuildProcessWorker do ...@@ -10,7 +10,7 @@ describe BuildProcessWorker do
it 'processes build' do it 'processes build' do
expect_any_instance_of(Ci::Pipeline).to receive(:process!) expect_any_instance_of(Ci::Pipeline).to receive(:process!)
.with(build.name) .with([build.id])
described_class.new.perform(build.id) described_class.new.perform(build.id)
end end
......
...@@ -12,6 +12,17 @@ describe PipelineProcessWorker do ...@@ -12,6 +12,17 @@ describe PipelineProcessWorker do
described_class.new.perform(pipeline.id) described_class.new.perform(pipeline.id)
end end
context 'when build_ids are passed' do
let(:build) { create(:ci_build, pipeline: pipeline, name: 'my-build') }
it 'processes pipeline with a list of builds' do
expect_any_instance_of(Ci::Pipeline).to receive(:process!)
.with([build.id])
described_class.new.perform(pipeline.id, [build.id])
end
end
end end
context 'when pipeline does not exist' do context 'when pipeline does not exist' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment