diff options
author | Kamil Trzciński <ayufan@ayufan.eu> | 2019-08-14 11:09:11 +0200 |
---|---|---|
committer | Kamil Trzciński <ayufan@ayufan.eu> | 2019-08-14 15:48:16 +0200 |
commit | fcc20fde8346a9c2dd9e79ded2557c8058ac1e22 (patch) | |
tree | b5a61f9ac0a81abf7958cc89819453d4b80bcaad | |
parent | d1e80af6035d6f726cb75dde00b6a6bde256b5a3 (diff) | |
download | gitlab-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.rb | 20 | ||||
-rw-r--r-- | spec/lib/gitlab/ci/pipeline/seed/build_spec.rb | 36 |
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 |