Make it possible to inherit global ci config nodes
This commit is contained in:
parent
30f58cf392
commit
62f704c5ad
|
|
@ -90,6 +90,8 @@ module Gitlab
|
|||
|
||||
@entries.delete(:type)
|
||||
end
|
||||
|
||||
inherit!(deps)
|
||||
end
|
||||
|
||||
def name
|
||||
|
|
@ -102,6 +104,19 @@ module Gitlab
|
|||
|
||||
private
|
||||
|
||||
def inherit!(deps)
|
||||
return unless deps
|
||||
|
||||
self.class.nodes.each_key do |key|
|
||||
global_entry = deps[key]
|
||||
job_entry = @entries[key]
|
||||
|
||||
if global_entry.specified? && !job_entry.specified?
|
||||
@entries[key] = global_entry
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def to_hash
|
||||
{ name: name,
|
||||
before_script: before_script,
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ describe Gitlab::Ci::Config::Node::Global do
|
|||
end
|
||||
|
||||
context 'when hash is valid' do
|
||||
context 'when all entries defined' do
|
||||
context 'when some entries defined' do
|
||||
let(:hash) do
|
||||
{ before_script: ['ls', 'pwd'],
|
||||
image: 'ruby:2.2',
|
||||
|
|
@ -24,7 +24,7 @@ describe Gitlab::Ci::Config::Node::Global do
|
|||
stages: ['build', 'pages'],
|
||||
cache: { key: 'k', untracked: true, paths: ['public/'] },
|
||||
rspec: { script: %w[rspec ls] },
|
||||
spinach: { script: 'spinach' } }
|
||||
spinach: { before_script: [], variables: {}, script: 'spinach' } }
|
||||
end
|
||||
|
||||
describe '#compose!' do
|
||||
|
|
@ -76,6 +76,12 @@ describe Gitlab::Ci::Config::Node::Global do
|
|||
context 'when composed' do
|
||||
before { global.compose! }
|
||||
|
||||
describe '#errors' do
|
||||
it 'has no errors' do
|
||||
expect(global.errors).to be_empty
|
||||
end
|
||||
end
|
||||
|
||||
describe '#before_script' do
|
||||
it 'returns correct script' do
|
||||
expect(global.before_script).to eq ['ls', 'pwd']
|
||||
|
|
@ -135,12 +141,24 @@ describe Gitlab::Ci::Config::Node::Global do
|
|||
describe '#jobs' do
|
||||
it 'returns jobs configuration' do
|
||||
expect(global.jobs).to eq(
|
||||
rspec: { name: :rspec,
|
||||
script: %w[rspec ls],
|
||||
stage: 'test' },
|
||||
rspec: { script: %w[rspec ls],
|
||||
name: :rspec,
|
||||
before_script: ['ls', 'pwd'],
|
||||
image: 'ruby:2.2',
|
||||
services: ['postgres:9.1', 'mysql:5.5'],
|
||||
stage: 'test',
|
||||
cache: { key: 'k', untracked: true, paths: ['public/'] },
|
||||
variables: { VAR: 'value' },
|
||||
after_script: ['make clean'] },
|
||||
spinach: { name: :spinach,
|
||||
script: %w[spinach],
|
||||
stage: 'test' }
|
||||
before_script: [],
|
||||
image: 'ruby:2.2',
|
||||
services: ['postgres:9.1', 'mysql:5.5'],
|
||||
stage: 'test',
|
||||
cache: { key: 'k', untracked: true, paths: ['public/'] },
|
||||
variables: {},
|
||||
after_script: ['make clean'] },
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -3,9 +3,9 @@ require 'spec_helper'
|
|||
describe Gitlab::Ci::Config::Node::Job do
|
||||
let(:entry) { described_class.new(config, name: :rspec) }
|
||||
|
||||
before { entry.compose! }
|
||||
|
||||
describe 'validations' do
|
||||
before { entry.compose! }
|
||||
|
||||
context 'when entry config value is correct' do
|
||||
let(:config) { { script: 'rspec' } }
|
||||
|
||||
|
|
@ -60,6 +60,8 @@ describe Gitlab::Ci::Config::Node::Job do
|
|||
end
|
||||
|
||||
describe '#value' do
|
||||
before { entry.compose! }
|
||||
|
||||
context 'when entry is correct' do
|
||||
let(:config) do
|
||||
{ before_script: %w[ls pwd],
|
||||
|
|
@ -83,4 +85,41 @@ describe Gitlab::Ci::Config::Node::Job do
|
|||
expect(entry).to be_relevant
|
||||
end
|
||||
end
|
||||
|
||||
describe '#compose!' do
|
||||
let(:unspecified) { double('unspecified', 'specified?' => false) }
|
||||
|
||||
let(:specified) do
|
||||
double('specified', 'specified?' => true, value: 'specified')
|
||||
end
|
||||
|
||||
let(:deps) { spy('deps', '[]' => unspecified) }
|
||||
|
||||
context 'when job config overrides global config' do
|
||||
before { entry.compose!(deps) }
|
||||
|
||||
let(:config) do
|
||||
{ image: 'some_image', cache: { key: 'test' } }
|
||||
end
|
||||
|
||||
it 'overrides global config' do
|
||||
expect(entry[:image].value).to eq 'some_image'
|
||||
expect(entry[:cache].value).to eq(key: 'test')
|
||||
end
|
||||
end
|
||||
|
||||
context 'when job config does not override global config' do
|
||||
before do
|
||||
allow(deps).to receive('[]').with(:image).and_return(specified)
|
||||
entry.compose!(deps)
|
||||
end
|
||||
|
||||
let(:config) { { script: 'ls', cache: { key: 'test' } } }
|
||||
|
||||
it 'uses config from global entry' do
|
||||
expect(entry[:image].value).to eq 'specified'
|
||||
expect(entry[:cache].value).to eq(key: 'test')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Reference in New Issue