summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatija Čupić <matteeyah@gmail.com>2018-10-31 16:40:52 +0100
committerMatija Čupić <matteeyah@gmail.com>2018-10-31 19:11:45 +0100
commit3c8dd4ccbfcbb20de88005d43c93cd476de6d5c7 (patch)
tree1190ce8d30fb9bbabb6df88772614d4e786e4175
parent8f8a89f98edc4cb901f4107cbf38288576849d9e (diff)
downloadgitlab-ce-3c8dd4ccbfcbb20de88005d43c93cd476de6d5c7.tar.gz
Move parallelization to Ci::Config::Normalizer
-rw-r--r--lib/gitlab/ci/config/entry/jobs.rb10
-rw-r--r--lib/gitlab/ci/config/normalizer.rb51
2 files changed, 52 insertions, 9 deletions
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