Files
shields/services/teamcity/teamcity-build.service.js

97 lines
2.5 KiB
JavaScript

import Joi from 'joi'
import { optionalUrl } from '../validators.js'
import { pathParam, queryParam } from '../index.js'
import TeamCityBase from './teamcity-base.js'
const buildStatusSchema = Joi.object({
status: Joi.equal('SUCCESS', 'FAILURE', 'ERROR').required(),
statusText: Joi.string().required(),
}).required()
const queryParamSchema = Joi.object({
server: optionalUrl,
}).required()
export default class TeamCityBuild extends TeamCityBase {
static category = 'build'
static route = {
base: 'teamcity/build',
pattern: ':verbosity(s|e)/:buildId',
queryParamSchema,
}
static openApi = {
'/teamcity/build/s/{buildId}': {
get: {
summary: 'TeamCity Simple Build Status',
parameters: [
pathParam({
name: 'buildId',
example: 'IntelliJIdeaCe_JavaDecompilerEngineTests',
}),
queryParam({
name: 'server',
example: 'https://teamcity.jetbrains.com',
}),
],
},
},
'/teamcity/build/e/{buildId}': {
get: {
summary: 'TeamCity Full Build Status',
parameters: [
pathParam({ name: 'buildId', example: 'bt345' }),
queryParam({
name: 'server',
example: 'https://teamcity.jetbrains.com',
}),
],
},
},
}
static defaultBadgeData = {
label: 'build',
}
static render({ status, statusText, useVerbose }) {
if (status === 'SUCCESS') {
return {
message: 'passing',
color: 'brightgreen',
}
} else if (statusText && useVerbose) {
return {
message: statusText.toLowerCase(),
color: 'red',
}
} else {
return {
message: status.toLowerCase(),
color: 'red',
}
}
}
async handle(
{ verbosity, buildId },
{ server = 'https://teamcity.jetbrains.com' },
) {
// JetBrains Docs: https://confluence.jetbrains.com/display/TCD18/REST+API#RESTAPI-BuildStatusIcon
const buildLocator = `buildType:(id:${buildId})`
const apiPath = `app/rest/builds/${encodeURIComponent(buildLocator)}`
const json = await this.fetch({
url: `${server}/${apiPath}`,
schema: buildStatusSchema,
})
// If the verbosity is 'e' then the user has requested the verbose (full) build status.
const useVerbose = verbosity === 'e'
return this.constructor.render({
status: json.status,
statusText: json.statusText,
useVerbose,
})
}
}