Commit 8fc2fbb6 authored by Grzegorz Bizon's avatar Grzegorz Bizon

Merge branch 'limit-amount-of-needs' into 'master'

Add `ci_dag_limit_needs`

See merge request gitlab-org/gitlab-ce!31803
parents ecee476a fcc20fde
...@@ -9,6 +9,10 @@ module Gitlab ...@@ -9,6 +9,10 @@ module Gitlab
delegate :dig, to: :@attributes delegate :dig, to: :@attributes
# When the `ci_dag_limit_needs` is enabled it uses the lower limit
LOW_NEEDS_LIMIT = 5
HARD_NEEDS_LIMIT = 50
def initialize(pipeline, attributes, previous_stages) def initialize(pipeline, attributes, previous_stages)
@pipeline = pipeline @pipeline = pipeline
@attributes = attributes @attributes = attributes
...@@ -77,9 +81,15 @@ module Gitlab ...@@ -77,9 +81,15 @@ module Gitlab
end end
def needs_errors def needs_errors
return unless Feature.enabled?(:ci_dag_support, @pipeline.project)
return if @needs_attributes.nil? return if @needs_attributes.nil?
if @needs_attributes.size > max_needs_allowed
return [
"#{name}: one job can only need #{max_needs_allowed} others, but you have listed #{@needs_attributes.size}. " \
"See needs keyword documentation for more details"
]
end
@needs_attributes.flat_map do |need| @needs_attributes.flat_map do |need|
result = @previous_stages.any? do |stage| result = @previous_stages.any? do |stage|
stage.seeds_names.include?(need[:name]) stage.seeds_names.include?(need[:name])
...@@ -88,6 +98,14 @@ module Gitlab ...@@ -88,6 +98,14 @@ module Gitlab
"#{name}: needs '#{need[:name]}'" unless result "#{name}: needs '#{need[:name]}'" unless result
end.compact end.compact
end end
def max_needs_allowed
if Feature.enabled?(:ci_dag_limit_needs, @project, default_enabled: true)
LOW_NEEDS_LIMIT
else
HARD_NEEDS_LIMIT
end
end
end end
end end
end end
......
...@@ -386,12 +386,16 @@ describe Gitlab::Ci::Pipeline::Seed::Build do ...@@ -386,12 +386,16 @@ describe Gitlab::Ci::Pipeline::Seed::Build do
describe 'applying needs: dependency' do describe 'applying needs: dependency' do
subject { seed_build } subject { seed_build }
let(:needs_count) { 1 }
let(:needs_attributes) do
Array.new(needs_count, name: 'build')
end
let(:attributes) do let(:attributes) do
{ {
name: 'rspec', name: 'rspec',
needs_attributes: [{ needs_attributes: needs_attributes
name: 'build'
}]
} }
end end
...@@ -429,5 +433,31 @@ describe Gitlab::Ci::Pipeline::Seed::Build do ...@@ -429,5 +433,31 @@ describe Gitlab::Ci::Pipeline::Seed::Build do
expect(subject.errors).to be_empty expect(subject.errors).to be_empty
end end
end end
context 'when lower limit of needs is reached' do
before do
stub_feature_flags(ci_dag_limit_needs: true)
end
let(:needs_count) { described_class::LOW_NEEDS_LIMIT + 1 }
it "returns an error" do
expect(subject.errors).to contain_exactly(
"rspec: one job can only need 5 others, but you have listed 6. See needs keyword documentation for more details")
end
end
context 'when upper limit of needs is reached' do
before do
stub_feature_flags(ci_dag_limit_needs: false)
end
let(:needs_count) { described_class::HARD_NEEDS_LIMIT + 1 }
it "returns an error" do
expect(subject.errors).to contain_exactly(
"rspec: one job can only need 50 others, but you have listed 51. See needs keyword documentation for more details")
end
end
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