summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2016-02-18 11:47:35 +0100
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2016-02-18 11:50:11 +0100
commit8114786665a59526a988ce346393243996769aff (patch)
tree6e7f8a58021825a02d4465bfec3e8b449b9f2e35
parent0ae7c954537663aa2a574133e42d05eafe5db6fb (diff)
downloadgitlab-ce-8114786665a59526a988ce346393243996769aff.tar.gz
Fix builds scheduler when first build is allowed to fail
Before this fix when there was only one relevant, previous build and it failed, but was allowed to fail, entire build had been marked as skipped. Closes #3192
-rw-r--r--lib/ci/status.rb4
-rw-r--r--spec/factories/ci/builds.rb12
-rw-r--r--spec/lib/ci/status_spec.rb20
3 files changed, 33 insertions, 3 deletions
diff --git a/lib/ci/status.rb b/lib/ci/status.rb
index c02b3b8f3e4..3fb1fe29494 100644
--- a/lib/ci/status.rb
+++ b/lib/ci/status.rb
@@ -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'
diff --git a/spec/factories/ci/builds.rb b/spec/factories/ci/builds.rb
index 46a211fa60e..1243647a78d 100644
--- a/spec/factories/ci/builds.rb
+++ b/spec/factories/ci/builds.rb
@@ -28,6 +28,18 @@ FactoryGirl.define 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
diff --git a/spec/lib/ci/status_spec.rb b/spec/lib/ci/status_spec.rb
index aa59bdff1af..cc4199dc7b6 100644
--- a/spec/lib/ci/status_spec.rb
+++ b/spec/lib/ci/status_spec.rb
@@ -13,5 +13,25 @@ describe Ci::Status 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