From b6e4e449fbd2f844736e9121067c3cfea2cb2933 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Fri, 23 Mar 2018 13:56:16 +0100 Subject: Integrate build seeds with variables expressions policy --- lib/gitlab/ci/build/policy/kubernetes.rb | 2 +- lib/gitlab/ci/build/policy/refs.rb | 2 +- lib/gitlab/ci/build/policy/specification.rb | 2 +- lib/gitlab/ci/build/policy/variables.rb | 4 ++-- lib/gitlab/ci/pipeline/seed/build.rb | 17 ++++++++++------- spec/lib/gitlab/ci/yaml_processor_spec.rb | 16 ---------------- spec/models/ci/pipeline_spec.rb | 14 ++++++++++++++ 7 files changed, 29 insertions(+), 28 deletions(-) diff --git a/lib/gitlab/ci/build/policy/kubernetes.rb b/lib/gitlab/ci/build/policy/kubernetes.rb index 5d2c1163665..782f6c4c0af 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 9bee5ba43c0..4aa5dc89f47 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 937d8504ef7..f09ba42c074 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 e5fec4469b3..2c7d8aba43b 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 7cd7c864448..dd2b277e5ad 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 e1cc826e0d9..88d8fe2c661 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 92f00cfbc19..dd94515b0a4 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 -- cgit v1.2.1