Add support for checking attributes in build policies
This commit is contained in:
parent
42b2abbeb1
commit
9147a5f862
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue