diff options
Diffstat (limited to 'app/services')
5 files changed, 47 insertions, 24 deletions
diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb index 2daf3a51235..52977034b70 100644 --- a/app/services/ci/create_pipeline_service.rb +++ b/app/services/ci/create_pipeline_service.rb @@ -61,7 +61,7 @@ module Ci Ci::ProcessPipelineService .new(pipeline) - .execute + .execute(nil, initial_process: true) end end diff --git a/app/services/ci/pipeline_processing/atomic_processing_service.rb b/app/services/ci/pipeline_processing/atomic_processing_service.rb index 1ed295f5950..55846c3cb5c 100644 --- a/app/services/ci/pipeline_processing/atomic_processing_service.rb +++ b/app/services/ci/pipeline_processing/atomic_processing_service.rb @@ -93,9 +93,9 @@ module Ci end def processable_status(processable) - if needs_names = processable.aggregated_needs_names + if Feature.enabled?(:ci_dag_support, project, default_enabled: true) && processable.scheduling_type_dag? # Processable uses DAG, get status of all dependent needs - @collection.status_for_names(needs_names) + @collection.status_for_names(processable.aggregated_needs_names.to_a) else # Processable uses Stages, get status of prior stage @collection.status_for_prior_stage_position(processable.stage_idx.to_i) diff --git a/app/services/ci/pipeline_processing/legacy_processing_service.rb b/app/services/ci/pipeline_processing/legacy_processing_service.rb index 400dc9f0abb..278fba20283 100644 --- a/app/services/ci/pipeline_processing/legacy_processing_service.rb +++ b/app/services/ci/pipeline_processing/legacy_processing_service.rb @@ -11,12 +11,13 @@ module Ci @pipeline = pipeline end - def execute(trigger_build_ids = nil) - success = process_stages_without_needs + def execute(trigger_build_ids = nil, initial_process: false) + success = process_stages_for_stage_scheduling # we evaluate dependent needs, # only when the another job has finished - success = process_builds_with_needs(trigger_build_ids) || success + success = process_dag_builds_without_needs || success if initial_process + success = process_dag_builds_with_needs(trigger_build_ids) || success @pipeline.update_legacy_status @@ -25,23 +26,31 @@ module Ci private - def process_stages_without_needs - stage_indexes_of_created_processables_without_needs.flat_map do |index| - process_stage_without_needs(index) + def process_stages_for_stage_scheduling + stage_indexes_of_created_stage_scheduled_processables.flat_map do |index| + process_stage_for_stage_scheduling(index) end.any? end - def process_stage_without_needs(index) + def process_stage_for_stage_scheduling(index) current_status = status_for_prior_stages(index) return unless HasStatus::COMPLETED_STATUSES.include?(current_status) - created_processables_in_stage_without_needs(index).find_each.select do |build| + created_stage_scheduled_processables_in_stage(index).find_each.select do |build| process_build(build, current_status) end.any? end - def process_builds_with_needs(trigger_build_ids) + def process_dag_builds_without_needs + return false unless Feature.enabled?(:ci_dag_support, project, default_enabled: true) + + created_processables.scheduling_type_dag.without_needs.each do |build| + process_build(build, 'success') + end + end + + def process_dag_builds_with_needs(trigger_build_ids) return false unless trigger_build_ids.present? return false unless Feature.enabled?(:ci_dag_support, project, default_enabled: true) @@ -56,14 +65,15 @@ module Ci # Each found processable is guaranteed here to have completed status created_processables + .scheduling_type_dag .with_needs(trigger_build_names) .without_needs(incomplete_build_names) .find_each - .map(&method(:process_build_with_needs)) + .map(&method(:process_dag_build_with_needs)) .any? end - def process_build_with_needs(build) + def process_dag_build_with_needs(build) current_status = status_for_build_needs(build.needs.map(&:name)) return unless HasStatus::COMPLETED_STATUSES.include?(current_status) @@ -87,23 +97,23 @@ module Ci end # rubocop: disable CodeReuse/ActiveRecord - def stage_indexes_of_created_processables_without_needs - created_processables_without_needs.order(:stage_idx) + def stage_indexes_of_created_stage_scheduled_processables + created_stage_scheduled_processables.order(:stage_idx) .pluck(Arel.sql('DISTINCT stage_idx')) end # rubocop: enable CodeReuse/ActiveRecord - def created_processables_in_stage_without_needs(index) - created_processables_without_needs + def created_stage_scheduled_processables_in_stage(index) + created_stage_scheduled_processables .with_preloads .for_stage(index) end - def created_processables_without_needs + def created_stage_scheduled_processables if Feature.enabled?(:ci_dag_support, project, default_enabled: true) - pipeline.processables.created.without_needs + created_processables.scheduling_type_stage else - pipeline.processables.created + created_processables end end diff --git a/app/services/ci/process_pipeline_service.rb b/app/services/ci/process_pipeline_service.rb index 1ecef256233..d1efa19eb0d 100644 --- a/app/services/ci/process_pipeline_service.rb +++ b/app/services/ci/process_pipeline_service.rb @@ -8,8 +8,9 @@ module Ci @pipeline = pipeline end - def execute(trigger_build_ids = nil) + def execute(trigger_build_ids = nil, initial_process: false) update_retried + ensure_scheduling_type_for_processables if Feature.enabled?(:ci_atomic_processing, pipeline.project) Ci::PipelineProcessing::AtomicProcessingService @@ -18,7 +19,7 @@ module Ci else Ci::PipelineProcessing::LegacyProcessingService .new(pipeline) - .execute(trigger_build_ids) + .execute(trigger_build_ids, initial_process: initial_process) end end @@ -43,5 +44,17 @@ module Ci .update_all(retried: true) if latest_statuses.any? end # rubocop: enable CodeReuse/ActiveRecord + + # Set scheduling type of processables if they were created before scheduling_type + # data was deployed (https://gitlab.com/gitlab-org/gitlab/-/merge_requests/22246). + # Given that this service runs multiple times during the pipeline + # life cycle we need to ensure we populate the data once. + # See more: https://gitlab.com/gitlab-org/gitlab/issues/205426 + def ensure_scheduling_type_for_processables + lease = Gitlab::ExclusiveLease.new("set-scheduling-types:#{pipeline.id}", timeout: 1.hour.to_i) + return unless lease.try_obtain + + pipeline.processables.populate_scheduling_type! + end end end diff --git a/app/services/ci/retry_pipeline_service.rb b/app/services/ci/retry_pipeline_service.rb index 7d01de9ee68..9bb236ac44c 100644 --- a/app/services/ci/retry_pipeline_service.rb +++ b/app/services/ci/retry_pipeline_service.rb @@ -36,7 +36,7 @@ module Ci Ci::ProcessPipelineService .new(pipeline) - .execute(completed_build_ids) + .execute(completed_build_ids, initial_process: true) end end end |