Detailed status for builds that fail prerequisites
Create FailedUnmetPrerequisites status to allow custom messaging for builds that were unable to be queued due to failing to meet prerequisites (eg. failing to create Kubernetes namespace for deployment).
This commit is contained in:
parent
093629fedc
commit
de03a8bcb4
|
@ -16,7 +16,8 @@ module Gitlab
|
|||
Status::Build::Skipped],
|
||||
[Status::Build::Cancelable,
|
||||
Status::Build::Retryable],
|
||||
[Status::Build::Failed],
|
||||
[Status::Build::FailedUnmetPrerequisites,
|
||||
Status::Build::Failed],
|
||||
[Status::Build::FailedAllowed,
|
||||
Status::Build::Unschedule,
|
||||
Status::Build::Play,
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Gitlab
|
||||
module Ci
|
||||
module Status
|
||||
module Build
|
||||
class FailedUnmetPrerequisites < Status::Extended
|
||||
def illustration
|
||||
{
|
||||
image: 'illustrations/skipped-job_empty.svg',
|
||||
size: 'svg-430',
|
||||
title: _('Failed to create resources'),
|
||||
content: _('Retry this job in order to create the necessary resources')
|
||||
}
|
||||
end
|
||||
|
||||
def self.matches?(build, _)
|
||||
build.unmet_prerequisites?
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -336,6 +336,11 @@ FactoryBot.define do
|
|||
failure_reason 2
|
||||
end
|
||||
|
||||
trait :prerequisite_failure do
|
||||
failed
|
||||
failure_reason 10
|
||||
end
|
||||
|
||||
trait :with_runner_session do
|
||||
after(:build) do |build|
|
||||
build.build_runner_session(url: 'https://localhost')
|
||||
|
|
|
@ -123,6 +123,35 @@ describe Gitlab::Ci::Status::Build::Factory do
|
|||
expect(status.action_path).to include 'retry'
|
||||
end
|
||||
end
|
||||
|
||||
context 'when build has unmet prerequisites' do
|
||||
let(:build) { create(:ci_build, :prerequisite_failure) }
|
||||
|
||||
it 'matches correct core status' do
|
||||
expect(factory.core_status).to be_a Gitlab::Ci::Status::Failed
|
||||
end
|
||||
|
||||
it 'matches correct extended statuses' do
|
||||
expect(factory.extended_statuses)
|
||||
.to eq [Gitlab::Ci::Status::Build::Retryable,
|
||||
Gitlab::Ci::Status::Build::FailedUnmetPrerequisites]
|
||||
end
|
||||
|
||||
it 'fabricates a failed with unmet prerequisites build status' do
|
||||
expect(status).to be_a Gitlab::Ci::Status::Build::FailedUnmetPrerequisites
|
||||
end
|
||||
|
||||
it 'fabricates status with correct details' do
|
||||
expect(status.text).to eq 'failed'
|
||||
expect(status.icon).to eq 'status_failed'
|
||||
expect(status.favicon).to eq 'favicon_status_failed'
|
||||
expect(status.label).to eq 'failed'
|
||||
expect(status).to have_details
|
||||
expect(status).to have_action
|
||||
expect(status.action_title).to include 'Retry'
|
||||
expect(status.action_path).to include 'retry'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when build is a canceled' do
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Gitlab::Ci::Status::Build::FailedUnmetPrerequisites do
|
||||
describe '#illustration' do
|
||||
subject { described_class.new(double).illustration }
|
||||
|
||||
it { is_expected.to include(:image, :size, :title, :content) }
|
||||
end
|
||||
|
||||
describe '.matches?' do
|
||||
let(:build) { create(:ci_build, :created) }
|
||||
|
||||
subject { described_class.matches?(build, double) }
|
||||
|
||||
context 'when build has not failed' do
|
||||
it { is_expected.to be_falsey }
|
||||
end
|
||||
|
||||
context 'when build has failed' do
|
||||
before do
|
||||
build.drop!(failure_reason)
|
||||
end
|
||||
|
||||
context 'with unmet prerequisites' do
|
||||
let(:failure_reason) { :unmet_prerequisites }
|
||||
|
||||
it { is_expected.to be_truthy }
|
||||
end
|
||||
|
||||
context 'with a different error' do
|
||||
let(:failure_reason) { :runner_system_failure }
|
||||
|
||||
it { is_expected.to be_falsey }
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue