From 201c282605ab845a541257b5ba37b47bf05efcc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20D=C3=A9moulins?= Date: Sun, 26 Jan 2020 11:55:17 +0100 Subject: [PATCH] [AzureDevOpsBuild] Support badge on a specific stage or job (#4583) * Support Azure DevOps badge on a specific stage or job * Add samples * Fix tests * Restart CI * Changes per @PyvesB review Co-authored-by: Pierre-Yves B. --- .../azure-devops-build.service.js | 47 ++++++++++++++++++- .../azure-devops/azure-devops-build.tester.js | 16 +++++++ 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/services/azure-devops/azure-devops-build.service.js b/services/azure-devops/azure-devops-build.service.js index 906305b20b..d8025a943c 100644 --- a/services/azure-devops/azure-devops-build.service.js +++ b/services/azure-devops/azure-devops-build.service.js @@ -1,9 +1,15 @@ 'use strict' +const Joi = require('@hapi/joi') const { renderBuildStatusBadge } = require('../build-status') const { keywords, fetch } = require('./azure-devops-helpers') const { BaseSvgScrapingService, NotFound } = require('..') +const queryParamSchema = Joi.object({ + stage: Joi.string(), + job: Joi.string(), +}) + const documentation = `

A badge requires three pieces of information: ORGANIZATION, @@ -36,6 +42,7 @@ module.exports = class AzureDevOpsBuild extends BaseSvgScrapingService { return { base: 'azure-devops/build', pattern: ':organization/:projectId/:definitionId/:branch*', + queryParamSchema, } } @@ -66,14 +73,50 @@ module.exports = class AzureDevOpsBuild extends BaseSvgScrapingService { keywords, documentation, }, + { + title: 'Azure DevOps builds (stage)', + namedParams: { + organization: 'totodem', + projectId: '8cf3ec0e-d0c2-4fcd-8206-ad204f254a96', + definitionId: '5', + }, + queryParams: { + stage: 'Successful Stage', + }, + staticPreview: renderBuildStatusBadge({ status: 'succeeded' }), + keywords, + documentation, + }, + { + title: 'Azure DevOps builds (job)', + namedParams: { + organization: 'totodem', + projectId: '8cf3ec0e-d0c2-4fcd-8206-ad204f254a96', + definitionId: '5', + }, + queryParams: { + stage: 'Successful Stage', + job: 'Successful Job', + }, + staticPreview: renderBuildStatusBadge({ status: 'succeeded' }), + keywords, + documentation, + }, ] } - async handle({ organization, projectId, definitionId, branch }) { + async handle( + { organization, projectId, definitionId, branch }, + { stage, job } + ) { // Microsoft documentation: https://docs.microsoft.com/en-us/rest/api/vsts/build/status/get const { status } = await fetch(this, { url: `https://dev.azure.com/${organization}/${projectId}/_apis/build/status/${definitionId}`, - qs: { branchName: branch }, + qs: { + branchName: branch, + stageName: stage, + jobName: job, + }, errorMessages: { 404: 'user or project not found', }, diff --git a/services/azure-devops/azure-devops-build.tester.js b/services/azure-devops/azure-devops-build.tester.js index d115faea07..6df777c073 100644 --- a/services/azure-devops/azure-devops-build.tester.js +++ b/services/azure-devops/azure-devops-build.tester.js @@ -20,6 +20,22 @@ t.create('named branch') message: isBuildStatus, }) +t.create('stage badge') + .get('/totodem/Shields.io/5.json?stage=Successful%20Stage') + .expectBadge({ + label: 'build', + message: isBuildStatus, + }) + +t.create('job badge') + .get( + '/totodem/Shields.io/5.json?stage=Successful%20Stage&job=Successful%20Job' + ) + .expectBadge({ + label: 'build', + message: isBuildStatus, + }) + t.create('never built definition') .get('/swellaby/opensource/112.json') .expectBadge({ label: 'build', message: 'never built' })