diff options
Diffstat (limited to 'app/services/bulk_imports/create_pipeline_trackers_service.rb')
-rw-r--r-- | app/services/bulk_imports/create_pipeline_trackers_service.rb | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/app/services/bulk_imports/create_pipeline_trackers_service.rb b/app/services/bulk_imports/create_pipeline_trackers_service.rb new file mode 100644 index 00000000000..5c9c68e62b5 --- /dev/null +++ b/app/services/bulk_imports/create_pipeline_trackers_service.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +module BulkImports + class CreatePipelineTrackersService + def initialize(entity) + @entity = entity + end + + def execute! + entity.class.transaction do + entity.pipelines.each do |pipeline| + status = skip_pipeline?(pipeline) ? -2 : 0 + + entity.trackers.create!( + stage: pipeline[:stage], + pipeline_name: pipeline[:pipeline], + status: status + ) + end + end + end + + private + + attr_reader :entity + + def skip_pipeline?(pipeline) + return false unless source_version.valid? + + minimum_version, maximum_version = pipeline.values_at(:minimum_source_version, :maximum_source_version) + + if minimum_version && non_patch_source_version < Gitlab::VersionInfo.parse(minimum_version) + log_skipped_pipeline(pipeline, minimum_version, maximum_version) + return true + end + + if maximum_version && non_patch_source_version > Gitlab::VersionInfo.parse(maximum_version) + log_skipped_pipeline(pipeline, minimum_version, maximum_version) + return true + end + + false + end + + def source_version + @source_version ||= entity.bulk_import.source_version_info + end + + def non_patch_source_version + Gitlab::VersionInfo.new(source_version.major, source_version.minor, 0) + end + + def log_skipped_pipeline(pipeline, minimum_version, maximum_version) + logger.info( + message: 'Pipeline skipped as source instance version not compatible with pipeline', + entity_id: entity.id, + pipeline_name: pipeline[:pipeline], + minimum_source_version: minimum_version, + maximum_source_version: maximum_version, + source_version: source_version.to_s + ) + end + + def logger + @logger ||= Gitlab::Import::Logger.build + end + end +end |