Commit 9147a5f8 authored by Grzegorz Bizon's avatar Grzegorz Bizon

Add support for checking attributes in build policies

parent 42b2abbe
...@@ -9,7 +9,7 @@ module Gitlab ...@@ -9,7 +9,7 @@ module Gitlab
end end
end end
def satisfied_by?(pipeline) def satisfied_by?(pipeline, _attributes = nil)
pipeline.has_kubernetes_active? pipeline.has_kubernetes_active?
end end
end end
......
...@@ -7,7 +7,7 @@ module Gitlab ...@@ -7,7 +7,7 @@ module Gitlab
@patterns = Array(refs) @patterns = Array(refs)
end end
def satisfied_by?(pipeline) def satisfied_by?(pipeline, _attributes = nil)
@patterns.any? do |pattern| @patterns.any? do |pattern|
pattern, path = pattern.split('@', 2) pattern, path = pattern.split('@', 2)
......
...@@ -15,7 +15,7 @@ module Gitlab ...@@ -15,7 +15,7 @@ module Gitlab
@spec = spec @spec = spec
end end
def satisfied_by?(pipeline) def satisfied_by?(pipeline, attributes = nil)
raise NotImplementedError raise NotImplementedError
end end
end end
......
...@@ -7,13 +7,13 @@ module Gitlab ...@@ -7,13 +7,13 @@ module Gitlab
@expressions = Array(expressions) @expressions = Array(expressions)
end end
def satisfied_by?(pipeline) def satisfied_by?(pipeline, attributes)
statements = @expressions.map do |statement| statements = @expressions.map do |statement|
::Gitlab::Ci::Pipeline::Expression::Statement ::Gitlab::Ci::Pipeline::Expression::Statement
.new(statement, pipeline) .new(statement, pipeline)
end end
statements.any? { |statement| statement.truthful? } statements.any?(&:truthful?)
end end
end end
end end
......
...@@ -19,7 +19,13 @@ module Gitlab ...@@ -19,7 +19,13 @@ module Gitlab
return if pipeline.nil? 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] [variable.key, variable.value]
end end
......
...@@ -54,19 +54,21 @@ module Gitlab ...@@ -54,19 +54,21 @@ module Gitlab
end end
def pipeline_stage_builds(stage, pipeline) def pipeline_stage_builds(stage, pipeline)
selected_jobs = @jobs.select do |_, job| builds_attributes = @jobs.map do |job|
next unless job[:stage] == stage build_attributes(job[:name])
end
builds_attributes.select do |_, attributes|
next unless build[:stage] == stage
only_specs = Gitlab::Ci::Build::Policy only_specs = Gitlab::Ci::Build::Policy
.fabricate(job.fetch(:only, {})) .fabricate(job.fetch(:only, {}))
except_specs = Gitlab::Ci::Build::Policy except_specs = Gitlab::Ci::Build::Policy
.fabricate(job.fetch(:except, {})) .fabricate(job.fetch(:except, {}))
only_specs.all? { |spec| spec.satisfied_by?(pipeline) } && only_specs.all? { |spec| spec.satisfied_by?(pipeline, attributes) } &&
except_specs.none? { |spec| spec.satisfied_by?(pipeline) } except_specs.none? { |spec| spec.satisfied_by?(pipeline, attributes) }
end end
selected_jobs.map { |_, job| build_attributes(job[:name]) }
end end
def stage_seeds(pipeline) def stage_seeds(pipeline)
......
...@@ -2,6 +2,7 @@ require 'spec_helper' ...@@ -2,6 +2,7 @@ require 'spec_helper'
describe Gitlab::Ci::Build::Policy::Variables do describe Gitlab::Ci::Build::Policy::Variables do
let(:pipeline) { build(:ci_pipeline, ref: 'master') } let(:pipeline) { build(:ci_pipeline, ref: 'master') }
let(:attributes) { double(:attributes) }
before do before do
pipeline.variables.build(key: 'CI_PROJECT_NAME', value: '') pipeline.variables.build(key: 'CI_PROJECT_NAME', value: '')
...@@ -11,31 +12,31 @@ describe Gitlab::Ci::Build::Policy::Variables do ...@@ -11,31 +12,31 @@ describe Gitlab::Ci::Build::Policy::Variables do
it 'is satisfied by a defined and existing variable' do it 'is satisfied by a defined and existing variable' do
policy = described_class.new(['$CI_PROJECT_ID', '$UNDEFINED']) policy = described_class.new(['$CI_PROJECT_ID', '$UNDEFINED'])
expect(policy).to be_satisfied_by(pipeline) expect(policy).to be_satisfied_by(pipeline, attributes)
end end
it 'is not satisfied by an overriden empty variable' do it 'is not satisfied by an overriden empty variable' do
policy = described_class.new(['$CI_PROJECT_NAME']) 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 end
it 'is satisfied by a truthy pipeline expression' do it 'is satisfied by a truthy pipeline expression' do
policy = described_class.new([%($CI_PIPELINE_SOURCE == "#{pipeline.source}")]) 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 end
it 'is not satisfied by a falsy pipeline expression' do it 'is not satisfied by a falsy pipeline expression' do
policy = described_class.new([%($CI_PIPELINE_SOURCE == "invalid source")]) 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 end
it 'is satisfied by a truthy expression using undefined variable' do it 'is satisfied by a truthy expression using undefined variable' do
policy = described_class.new(['$UNDEFINED', '$UNDEFINED == null']) 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 end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment