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
end
end
def satisfied_by?(pipeline)
def satisfied_by?(pipeline, _attributes = nil)
pipeline.has_kubernetes_active?
end
end
......
......@@ -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)
......
......@@ -15,7 +15,7 @@ module Gitlab
@spec = spec
end
def satisfied_by?(pipeline)
def satisfied_by?(pipeline, attributes = nil)
raise NotImplementedError
end
end
......
......@@ -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
......
......@@ -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
......
......@@ -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)
......
......@@ -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
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