Commit 4b2b154c authored by Matija Čupić's avatar Matija Čupić

Refactor Gitlab::Ci::Config::Normalizer

Use Hash#each_with_object to manipulate job hashes.
parent 5fd8933d
...@@ -4,54 +4,56 @@ module Gitlab ...@@ -4,54 +4,56 @@ module Gitlab
module Ci module Ci
class Config class Config
class Normalizer class Normalizer
def initialize(jobs_config) class << self
@jobs_config = jobs_config def normalize_jobs(jobs_config)
end parallelized_jobs = extract_parallelized_jobs(jobs_config)
parallelized_config = parallelize_jobs(jobs_config, parallelized_jobs)
def normalize_jobs parallelize_dependencies(parallelized_config, parallelized_jobs)
parallelized_jobs = parallelize_jobs end
parallelize_dependencies(parallelized_jobs)
end private
def extract_parallelized_jobs(jobs_config)
parallelized_jobs = {}
jobs_config.each do |job_name, config|
if config[:parallel]
parallelized_jobs[job_name] = parallelize_job_names(job_name, config[:parallel])
end
end
private parallelized_jobs
end
def parallelize_jobs def parallelize_jobs(jobs_config, parallelized_jobs)
parallelized_jobs = {} jobs_config.each_with_object({}) do |(job_name, config), hash|
if parallelized_jobs.keys.include?(job_name)
parallelized_jobs[job_name].each { |name, index| hash[name.to_sym] = config.merge(name: name, instance: index) }
else
hash[job_name] = config
end
@jobs_config = @jobs_config.map do |name, config| hash
if config[:parallel]
total = config[:parallel]
names = self.class.parallelize_job_names(name, total)
parallelized_jobs[name] = names.map(&:first)
Hash[names.collect { |job_name, index| [job_name.to_sym, config.merge(name: job_name, instance: index)] }]
else
{ name => config }
end end
end.reduce(:merge) end
parallelized_jobs def parallelize_dependencies(parallelized_config, parallelized_jobs)
end parallelized_config.each_with_object({}) do |(job_name, config), hash|
intersection = config[:dependencies] & parallelized_jobs.keys.map(&:to_s)
def parallelize_dependencies(parallelized_jobs) if intersection && intersection.any?
@jobs_config.map do |name, config| deps = intersection.map { |dep| parallelized_jobs[dep.to_sym].map(&:first) }.flatten
if config[:dependencies] hash[job_name] = config.merge(dependencies: deps)
deps = config[:dependencies].map do |dep| else
if parallelized_jobs.keys.include?(dep.to_sym) hash[job_name] = config
parallelized_jobs[dep.to_sym] end
else
dep hash
end
end.flatten
{ name => config.merge(dependencies: deps) }
else
{ name => config }
end end
end.reduce(:merge) end
end
def self.parallelize_job_names(name, total) def parallelize_job_names(name, total)
Array.new(total) { |index| ["#{name} #{index + 1}/#{total}", index + 1] } Array.new(total) { |index| ["#{name} #{index + 1}/#{total}", index + 1] }
end
end end
end end
end end
......
...@@ -104,7 +104,7 @@ module Gitlab ...@@ -104,7 +104,7 @@ module Gitlab
## ##
# Jobs # Jobs
# #
@jobs = Ci::Config::Normalizer.new(@ci_config.jobs).normalize_jobs @jobs = Ci::Config::Normalizer.normalize_jobs(@ci_config.jobs)
@jobs.each do |name, job| @jobs.each do |name, job|
# logical validation for job # logical validation for job
......
...@@ -8,7 +8,7 @@ describe Gitlab::Ci::Config::Normalizer do ...@@ -8,7 +8,7 @@ describe Gitlab::Ci::Config::Normalizer do
let(:config) { { job_name => job_config } } let(:config) { { job_name => job_config } }
describe '.normalize_jobs' do describe '.normalize_jobs' do
subject { described_class.new(config).normalize_jobs } subject { described_class.normalize_jobs(config) }
it 'does not have original job' do it 'does not have original job' do
is_expected.not_to include(job_name) is_expected.not_to include(job_name)
...@@ -30,6 +30,16 @@ describe Gitlab::Ci::Config::Normalizer do ...@@ -30,6 +30,16 @@ describe Gitlab::Ci::Config::Normalizer do
expect(configs).to all(eq(original_config)) expect(configs).to all(eq(original_config))
end end
context 'when jobs depend on parallelized jobs' do
let(:config) { { job_name => job_config, other_job: { script: 'echo 1', dependencies: [job_name.to_s] } } }
it 'parallelizes dependencies' do
job_names = described_class.send(:parallelize_job_names, job_name, 5).map(&:first)
expect(subject[:other_job][:dependencies]).to include(*job_names)
end
end
end end
describe '.parallelize_job_names' do describe '.parallelize_job_names' 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