diff --git a/services/bitbucket/bitbucket-pipelines.service.js b/services/bitbucket/bitbucket-pipelines.service.js index d00b85e64711b..95fe668ed4397 100644 --- a/services/bitbucket/bitbucket-pipelines.service.js +++ b/services/bitbucket/bitbucket-pipelines.service.js @@ -16,8 +16,14 @@ const bitbucketPipelinesSchema = Joi.object({ 'STOPPED', 'EXPIRED', ), - }).required(), - }).required(), + }), + stage: Joi.object({ + name: Joi.string().required(), + type: Joi.string().optional(), + }), + }) + .required() + .or('result', 'stage'), }), ) .required(), @@ -69,10 +75,16 @@ class BitbucketPipelines extends BaseJsonService { static transform(data) { const values = data.values.filter( - value => value.state && value.state.name === 'COMPLETED', + value => + value.state && + (value.state.name === 'COMPLETED' || + value.state.name === 'IN_PROGRESS'), ) if (values.length > 0) { - return values[0].state.result.name + if (Object.prototype.hasOwnProperty.call(values[0].state, 'result')) { + return values[0].state.result.name + } + return values[0].state.stage.name } return 'never built' } diff --git a/services/bitbucket/bitbucket-pipelines.tester.js b/services/bitbucket/bitbucket-pipelines.tester.js index a271c04daea5e..39864802fc395 100644 --- a/services/bitbucket/bitbucket-pipelines.tester.js +++ b/services/bitbucket/bitbucket-pipelines.tester.js @@ -23,6 +23,23 @@ function bitbucketApiResponse(status) { }) } +function bitbucketNoResultResponse(stageName) { + return JSON.stringify({ + values: [ + { + state: { + type: 'pipeline_state_in_progress', + name: 'IN_PROGRESS', + stage: { + name: stageName, + type: 'pipeline_state_in_progress_halted', + }, + }, + }, + ], + }) +} + t.create('master build result (not found)') .get('/atlassian/not-a-repo/master.json') .expectBadge({ label: 'build', message: 'not found' }) @@ -42,6 +59,15 @@ t.create('branch build result (never built)') .get('/atlassian/adf-builder-javascript/some/new/branch.json') .expectBadge({ label: 'build', message: 'never built' }) +t.create('build result (stage only)') + .get('/atlassian/adf-builder-javascript/master.json') + .intercept(nock => + nock('https://api.bitbucket.org') + .get(/^\/2.0\/.*/) + .reply(200, bitbucketNoResultResponse('HALTED')), + ) + .expectBadge({ label: 'build', message: 'HALTED' }) + t.create('build result (passing)') .get('/atlassian/adf-builder-javascript/master.json') .intercept(nock =>