diff --git a/lib/gitlab/ci/build/policy/kubernetes.rb b/lib/gitlab/ci/build/policy/kubernetes.rb index b20d374288fa7a3651defeaba3e29d4c4c9c85b9..29a7fa2492126bb2700e8d3c85c60a83117f75cc 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) + def satisfied_by?(pipeline, _attributes = 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 eadc0948d2f7b2f83190983839a111acb835535f..379671f1f4ff32a55f46c379ba88a57ab6e61e2c 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) + def satisfied_by?(pipeline, _attributes = 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 c317291f29df332b45188caaf599fdcdaf573067..31c444b55f5b5aff5dd628a44db0df85d47d580c 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) + def satisfied_by?(pipeline, attributes = nil) raise NotImplementedError end end diff --git a/lib/gitlab/ci/build/policy/variables.rb b/lib/gitlab/ci/build/policy/variables.rb index eeb0f3f2cb7f794c1b09ac9dc4d531590754b0a7..7c0fe6f367d8b7e5e6a7be2b1b7c4e6ecc31c20a 100644 --- a/lib/gitlab/ci/build/policy/variables.rb +++ b/lib/gitlab/ci/build/policy/variables.rb @@ -7,13 +7,13 @@ module Gitlab @expressions = Array(expressions) end - def satisfied_by?(pipeline) + def satisfied_by?(pipeline, attributes) statements = @expressions.map do |statement| ::Gitlab::Ci::Pipeline::Expression::Statement .new(statement, pipeline) end - statements.any? { |statement| statement.truthful? } + statements.any?(&:truthful?) end end end diff --git a/lib/gitlab/ci/pipeline/expression/statement.rb b/lib/gitlab/ci/pipeline/expression/statement.rb index 9c0d87ba4fb214f47f6e1d73e9c7525c39957e14..21675065c2b06918be2e549e75da8c0319114374 100644 --- a/lib/gitlab/ci/pipeline/expression/statement.rb +++ b/lib/gitlab/ci/pipeline/expression/statement.rb @@ -19,7 +19,13 @@ module Gitlab return if pipeline.nil? - @variables = pipeline.variables.map do |variable| + # temporary refactoring stubs + # + @variables = pipeline.project.predefined_variables.map do |variable| + [variable.fetch(:key), variable.fetch(:value)] + end + + @variables += pipeline.variables.map do |variable| [variable.key, variable.value] end diff --git a/lib/gitlab/ci/yaml_processor.rb b/lib/gitlab/ci/yaml_processor.rb index a7285ac8f9d03e1f196960f3587442da9d19a9da..d1da055e42ad2f41d45e9beff0eca9fa7abbc9f2 100644 --- a/lib/gitlab/ci/yaml_processor.rb +++ b/lib/gitlab/ci/yaml_processor.rb @@ -54,19 +54,21 @@ module Gitlab end def pipeline_stage_builds(stage, pipeline) - selected_jobs = @jobs.select do |_, job| - next unless job[:stage] == stage + builds_attributes = @jobs.map do |job| + build_attributes(job[:name]) + end + + builds_attributes.select do |_, attributes| + next unless build[:stage] == stage only_specs = Gitlab::Ci::Build::Policy .fabricate(job.fetch(:only, {})) except_specs = Gitlab::Ci::Build::Policy .fabricate(job.fetch(:except, {})) - only_specs.all? { |spec| spec.satisfied_by?(pipeline) } && - except_specs.none? { |spec| spec.satisfied_by?(pipeline) } + only_specs.all? { |spec| spec.satisfied_by?(pipeline, attributes) } && + except_specs.none? { |spec| spec.satisfied_by?(pipeline, attributes) } end - - selected_jobs.map { |_, job| build_attributes(job[:name]) } end def stage_seeds(pipeline) diff --git a/spec/lib/gitlab/ci/build/policy/variables_spec.rb b/spec/lib/gitlab/ci/build/policy/variables_spec.rb index 6596237ff9c0adeee11f640a130b073c6906c822..95a3ab8b329a47b9d311225503454c833badfff6 100644 --- a/spec/lib/gitlab/ci/build/policy/variables_spec.rb +++ b/spec/lib/gitlab/ci/build/policy/variables_spec.rb @@ -2,6 +2,7 @@ require 'spec_helper' describe Gitlab::Ci::Build::Policy::Variables do let(:pipeline) { build(:ci_pipeline, ref: 'master') } + let(:attributes) { double(:attributes) } before do pipeline.variables.build(key: 'CI_PROJECT_NAME', value: '') @@ -11,31 +12,31 @@ describe Gitlab::Ci::Build::Policy::Variables do it 'is satisfied by a defined and existing variable' do policy = described_class.new(['$CI_PROJECT_ID', '$UNDEFINED']) - expect(policy).to be_satisfied_by(pipeline) + expect(policy).to be_satisfied_by(pipeline, attributes) end it 'is not satisfied by an overriden empty variable' do policy = described_class.new(['$CI_PROJECT_NAME']) - expect(policy).not_to be_satisfied_by(pipeline) + expect(policy).not_to be_satisfied_by(pipeline, attributes) end it 'is satisfied by a truthy pipeline expression' do policy = described_class.new([%($CI_PIPELINE_SOURCE == "#{pipeline.source}")]) - expect(policy).to be_satisfied_by(pipeline) + expect(policy).to be_satisfied_by(pipeline, attributes) end it 'is not satisfied by a falsy pipeline expression' do policy = described_class.new([%($CI_PIPELINE_SOURCE == "invalid source")]) - expect(policy).not_to be_satisfied_by(pipeline) + expect(policy).not_to be_satisfied_by(pipeline, attributes) end it 'is satisfied by a truthy expression using undefined variable' do policy = described_class.new(['$UNDEFINED', '$UNDEFINED == null']) - expect(policy).to be_satisfied_by(pipeline) + expect(policy).to be_satisfied_by(pipeline, attributes) end end end