Commit 1f4c3451 authored by Grzegorz Bizon's avatar Grzegorz Bizon
Browse files

Make it possible to fabricate CI/CD bridge jobs

parent c68de31b9643
......@@ -38,9 +38,17 @@ def attributes
)
end
def bridge?
@attributes.to_h.dig(:options, :trigger).present?
end
def to_resource
strong_memoize(:resource) do
::Ci::Build.new(attributes)
if bridge?
::Ci::Bridge.new(attributes)
else
::Ci::Build.new(attributes)
end
end
end
end
......
......@@ -39,7 +39,13 @@ def included?
def to_resource
strong_memoize(:stage) do
::Ci::Stage.new(attributes).tap do |stage|
seeds.each { |seed| stage.builds << seed.to_resource }
seeds.each do |seed|
if seed.bridge?
stage.statuses << seed.to_resource
else
stage.builds << seed.to_resource
end
end
end
end
end
......
......@@ -33,7 +33,7 @@ def build_attributes(name)
{ stage_idx: @stages.index(job[:stage]),
stage: job[:stage],
tag_list: job[:tags] || [],
tag_list: job[:tags],
name: job[:name].to_s,
allow_failure: job[:ignore],
when: job[:when] || 'on_success',
......@@ -53,7 +53,8 @@ def build_attributes(name)
retry: job[:retry],
parallel: job[:parallel],
instance: job[:instance],
start_in: job[:start_in]
start_in: job[:start_in],
trigger: job[:trigger]
}.compact }
end
......
......@@ -5,8 +5,7 @@
let(:pipeline) { create(:ci_empty_pipeline, project: project) }
let(:attributes) do
{ name: 'rspec',
ref: 'master' }
{ name: 'rspec', ref: 'master' }
end
subject do
......@@ -21,10 +20,45 @@
end
end
describe '#bridge?' do
context 'when job is a bridge' do
let(:attributes) do
{ name: 'rspec', ref: 'master', options: { trigger: 'my/project' } }
end
it { is_expected.to be_bridge }
end
context 'when trigger definition is empty' do
let(:attributes) do
{ name: 'rspec', ref: 'master', options: { trigger: '' } }
end
it { is_expected.not_to be_bridge }
end
context 'when job is not a bridge' do
it { is_expected.not_to be_bridge }
end
end
describe '#to_resource' do
it 'returns a valid build resource' do
expect(subject.to_resource).to be_a(::Ci::Build)
expect(subject.to_resource).to be_valid
context 'when job is not a bridge' do
it 'returns a valid build resource' do
expect(subject.to_resource).to be_a(::Ci::Build)
expect(subject.to_resource).to be_valid
end
end
context 'when job is a bridge' do
let(:attributes) do
{ name: 'rspec', ref: 'master', options: { trigger: 'my/project' } }
end
it 'returns a valid bridge resource' do
expect(subject.to_resource).to be_a(::Ci::Bridge)
expect(subject.to_resource).to be_valid
end
end
it 'memoizes a resource object' do
......
......@@ -62,8 +62,18 @@
expect(subject.seeds.map(&:attributes)).to all(include(ref: 'master'))
expect(subject.seeds.map(&:attributes)).to all(include(tag: false))
expect(subject.seeds.map(&:attributes)).to all(include(project: pipeline.project))
expect(subject.seeds.map(&:attributes))
.to all(include(trigger_request: pipeline.trigger_requests.first))
end
context 'when a legacy trigger exists' do
before do
create(:ci_trigger_request, pipeline: pipeline)
end
it 'returns build seeds including legacy trigger' do
expect(pipeline.legacy_trigger).not_to be_nil
expect(subject.seeds.map(&:attributes))
.to all(include(trigger_request: pipeline.legacy_trigger))
end
end
context 'when a ref is protected' do
......
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