summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKamil Trzciński <ayufan@ayufan.eu>2019-08-14 11:09:11 +0200
committerKamil Trzciński <ayufan@ayufan.eu>2019-08-14 15:48:16 +0200
commitfcc20fde8346a9c2dd9e79ded2557c8058ac1e22 (patch)
treeb5a61f9ac0a81abf7958cc89819453d4b80bcaad
parentd1e80af6035d6f726cb75dde00b6a6bde256b5a3 (diff)
downloadgitlab-ce-limit-amount-of-needs.tar.gz
Add `ci_dag_limit_needs` feature flaglimit-amount-of-needs
This makes to limit `needs:` to 5 by default. Allow to increase the limit to 50 with disable of FF.
-rw-r--r--lib/gitlab/ci/pipeline/seed/build.rb20
-rw-r--r--spec/lib/gitlab/ci/pipeline/seed/build_spec.rb36
2 files changed, 52 insertions, 4 deletions
diff --git a/lib/gitlab/ci/pipeline/seed/build.rb b/lib/gitlab/ci/pipeline/seed/build.rb
index 32086735556..b0ce7457926 100644
--- a/lib/gitlab/ci/pipeline/seed/build.rb
+++ b/lib/gitlab/ci/pipeline/seed/build.rb
@@ -9,6 +9,10 @@ module Gitlab
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)
@pipeline = pipeline
@attributes = attributes
@@ -77,9 +81,15 @@ module Gitlab
end
def needs_errors
- return unless Feature.enabled?(:ci_dag_support, @pipeline.project)
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|
result = @previous_stages.any? do |stage|
stage.seeds_names.include?(need[:name])
@@ -88,6 +98,14 @@ module Gitlab
"#{name}: needs '#{need[:name]}'" unless result
end.compact
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
diff --git a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
index e0fbd2e7369..5d4dec5899a 100644
--- a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
@@ -386,12 +386,16 @@ describe Gitlab::Ci::Pipeline::Seed::Build do
describe 'applying needs: dependency' do
subject { seed_build }
+ let(:needs_count) { 1 }
+
+ let(:needs_attributes) do
+ Array.new(needs_count, name: 'build')
+ end
+
let(:attributes) do
{
name: 'rspec',
- needs_attributes: [{
- name: 'build'
- }]
+ needs_attributes: needs_attributes
}
end
@@ -429,5 +433,31 @@ describe Gitlab::Ci::Pipeline::Seed::Build do
expect(subject.errors).to be_empty
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