diff --git a/lib/gitlab/ci/build/policy/kubernetes.rb b/lib/gitlab/ci/build/policy/kubernetes.rb index 5d2c116366579151b64f2763eebe209482255d86..782f6c4c0af28741b43fc7e7eef73fb0602c2638 100644 --- a/lib/gitlab/ci/build/policy/kubernetes.rb +++ b/lib/gitlab/ci/build/policy/kubernetes.rb @@ -9,7 +9,7 @@ module Gitlab end end - def satisfied_by?(pipeline, _build = nil) + def satisfied_by?(pipeline, seed = nil) pipeline.has_kubernetes_active? end end diff --git a/lib/gitlab/ci/build/policy/refs.rb b/lib/gitlab/ci/build/policy/refs.rb index 9bee5ba43c007b790751fb4a3e0c119a87b35c3f..4aa5dc89f47aaf012a2d89b11bb22b2c5145f76b 100644 --- a/lib/gitlab/ci/build/policy/refs.rb +++ b/lib/gitlab/ci/build/policy/refs.rb @@ -7,7 +7,7 @@ module Gitlab @patterns = Array(refs) end - def satisfied_by?(pipeline, _build = nil) + def satisfied_by?(pipeline, seed = nil) @patterns.any? do |pattern| pattern, path = pattern.split('@', 2) diff --git a/lib/gitlab/ci/build/policy/specification.rb b/lib/gitlab/ci/build/policy/specification.rb index 937d8504ef7bccbaf29721dc45939ba81c6906e1..f09ba42c074276f9e8ac8e12c5ab3ae5294613b2 100644 --- a/lib/gitlab/ci/build/policy/specification.rb +++ b/lib/gitlab/ci/build/policy/specification.rb @@ -15,7 +15,7 @@ module Gitlab @spec = spec end - def satisfied_by?(pipeline, build = nil) + def satisfied_by?(pipeline, seed = nil) raise NotImplementedError end end diff --git a/lib/gitlab/ci/build/policy/variables.rb b/lib/gitlab/ci/build/policy/variables.rb index e5fec4469b39944616ac0158e9a5e892b58c5181..2c7d8aba43bd0baa7b7445fd1ce0e5037929b9bb 100644 --- a/lib/gitlab/ci/build/policy/variables.rb +++ b/lib/gitlab/ci/build/policy/variables.rb @@ -7,9 +7,9 @@ module Gitlab @expressions = Array(expressions) end - def satisfied_by?(pipeline, build) + def satisfied_by?(pipeline, seed) variables = Gitlab::Ci::Variables::Collection - .new(build.simple_variables) + .new(seed.to_resource.simple_variables) .to_hash statements = @expressions.map do |statement| diff --git a/lib/gitlab/ci/pipeline/seed/build.rb b/lib/gitlab/ci/pipeline/seed/build.rb index 7cd7c864448dcad57b185590144d33f1c589fb63..dd2b277e5adf3001689a6ed84468e61b241cdc31 100644 --- a/lib/gitlab/ci/pipeline/seed/build.rb +++ b/lib/gitlab/ci/pipeline/seed/build.rb @@ -11,21 +11,24 @@ module Gitlab @pipeline = pipeline @attributes = attributes - @only = attributes.delete(:only) - @except = attributes.delete(:except) + @only = Gitlab::Ci::Build::Policy + .fabricate(attributes.delete(:only)) + @except = Gitlab::Ci::Build::Policy + .fabricate(attributes.delete(:except)) end + # TODO, use pipeline.user ? + # def user=(current_user) @attributes.merge!(user: current_user) end def included? + # TODO specs for passing a seed object for lazy resource evaluation + # strong_memoize(:inclusion) do - only_specs = Gitlab::Ci::Build::Policy.fabricate(@only) - except_specs = Gitlab::Ci::Build::Policy.fabricate(@except) - - only_specs.all? { |spec| spec.satisfied_by?(@pipeline) } && - except_specs.none? { |spec| spec.satisfied_by?(@pipeline) } + @only.all? { |spec| spec.satisfied_by?(@pipeline, self) } && + @except.none? { |spec| spec.satisfied_by?(@pipeline, self) } end end diff --git a/spec/lib/gitlab/ci/yaml_processor_spec.rb b/spec/lib/gitlab/ci/yaml_processor_spec.rb index e1cc826e0d906fc5c2636299ad17359d3f98380e..88d8fe2c661478dfea103ed6dadb5d3808ea511a 100644 --- a/spec/lib/gitlab/ci/yaml_processor_spec.rb +++ b/spec/lib/gitlab/ci/yaml_processor_spec.rb @@ -182,22 +182,6 @@ module Gitlab it 'returns stages seed attributes' do expect(subject.stages_attributes).to eq attributes end - - context 'when variables policy is specified' do - let(:config) do - YAML.dump(unit: { script: 'minitest', only: { variables: ['$CI_PIPELINE_SOURCE'] } }, - feature: { script: 'spinach', only: { variables: ['$UNDEFINED'] } }) - end - - let(:pipeline) { create(:ci_empty_pipeline) } - - it 'returns stage seeds only when variables expression is truthy' do - seeds = subject.stage_seeds(pipeline) - - expect(seeds.size).to eq 1 - expect(seeds.first.builds.dig(0, :name)).to eq 'unit' - end - end end describe 'only / except policies validations' do diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb index 92f00cfbc1916943226fdf3490536cd38b8ce63f..dd94515b0a454d38e81074ec65ecdaa715ebf5bd 100644 --- a/spec/models/ci/pipeline_spec.rb +++ b/spec/models/ci/pipeline_spec.rb @@ -346,6 +346,20 @@ describe Ci::Pipeline, :mailer do end end end + + context 'when variables policy is specified' do + let(:config) do + { unit: { script: 'minitest', only: { variables: ['$CI_PIPELINE_SOURCE'] } }, + feature: { script: 'spinach', only: { variables: ['$UNDEFINED'] } } } + end + + it 'returns stage seeds only when variables expression is truthy' do + seeds = pipeline.stage_seeds + + expect(seeds.size).to eq 1 + expect(seeds.dig(0, 0, :name)).to eq 'unit' + end + end end describe '#seeds_size' do