From d9b56bc13b94bdc69a14a2b4201e25e141a62ce4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C4=8Cupi=C4=87?= Date: Fri, 26 Oct 2018 22:02:09 +0200 Subject: Add parallel keyword to CI config --- spec/lib/gitlab/ci/config/entry/job_spec.rb | 33 +++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) (limited to 'spec/lib/gitlab/ci/config') diff --git a/spec/lib/gitlab/ci/config/entry/job_spec.rb b/spec/lib/gitlab/ci/config/entry/job_spec.rb index 1169938b80c..718098c364e 100644 --- a/spec/lib/gitlab/ci/config/entry/job_spec.rb +++ b/spec/lib/gitlab/ci/config/entry/job_spec.rb @@ -1,5 +1,4 @@ -require 'fast_spec_helper' -require_dependency 'active_model' +require 'spec_helper' describe Gitlab::Ci::Config::Entry::Job do let(:entry) { described_class.new(config, name: :rspec) } @@ -138,6 +137,36 @@ describe Gitlab::Ci::Config::Entry::Job do end end + context 'when parallel value is not correct' do + context 'when it is not a numeric value' do + let(:config) { { parallel: true } } + + it 'returns error about invalid type' do + expect(entry).not_to be_valid + expect(entry.errors).to include 'job parallel is not a number' + end + end + + context 'when it is lower than one' do + let(:config) { { parallel: 0 } } + + it 'returns error about value too low' do + expect(entry).not_to be_valid + expect(entry.errors) + .to include 'job parallel must be greater than or equal to 1' + end + end + + context 'when it is not an integer' do + let(:config) { { parallel: 1.5 } } + + it 'returns error about wrong value' do + expect(entry).not_to be_valid + expect(entry.errors).to include 'job parallel must be an integer' + end + end + end + context 'when delayed job' do context 'when start_in is specified' do let(:config) { { script: 'echo', when: 'delayed', start_in: '1 day' } } -- cgit v1.2.3 From 9ba72fe09aaf3bf903494f09fe8896012e962c98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C4=8Cupi=C4=87?= Date: Sat, 27 Oct 2018 19:06:46 +0200 Subject: Change minimum parallel value to 2 --- spec/lib/gitlab/ci/config/entry/job_spec.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'spec/lib/gitlab/ci/config') diff --git a/spec/lib/gitlab/ci/config/entry/job_spec.rb b/spec/lib/gitlab/ci/config/entry/job_spec.rb index 718098c364e..f1a2946acda 100644 --- a/spec/lib/gitlab/ci/config/entry/job_spec.rb +++ b/spec/lib/gitlab/ci/config/entry/job_spec.rb @@ -147,13 +147,13 @@ describe Gitlab::Ci::Config::Entry::Job do end end - context 'when it is lower than one' do - let(:config) { { parallel: 0 } } + context 'when it is lower than two' do + let(:config) { { parallel: 1 } } it 'returns error about value too low' do expect(entry).not_to be_valid expect(entry.errors) - .to include 'job parallel must be greater than or equal to 1' + .to include 'job parallel must be greater than or equal to 2' end end -- cgit v1.2.3 From 77715e47d633f3db3b6b58c1d67b4ddbe3668177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C4=8Cupi=C4=87?= Date: Thu, 1 Nov 2018 15:24:29 +0100 Subject: Add Normalizer specs --- spec/lib/gitlab/ci/config/normalizer_spec.rb | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 spec/lib/gitlab/ci/config/normalizer_spec.rb (limited to 'spec/lib/gitlab/ci/config') diff --git a/spec/lib/gitlab/ci/config/normalizer_spec.rb b/spec/lib/gitlab/ci/config/normalizer_spec.rb new file mode 100644 index 00000000000..5890d4f193c --- /dev/null +++ b/spec/lib/gitlab/ci/config/normalizer_spec.rb @@ -0,0 +1,36 @@ +require 'fast_spec_helper' + +describe Gitlab::Ci::Config::Normalizer do + let(:job_name) { :rspec } + let(:job_config) { { script: 'rspec', parallel: 5 } } + let(:config) { { job_name => job_config } } + + describe '.normalize_jobs' do + subject { described_class.normalize_jobs(config) } + + it 'does not have original job' do + is_expected.not_to include(job_name) + end + + it 'has parallelized jobs' do + job_names = described_class.send(:parallelize_job_names, job_name, 5).map(&:to_sym) + + is_expected.to include(*job_names) + end + + it 'parallelizes jobs with original config' do + original_config = config[job_name].except(:name) + configs = subject.values.map { |config| config.except(:name) } + + expect(configs).to all(eq(original_config)) + end + end + + describe '.parallelize_job_names' do + subject { described_class.send(:parallelize_job_names, job_name, 5) } + + it 'returns parallelized names' do + is_expected.to all(match(%r{#{job_name} \d+/\d+})) + end + end +end -- cgit v1.2.3 From 73e17446ef400a8f2a4e629c79749d7feb9866f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C4=8Cupi=C4=87?= Date: Thu, 1 Nov 2018 16:17:08 +0100 Subject: Move parallelized node index to job options --- spec/lib/gitlab/ci/config/normalizer_spec.rb | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'spec/lib/gitlab/ci/config') diff --git a/spec/lib/gitlab/ci/config/normalizer_spec.rb b/spec/lib/gitlab/ci/config/normalizer_spec.rb index 5890d4f193c..f1096cd3931 100644 --- a/spec/lib/gitlab/ci/config/normalizer_spec.rb +++ b/spec/lib/gitlab/ci/config/normalizer_spec.rb @@ -2,7 +2,7 @@ require 'fast_spec_helper' describe Gitlab::Ci::Config::Normalizer do let(:job_name) { :rspec } - let(:job_config) { { script: 'rspec', parallel: 5 } } + let(:job_config) { { script: 'rspec', parallel: 5, name: 'rspec' } } let(:config) { { job_name => job_config } } describe '.normalize_jobs' do @@ -13,14 +13,18 @@ describe Gitlab::Ci::Config::Normalizer do end it 'has parallelized jobs' do - job_names = described_class.send(:parallelize_job_names, job_name, 5).map(&:to_sym) + job_names = described_class.send(:parallelize_job_names, job_name, 5).map { |job_name, index| job_name.to_sym } is_expected.to include(*job_names) end + it 'sets job instance in options' do + expect(subject.values).to all(include(:instance)) + end + it 'parallelizes jobs with original config' do original_config = config[job_name].except(:name) - configs = subject.values.map { |config| config.except(:name) } + configs = subject.values.map { |config| config.except(:name, :instance) } expect(configs).to all(eq(original_config)) end @@ -30,7 +34,7 @@ describe Gitlab::Ci::Config::Normalizer do subject { described_class.send(:parallelize_job_names, job_name, 5) } it 'returns parallelized names' do - is_expected.to all(match(%r{#{job_name} \d+/\d+})) + expect(subject.map(&:first)).to all(match(%r{#{job_name} \d+/\d+})) end end end -- cgit v1.2.3 From 8a6a312db8148433fca78da0b5c9db8f966e16fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C4=8Cupi=C4=87?= Date: Fri, 2 Nov 2018 14:20:27 +0100 Subject: Make Rubocop and Danger happy --- spec/lib/gitlab/ci/config/normalizer_spec.rb | 2 ++ 1 file changed, 2 insertions(+) (limited to 'spec/lib/gitlab/ci/config') diff --git a/spec/lib/gitlab/ci/config/normalizer_spec.rb b/spec/lib/gitlab/ci/config/normalizer_spec.rb index f1096cd3931..48b8217f77c 100644 --- a/spec/lib/gitlab/ci/config/normalizer_spec.rb +++ b/spec/lib/gitlab/ci/config/normalizer_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'fast_spec_helper' describe Gitlab::Ci::Config::Normalizer do -- cgit v1.2.3 From 5fd8933d97b694fb8ae6a57acaae8fb4e7922e73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C4=8Cupi=C4=87?= Date: Mon, 5 Nov 2018 14:36:52 +0100 Subject: Use instance based approach for Normalizer --- spec/lib/gitlab/ci/config/normalizer_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec/lib/gitlab/ci/config') diff --git a/spec/lib/gitlab/ci/config/normalizer_spec.rb b/spec/lib/gitlab/ci/config/normalizer_spec.rb index 48b8217f77c..84f8ea3e861 100644 --- a/spec/lib/gitlab/ci/config/normalizer_spec.rb +++ b/spec/lib/gitlab/ci/config/normalizer_spec.rb @@ -8,7 +8,7 @@ describe Gitlab::Ci::Config::Normalizer do let(:config) { { job_name => job_config } } describe '.normalize_jobs' do - subject { described_class.normalize_jobs(config) } + subject { described_class.new(config).normalize_jobs } it 'does not have original job' do is_expected.not_to include(job_name) -- cgit v1.2.3 From 4b2b154c4e5ddfc397bc59f3a38b8f09d44903e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C4=8Cupi=C4=87?= Date: Mon, 5 Nov 2018 15:53:37 +0100 Subject: Refactor Gitlab::Ci::Config::Normalizer Use Hash#each_with_object to manipulate job hashes. --- spec/lib/gitlab/ci/config/normalizer_spec.rb | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'spec/lib/gitlab/ci/config') diff --git a/spec/lib/gitlab/ci/config/normalizer_spec.rb b/spec/lib/gitlab/ci/config/normalizer_spec.rb index 84f8ea3e861..2c8396199d0 100644 --- a/spec/lib/gitlab/ci/config/normalizer_spec.rb +++ b/spec/lib/gitlab/ci/config/normalizer_spec.rb @@ -8,7 +8,7 @@ describe Gitlab::Ci::Config::Normalizer do let(:config) { { job_name => job_config } } describe '.normalize_jobs' do - subject { described_class.new(config).normalize_jobs } + subject { described_class.normalize_jobs(config) } it 'does not have original job' do is_expected.not_to include(job_name) @@ -30,6 +30,16 @@ describe Gitlab::Ci::Config::Normalizer do expect(configs).to all(eq(original_config)) 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 describe '.parallelize_job_names' do -- cgit v1.2.3 From f48261a409f4f4d73118621330796ed92623f08e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C4=8Cupi=C4=87?= Date: Tue, 6 Nov 2018 18:23:45 +0100 Subject: Refactor Normalizer specs --- spec/lib/gitlab/ci/config/normalizer_spec.rb | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) (limited to 'spec/lib/gitlab/ci/config') diff --git a/spec/lib/gitlab/ci/config/normalizer_spec.rb b/spec/lib/gitlab/ci/config/normalizer_spec.rb index 2c8396199d0..2e3d3cc1b2b 100644 --- a/spec/lib/gitlab/ci/config/normalizer_spec.rb +++ b/spec/lib/gitlab/ci/config/normalizer_spec.rb @@ -15,7 +15,7 @@ describe Gitlab::Ci::Config::Normalizer do end it 'has parallelized jobs' do - job_names = described_class.send(:parallelize_job_names, job_name, 5).map { |job_name, index| job_name.to_sym } + job_names = [:"rspec 1/5", :"rspec 2/5", :"rspec 3/5", :"rspec 4/5", :"rspec 5/5"] is_expected.to include(*job_names) end @@ -35,18 +35,10 @@ describe Gitlab::Ci::Config::Normalizer 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) + job_names = ["rspec 1/5", "rspec 2/5", "rspec 3/5", "rspec 4/5", "rspec 5/5"] expect(subject[:other_job][:dependencies]).to include(*job_names) end end end - - describe '.parallelize_job_names' do - subject { described_class.send(:parallelize_job_names, job_name, 5) } - - it 'returns parallelized names' do - expect(subject.map(&:first)).to all(match(%r{#{job_name} \d+/\d+})) - end - end end -- cgit v1.2.3 From 4ba960c17d07e5863045c74fb554ebe71575d54d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C4=8Cupi=C4=87?= Date: Tue, 6 Nov 2018 18:35:44 +0100 Subject: Use instance based approach for Normalizer --- spec/lib/gitlab/ci/config/normalizer_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec/lib/gitlab/ci/config') diff --git a/spec/lib/gitlab/ci/config/normalizer_spec.rb b/spec/lib/gitlab/ci/config/normalizer_spec.rb index 2e3d3cc1b2b..65718d1a432 100644 --- a/spec/lib/gitlab/ci/config/normalizer_spec.rb +++ b/spec/lib/gitlab/ci/config/normalizer_spec.rb @@ -8,7 +8,7 @@ describe Gitlab::Ci::Config::Normalizer do let(:config) { { job_name => job_config } } describe '.normalize_jobs' do - subject { described_class.normalize_jobs(config) } + subject { described_class.new(config).normalize_jobs } it 'does not have original job' do is_expected.not_to include(job_name) -- cgit v1.2.3 From 7366c319df12900e40dbed679feab146d1092d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C4=8Cupi=C4=87?= Date: Tue, 6 Nov 2018 18:56:06 +0100 Subject: Add additional specs for Normalizer --- spec/lib/gitlab/ci/config/normalizer_spec.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'spec/lib/gitlab/ci/config') diff --git a/spec/lib/gitlab/ci/config/normalizer_spec.rb b/spec/lib/gitlab/ci/config/normalizer_spec.rb index 65718d1a432..7c558cacdd5 100644 --- a/spec/lib/gitlab/ci/config/normalizer_spec.rb +++ b/spec/lib/gitlab/ci/config/normalizer_spec.rb @@ -31,6 +31,16 @@ describe Gitlab::Ci::Config::Normalizer do expect(configs).to all(eq(original_config)) end + context 'when there is a job with a slash in it' do + let(:job_name) { :"rspec 35/2" } + + it 'properly parallelizes job names' do + job_names = [:"rspec 35/2 1/5", :"rspec 35/2 2/5", :"rspec 35/2 3/5", :"rspec 35/2 4/5", :"rspec 35/2 5/5"] + + is_expected.to include(*job_names) + 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] } } } @@ -39,6 +49,10 @@ describe Gitlab::Ci::Config::Normalizer do expect(subject[:other_job][:dependencies]).to include(*job_names) end + + it 'does not include original job name in dependencies' do + expect(subject[:other_job][:dependencies]).not_to include(job_name) + end end end end -- cgit v1.2.3