From 3c8dd4ccbfcbb20de88005d43c93cd476de6d5c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C4=8Cupi=C4=87?= Date: Wed, 31 Oct 2018 16:40:52 +0100 Subject: Move parallelization to Ci::Config::Normalizer --- lib/gitlab/ci/config/entry/jobs.rb | 10 +------- lib/gitlab/ci/config/normalizer.rb | 51 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 lib/gitlab/ci/config/normalizer.rb diff --git a/lib/gitlab/ci/config/entry/jobs.rb b/lib/gitlab/ci/config/entry/jobs.rb index fc4b8637ee2..1eab5927b56 100644 --- a/lib/gitlab/ci/config/entry/jobs.rb +++ b/lib/gitlab/ci/config/entry/jobs.rb @@ -29,15 +29,7 @@ module Gitlab # rubocop: disable CodeReuse/ActiveRecord def compose!(deps = nil) super do - @config = @config.map do |name, config| - total = config[:parallel] - if total - Array.new(total) { { name => config } } - .each_with_index { |build, idx| build["#{name} #{idx + 1}/#{total}".to_sym] = build.delete(name) } - else - { name => config } - end - end.flatten.reduce(:merge) + @config = Ci::Config::Normalizer.normalize_jobs(@config) @config.each do |name, config| node = hidden?(name) ? Entry::Hidden : Entry::Job diff --git a/lib/gitlab/ci/config/normalizer.rb b/lib/gitlab/ci/config/normalizer.rb new file mode 100644 index 00000000000..aa69dd44c5f --- /dev/null +++ b/lib/gitlab/ci/config/normalizer.rb @@ -0,0 +1,51 @@ +module Gitlab + module Ci + class Config + class Normalizer + class << self + def normalize_jobs(jobs_config) + parallelized_jobs = {} + + parallelized_config = jobs_config.map do |name, config| + if config&.[](:parallel) + total = config[:parallel] + names = parallelize_job_names(name, total) + parallelized_jobs[name] = names + Hash[names.collect { |job_name| [job_name.to_sym, config] }] + else + { name => config } + end + end.reduce(:merge) + + parallelized_config.each do |name, config| + next unless config[:dependencies] + + deps = config[:dependencies].map do |dep| + if parallelized_jobs.keys.include?(dep.to_sym) + config[:dependencies].delete(dep) + parallelized_jobs[dep.to_sym] + else + dep + end + end.flatten + + config[:dependencies] = deps + end + end + + private + + def parallelize_job_names(name, total) + jobs = [] + + total.times do |idx| + jobs << "#{name} #{idx + 1}/#{total}" + end + + jobs + end + end + end + end + end +end -- cgit v1.2.1