Commit 583544d0 authored by Kamil Trzciński's avatar Kamil Trzciński

Require `stage:` to be set with `needs:`

Since we are unsure what would be the behavior of `stage:`
when we work on DAG. Let's make `stage:` to be required
today with `needs:`.
parent 1438119d
...@@ -16,8 +16,11 @@ module Gitlab ...@@ -16,8 +16,11 @@ module Gitlab
dependencies needs before_script after_script variables dependencies needs before_script after_script variables
environment coverage retry parallel extends].freeze environment coverage retry parallel extends].freeze
REQUIRED_BY_NEEDS = %i[stage].freeze
validations do validations do
validates :config, allowed_keys: ALLOWED_KEYS validates :config, allowed_keys: ALLOWED_KEYS
validates :config, required_keys: REQUIRED_BY_NEEDS, if: :has_needs?
validates :config, presence: true validates :config, presence: true
validates :script, presence: true validates :script, presence: true
validates :name, presence: true validates :name, presence: true
......
...@@ -18,6 +18,10 @@ module Gitlab ...@@ -18,6 +18,10 @@ module Gitlab
config[attribute] config[attribute]
end end
define_method("has_#{attribute}?") do
config.is_a?(Hash) && config.key?(attribute)
end
end end
end end
end end
......
...@@ -26,6 +26,17 @@ module Gitlab ...@@ -26,6 +26,17 @@ module Gitlab
end end
end end
class RequiredKeysValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
present_keys = options[:in] - value.try(:keys).to_a
if present_keys.any?
record.errors.add(attribute, "missing required keys: " +
present_keys.join(', '))
end
end
end
class AllowedValuesValidator < ActiveModel::EachValidator class AllowedValuesValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value) def validate_each(record, attribute, value)
unless options[:in].include?(value.to_s) unless options[:in].include?(value.to_s)
......
...@@ -89,14 +89,23 @@ describe Gitlab::Ci::Config::Entry::Job do ...@@ -89,14 +89,23 @@ describe Gitlab::Ci::Config::Entry::Job do
context 'when has needs' do context 'when has needs' do
let(:config) do let(:config) do
{ script: 'echo', needs: ['another-job'] } {
stage: 'test',
script: 'echo',
needs: ['another-job']
}
end end
it { expect(entry).to be_valid } it { expect(entry).to be_valid }
context 'when has dependencies' do context 'when has dependencies' do
let(:config) do let(:config) do
{ script: 'echo', dependencies: ['another-job'], needs: ['another-job'] } {
stage: 'test',
script: 'echo',
dependencies: ['another-job'],
needs: ['another-job']
}
end end
it { expect(entry).to be_valid } it { expect(entry).to be_valid }
...@@ -256,7 +265,11 @@ describe Gitlab::Ci::Config::Entry::Job do ...@@ -256,7 +265,11 @@ describe Gitlab::Ci::Config::Entry::Job do
context 'when has needs' do context 'when has needs' do
context 'that are not a array of strings' do context 'that are not a array of strings' do
let(:config) do let(:config) do
{ script: 'echo', needs: 'build-job' } {
stage: 'test',
script: 'echo',
needs: 'build-job'
}
end end
it 'returns error about invalid type' do it 'returns error about invalid type' do
...@@ -267,7 +280,12 @@ describe Gitlab::Ci::Config::Entry::Job do ...@@ -267,7 +280,12 @@ describe Gitlab::Ci::Config::Entry::Job do
context 'when have dependencies that are not subset of needs' do context 'when have dependencies that are not subset of needs' do
let(:config) do let(:config) do
{ script: 'echo', dependencies: ['another-job'], needs: ['build-job'] } {
stage: 'test',
script: 'echo',
dependencies: ['another-job'],
needs: ['build-job']
}
end end
it 'returns error about invalid data' do it 'returns error about invalid data' do
...@@ -275,6 +293,20 @@ describe Gitlab::Ci::Config::Entry::Job do ...@@ -275,6 +293,20 @@ describe Gitlab::Ci::Config::Entry::Job do
expect(entry.errors).to include 'job dependencies the another-job should be part of needs' expect(entry.errors).to include 'job dependencies the another-job should be part of needs'
end end
end end
context 'when stage: is missing' do
let(:config) do
{
script: 'echo',
needs: ['build-job']
}
end
it 'returns error about invalid data' do
expect(entry).not_to be_valid
expect(entry.errors).to include 'job config missing required keys: stage'
end
end
end end
end end
end end
......
...@@ -25,7 +25,9 @@ describe Gitlab::Config::Entry::Attributable do ...@@ -25,7 +25,9 @@ describe Gitlab::Config::Entry::Attributable do
end end
it 'returns the value of config' do it 'returns the value of config' do
expect(instance).to have_name
expect(instance.name).to eq 'some name' expect(instance.name).to eq 'some name'
expect(instance).to have_test
expect(instance.test).to eq 'some test' expect(instance.test).to eq 'some test'
end end
...@@ -42,6 +44,7 @@ describe Gitlab::Config::Entry::Attributable do ...@@ -42,6 +44,7 @@ describe Gitlab::Config::Entry::Attributable do
end end
it 'returns nil' do it 'returns nil' do
expect(instance).not_to have_test
expect(instance.test).to be_nil expect(instance.test).to be_nil
end end
end end
......
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