Merge branch 'fix/gb/passed-with-warnings-status-on-mysql' into 'master'

Fix "passed with warnings" stage status on MySQL

Closes #28603

See merge request !9802
This commit is contained in:
Kamil Trzciński 2017-03-10 08:57:39 +00:00
commit 81ad611131
5 changed files with 39 additions and 8 deletions

View file

@ -144,7 +144,7 @@ module Ci
status_sql = statuses.latest.where('stage=sg.stage').status_sql
warnings_sql = statuses.latest.select('COUNT(*) > 0')
warnings_sql = statuses.latest.select('COUNT(*)')
.where('stage=sg.stage').failed_but_allowed.to_sql
stages_with_statuses = CommitStatus.from(stages_query, :sg)

View file

@ -46,10 +46,10 @@ module Ci
end
def has_warnings?
if @warnings.nil?
statuses.latest.failed_but_allowed.any?
if @warnings.is_a?(Integer)
@warnings > 0
else
@warnings
statuses.latest.failed_but_allowed.any?
end
end
end

View file

@ -0,0 +1,4 @@
---
title: Fix "passed with warnings" stage status on MySQL installations
merge_request: 9802
author:

View file

@ -197,6 +197,24 @@ describe Ci::Pipeline, models: true do
end
end
end
context 'when there is a stage with warnings' do
before do
create(:commit_status, pipeline: pipeline,
stage: 'deploy',
name: 'prod:2',
stage_idx: 2,
status: 'failed',
allow_failure: true)
end
it 'populates stage with correct number of warnings' do
deploy_stage = pipeline.stages.third
expect(deploy_stage).not_to receive(:statuses)
expect(deploy_stage).to have_warnings
end
end
end
describe '#stages_count' do

View file

@ -170,22 +170,31 @@ describe Ci::Stage, models: true do
context 'when stage has warnings' do
context 'when using memoized warnings flag' do
context 'when there are warnings' do
let(:stage) { build(:ci_stage, warnings: true) }
let(:stage) { build(:ci_stage, warnings: 2) }
it 'has memoized warnings' do
it 'returns true using memoized value' do
expect(stage).not_to receive(:statuses)
expect(stage).to have_warnings
end
end
context 'when there are no warnings' do
let(:stage) { build(:ci_stage, warnings: false) }
let(:stage) { build(:ci_stage, warnings: 0) }
it 'has memoized warnings' do
it 'returns false using memoized value' do
expect(stage).not_to receive(:statuses)
expect(stage).not_to have_warnings
end
end
context 'when number of warnings is not a valid value' do
let(:stage) { build(:ci_stage, warnings: true) }
it 'calculates statuses using database queries' do
expect(stage).to receive(:statuses).and_call_original
expect(stage).not_to have_warnings
end
end
end
context 'when calculating warnings from statuses' do