Add case when artifacts have not existed on dependencies
This commit is contained in:
parent
6e343b27bf
commit
c3e0731d2e
|
@ -143,9 +143,7 @@ module Ci
|
|||
end
|
||||
|
||||
before_transition any => [:running] do |build|
|
||||
if build.specified_dependencies? && build.dependencies.empty?
|
||||
raise MissingDependenciesError
|
||||
end
|
||||
build.validates_dependencies!
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -486,8 +484,20 @@ module Ci
|
|||
options[:dependencies]&.empty?
|
||||
end
|
||||
|
||||
def specified_dependencies?
|
||||
options.has_key?(:dependencies) && options[:dependencies].any?
|
||||
def validates_dependencies!
|
||||
dependencies.tap do |deps|
|
||||
# When `dependencies` keyword is given and depended jobs are skipped by `only` keyword
|
||||
if options[:dependencies]&.any? && deps.empty?
|
||||
raise MissingDependenciesError
|
||||
end
|
||||
|
||||
# When artifacts of depended jobs have not existsed
|
||||
deps.each do |dep|
|
||||
if dep.options[:artifacts]&.any? && !dep.artifacts?
|
||||
raise MissingDependenciesError
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def hide_secrets(trace)
|
||||
|
|
|
@ -1107,7 +1107,7 @@ To use this feature, define `dependencies` in context of the job and pass
|
|||
a list of all previous jobs from which the artifacts should be downloaded.
|
||||
You can only define jobs from stages that are executed before the current one.
|
||||
An error will be shown if you define jobs from the current stage or next ones,
|
||||
or there are no depended jobs in previous stages.
|
||||
or there are no depended jobs with artifacts in previous stages.
|
||||
Defining an empty array will skip downloading any artifacts for that job.
|
||||
The status of the previous job is not considered when using `dependencies`, so
|
||||
if it failed or it is a manual job that was not run, no error occurs.
|
||||
|
|
|
@ -1887,9 +1887,28 @@ describe Ci::Build do
|
|||
let(:options) { { dependencies: ['test'] } }
|
||||
|
||||
context 'when a depended job exists' do
|
||||
let!(:pre_build) { create(:ci_build, pipeline: pipeline, name: 'test', stage_idx: 0) }
|
||||
let!(:pre_stage_job) { create(:ci_build, pipeline: pipeline, name: 'test', stage_idx: 0) }
|
||||
|
||||
it { expect { build.run! }.not_to raise_error }
|
||||
|
||||
context 'when "artifacts" keyword is specified on depended job' do
|
||||
let!(:pre_stage_job) do
|
||||
create(:ci_build, :artifacts, pipeline: pipeline, name: 'test', stage_idx: 0,
|
||||
options: { artifacts: { paths: ['binaries/'] } } )
|
||||
end
|
||||
|
||||
context 'when artifacts of depended job has existsed' do
|
||||
it { expect { build.run! }.not_to raise_error }
|
||||
end
|
||||
|
||||
context 'when artifacts of depended job has not existsed' do
|
||||
before do
|
||||
pre_stage_job.erase_artifacts!
|
||||
end
|
||||
|
||||
it { expect { build.run! }.to raise_error(Ci::Build::MissingDependenciesError) }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when depended jobs do not exist' do
|
||||
|
|
|
@ -291,6 +291,31 @@ module Ci
|
|||
it "picks the build" do
|
||||
expect(picked_job).to eq(pending_job)
|
||||
end
|
||||
|
||||
context 'when "artifacts" keyword is specified on depended job' do
|
||||
let!(:pre_stage_job) do
|
||||
create(:ci_build, :success, :artifacts, pipeline: pipeline, name: job_name, stage_idx: 0,
|
||||
options: { artifacts: { paths: ['binaries/'] } } )
|
||||
end
|
||||
|
||||
context 'when artifacts of depended job has existsed' do
|
||||
it "picks the build" do
|
||||
expect(picked_job).to eq(pending_job)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when artifacts of depended job has not existsed' do
|
||||
before do
|
||||
pre_stage_job.erase_artifacts!
|
||||
end
|
||||
|
||||
it 'does not pick the build and drops the build' do
|
||||
expect(picked_job).to be_nil
|
||||
expect(pending_job.reload).to be_failed
|
||||
expect(pending_job).to be_missing_dependency_failure
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when depended jobs do not exist' do
|
||||
|
|
Loading…
Reference in New Issue