Commit d79ad28f authored by Grzegorz Bizon's avatar Grzegorz Bizon
Browse files

Do not pass project path from YAML processor

Use project full path that can be received from a pipeline object
parent 6681ea9c
......@@ -31,6 +31,7 @@ module Ci
has_many :auto_canceled_jobs, class_name: 'CommitStatus', foreign_key: 'auto_canceled_by_id'
 
delegate :id, to: :project, prefix: true
delegate :full_path, to: :project, prefix: true
 
validates :source, exclusion: { in: %w(unknown), unless: :importing? }, on: :create
validates :sha, presence: { unless: :importing? }
......
......@@ -9,7 +9,7 @@ module Gitlab
end
end
 
def satisfied_by?(pipeline, **_)
def satisfied_by?(pipeline)
pipeline.has_kubernetes_active?
end
end
......
......@@ -7,21 +7,21 @@ module Gitlab
@patterns = Array(refs)
end
 
def satisfied_by?(pipeline, path: nil)
def satisfied_by?(pipeline)
@patterns.any? do |pattern|
pattern, ref_path = pattern.split('@', 2)
pattern, path = pattern.split('@', 2)
 
matches_path?(ref_path, path) &&
matches_path?(path, pipeline) &&
matches_pattern?(pattern, pipeline)
end
end
 
private
 
def matches_path?(ref_path, expected_path)
return true unless ref_path
def matches_path?(path, pipeline)
return true unless path
 
expected_path == ref_path
pipeline.project_full_path == path
end
 
def matches_pattern?(pattern, pipeline)
......
......@@ -3,7 +3,7 @@ module Gitlab
module Build
module Policy
##
# Abstract class that defines an intereface of job policy
# Abstract class that defines an interface of job policy
# specification.
#
# Used for job's only/except policy configuration.
......@@ -15,7 +15,7 @@ module Gitlab
@spec = spec
end
 
def satisfied_by?(pipeline, **metadata)
def satisfied_by?(pipeline)
raise NotImplementedError
end
end
......
......@@ -63,8 +63,8 @@ module Gitlab
except_specs = Gitlab::Ci::Build::Policy
.fabricate(job.fetch(:except, {}))
 
only_specs.all? { |spec| spec.satisfied_by?(pipeline, path: @path) } &&
except_specs.none? { |spec| spec.satisfied_by?(pipeline, path: @path) }
only_specs.all? { |spec| spec.satisfied_by?(pipeline) } &&
except_specs.none? { |spec| spec.satisfied_by?(pipeline) }
end
 
selected_jobs.map { |_, job| build_attributes(job[:name]) }
......
......@@ -46,13 +46,13 @@ describe Gitlab::Ci::Build::Policy::Refs do
end
 
it 'is satisfied when provided patch matches specified one' do
expect(described_class.new(%w[master@some/repository]))
.to be_satisfied_by(pipeline, path: 'some/repository')
expect(described_class.new(%W[master@#{pipeline.project_full_path}]))
.to be_satisfied_by(pipeline)
end
 
it 'is not satisfied when path differs' do
expect(described_class.new(%w[master@some/fork/repository]))
.not_to be_satisfied_by(pipeline, path: 'some/repository')
.not_to be_satisfied_by(pipeline)
end
end
 
......
......@@ -340,14 +340,20 @@ module Gitlab
end
 
it "returns builds if only has current repository path" do
seed_pipeline = pipeline(ref: 'deploy')
config = YAML.dump({
before_script: ["pwd"],
rspec: { script: "rspec", type: type, only: ["branches@path"] }
rspec: {
script: "rspec",
type: type,
only: ["branches@#{seed_pipeline.project_full_path}"]
}
})
 
config_processor = Gitlab::Ci::YamlProcessor.new(config, path)
 
expect(config_processor.pipeline_stage_builds(type, pipeline(ref: "deploy")).size).to eq(1)
expect(config_processor.pipeline_stage_builds(type, seed_pipeline).size).to eq(1)
end
 
it "does not return builds if only has different repository path" do
......@@ -517,14 +523,19 @@ module Gitlab
end
 
it "does not return builds if except has current repository path" do
seed_pipeline = pipeline(ref: 'deploy')
config = YAML.dump({
before_script: ["pwd"],
rspec: { script: "rspec", type: type, except: ["branches@path"] }
rspec: {
script: "rspec",
type: type,
except: ["branches@#{seed_pipeline.project_full_path}"] }
})
 
config_processor = Gitlab::Ci::YamlProcessor.new(config, path)
 
expect(config_processor.pipeline_stage_builds(type, pipeline(ref: "deploy")).size).to eq(0)
expect(config_processor.pipeline_stage_builds(type, seed_pipeline).size).to eq(0)
end
 
it "returns builds if except has different repository path" do
......@@ -539,18 +550,22 @@ module Gitlab
end
 
it "returns build except specified type" do
master_pipeline = pipeline(ref: 'master')
test_pipeline = pipeline(ref: 'test')
deploy_pipeline = pipeline(ref: 'deploy')
config = YAML.dump({
before_script: ["pwd"],
rspec: { script: "rspec", type: "test", except: ["master", "deploy", "test@fork"] },
rspec: { script: "rspec", type: "test", except: ["master", "deploy", "test@#{test_pipeline.project_full_path}"] },
staging: { script: "deploy", type: "deploy", except: ["master"] },
production: { script: "deploy", type: "deploy", except: ["master@fork"] }
production: { script: "deploy", type: "deploy", except: ["master@#{master_pipeline.project_full_path}"] }
})
 
config_processor = Gitlab::Ci::YamlProcessor.new(config, 'fork')
 
expect(config_processor.pipeline_stage_builds("deploy", pipeline(ref: "deploy")).size).to eq(2)
expect(config_processor.pipeline_stage_builds("test", pipeline(ref: "test")).size).to eq(0)
expect(config_processor.pipeline_stage_builds("deploy", pipeline(ref: "master")).size).to eq(0)
expect(config_processor.pipeline_stage_builds("deploy", deploy_pipeline).size).to eq(2)
expect(config_processor.pipeline_stage_builds("test", test_pipeline).size).to eq(0)
expect(config_processor.pipeline_stage_builds("deploy", master_pipeline).size).to eq(0)
end
 
context 'for invalid value' do
......
......@@ -26,6 +26,7 @@ describe Ci::Pipeline, :mailer do
it { is_expected.to respond_to :git_author_name }
it { is_expected.to respond_to :git_author_email }
it { is_expected.to respond_to :short_sha }
it { is_expected.to delegate_method(:full_path).to(:project).with_prefix }
 
describe '#source' do
context 'when creating new pipeline' do
......
Supports Markdown
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