Merge branch 'fix/ci-first-job-allow-failure' into 'master'
Fix CI builds scheduler when first build in stage is allowed to fail This fixes an edge case in CI builds scheduler when first build in stage was marked as allowed to fail. Closes #3192 See merge request !2869
This commit is contained in:
commit
c0f549a95b
7 changed files with 117 additions and 3 deletions
|
@ -63,6 +63,7 @@ v 8.5.0 (unreleased)
|
|||
- Fix CI builds badge, add a new link to builds badge, deprecate the old one
|
||||
- Fix broken link to project in build notification emails
|
||||
- Ability to see and sort on vote count from Issues and MR lists
|
||||
- Fix builds scheduler when first build in stage was allowed to fail
|
||||
|
||||
v 8.4.4
|
||||
- Update omniauth-saml gem to 1.4.2
|
||||
|
|
|
@ -34,6 +34,7 @@ module Ci
|
|||
|
||||
build = commit.builds.create!(build_attrs)
|
||||
build.execute_hooks
|
||||
build
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,11 +1,9 @@
|
|||
module Ci
|
||||
class Status
|
||||
def self.get_status(statuses)
|
||||
statuses.reject! { |status| status.try(&:allow_failure?) }
|
||||
|
||||
if statuses.none?
|
||||
'skipped'
|
||||
elsif statuses.all?(&:success?)
|
||||
elsif statuses.all? { |status| status.success? || status.ignored? }
|
||||
'success'
|
||||
elsif statuses.all?(&:pending?)
|
||||
'pending'
|
||||
|
|
|
@ -16,10 +16,30 @@ FactoryGirl.define do
|
|||
|
||||
commit factory: :ci_commit
|
||||
|
||||
trait :success do
|
||||
status 'success'
|
||||
end
|
||||
|
||||
trait :failed do
|
||||
status 'failed'
|
||||
end
|
||||
|
||||
trait :canceled do
|
||||
status 'canceled'
|
||||
end
|
||||
|
||||
trait :running do
|
||||
status 'running'
|
||||
end
|
||||
|
||||
trait :pending do
|
||||
status 'pending'
|
||||
end
|
||||
|
||||
trait :allowed_to_fail do
|
||||
allow_failure true
|
||||
end
|
||||
|
||||
after(:build) do |build, evaluator|
|
||||
build.project = build.commit.project
|
||||
end
|
||||
|
|
37
spec/lib/ci/status_spec.rb
Normal file
37
spec/lib/ci/status_spec.rb
Normal file
|
@ -0,0 +1,37 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Ci::Status do
|
||||
describe '.get_status' do
|
||||
subject { described_class.get_status(builds) }
|
||||
|
||||
context 'all builds successful' do
|
||||
let(:builds) { Array.new(2) { create(:ci_build, :success) } }
|
||||
it { is_expected.to eq 'success' }
|
||||
end
|
||||
|
||||
context 'at least one build failed' do
|
||||
let(:builds) { [create(:ci_build, :success), create(:ci_build, :failed)] }
|
||||
it { is_expected.to eq 'failed' }
|
||||
end
|
||||
|
||||
context 'at least one running' do
|
||||
let(:builds) { [create(:ci_build, :success), create(:ci_build, :running)] }
|
||||
it { is_expected.to eq 'running' }
|
||||
end
|
||||
|
||||
context 'at least one pending' do
|
||||
let(:builds) { [create(:ci_build, :success), create(:ci_build, :pending)] }
|
||||
it { is_expected.to eq 'running' }
|
||||
end
|
||||
|
||||
context 'build success and failed but allowed to fail' do
|
||||
let(:builds) { [create(:ci_build, :success), create(:ci_build, :failed, :allowed_to_fail)] }
|
||||
it { is_expected.to eq 'success' }
|
||||
end
|
||||
|
||||
context 'one build failed but allowed to fail' do
|
||||
let(:builds) { [create(:ci_build, :failed, :allowed_to_fail)] }
|
||||
it { is_expected.to eq 'success' }
|
||||
end
|
||||
end
|
||||
end
|
|
@ -247,6 +247,35 @@ describe Ci::Commit, models: true do
|
|||
end
|
||||
end
|
||||
|
||||
|
||||
context 'custom stage with first job allowed to fail' do
|
||||
let(:yaml) do
|
||||
{
|
||||
stages: ['clean', 'test'],
|
||||
clean_job: {
|
||||
stage: 'clean',
|
||||
allow_failure: true,
|
||||
script: 'BUILD',
|
||||
},
|
||||
test_job: {
|
||||
stage: 'test',
|
||||
script: 'TEST',
|
||||
},
|
||||
}
|
||||
end
|
||||
|
||||
before do
|
||||
stub_ci_commit_yaml_file(YAML.dump(yaml))
|
||||
create_builds
|
||||
end
|
||||
|
||||
it 'properly schedules builds' do
|
||||
expect(commit.builds.pluck(:status)).to contain_exactly('pending')
|
||||
commit.builds.running_or_pending.each(&:drop)
|
||||
expect(commit.builds.pluck(:status)).to contain_exactly('pending', 'failed')
|
||||
end
|
||||
end
|
||||
|
||||
context 'properly creates builds when "when" is defined' do
|
||||
let(:yaml) do
|
||||
{
|
||||
|
|
28
spec/services/ci/create_builds_service_spec.rb
Normal file
28
spec/services/ci/create_builds_service_spec.rb
Normal file
|
@ -0,0 +1,28 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Ci::CreateBuildsService, services: true do
|
||||
let(:commit) { create(:ci_commit) }
|
||||
let(:user) { create(:user) }
|
||||
|
||||
describe '#execute' do
|
||||
# Using stubbed .gitlab-ci.yml created in commit factory
|
||||
#
|
||||
|
||||
subject do
|
||||
described_class.new.execute(commit, 'test', 'master', nil, user, nil, status)
|
||||
end
|
||||
|
||||
context 'next builds available' do
|
||||
let(:status) { 'success' }
|
||||
|
||||
it { is_expected.to be_an_instance_of Array }
|
||||
it { is_expected.to all(be_an_instance_of Ci::Build) }
|
||||
end
|
||||
|
||||
context 'builds skipped' do
|
||||
let(:status) { 'skipped' }
|
||||
|
||||
it { is_expected.to be_empty }
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue