kopia lustrzana https://github.com/badgen/badgen.net
109 wiersze
3.2 KiB
TypeScript
109 wiersze
3.2 KiB
TypeScript
![]() |
import got from "../libs/got"
|
||
|
import { createBadgenHandler, PathArgs } from "../libs/create-badgen-handler"
|
||
|
import humanizeDuration from "humanize-duration"
|
||
![]() |
|
||
|
export default createBadgenHandler({
|
||
|
title: "Jenkins",
|
||
|
examples: {
|
||
|
"/jenkins/last-build/jenkins.mono-project.com/job/test-mono-mainline/":
|
||
|
"Last build status",
|
||
|
"/jenkins/fix-time/jenkins.mono-project.com/job/test-mono-mainline/":
|
||
|
"Time taken to fix a broken build",
|
||
|
"/jenkins/broken-build/jenkins.mono-project.com/job/test-mono-mainline/":
|
||
|
"# of broken builds",
|
||
|
},
|
||
|
handlers: {
|
||
|
"/jenkins/last-build/:hostname/:job*": lastJobStatusHandler,
|
||
|
"/jenkins/fix-time/:hostname/:job*": buildFixTimeHandler,
|
||
|
"/jenkins/broken-build/:hostname/:job*": brokenBuildsHandler,
|
||
|
},
|
||
![]() |
})
|
||
![]() |
|
||
|
const shortEnglishHumanizer = humanizeDuration.humanizer({
|
||
|
language: "shortEn",
|
||
|
units: ["d", "h"],
|
||
|
round: true,
|
||
|
languages: {
|
||
|
shortEn: {
|
||
|
y: () => "y",
|
||
|
mo: () => "mo",
|
||
|
w: () => "w",
|
||
|
d: () => "d",
|
||
|
h: () => "h",
|
||
|
m: () => "m",
|
||
|
s: () => "s",
|
||
|
ms: () => "ms",
|
||
|
},
|
||
|
},
|
||
![]() |
})
|
||
![]() |
|
||
|
const statusToColor = (status: string) => {
|
||
![]() |
return status.toUpperCase() === "SUCCESS" ? "green" : "red"
|
||
|
}
|
||
![]() |
|
||
|
const brokenBuildsToColor = (count: number) => {
|
||
![]() |
return count < 10 ? "green" : count < 20 ? "orange" : "red"
|
||
|
}
|
||
![]() |
const buildFixTimeToColor = (hours: number) => {
|
||
![]() |
return hours < 2 ? "green" : hours < 6 ? "orange" : "red"
|
||
|
}
|
||
![]() |
|
||
|
async function jenkinsLastBuild({ hostname, job }: PathArgs) {
|
||
![]() |
const endpoint = `https://${hostname}/${job}/lastBuild/api/json?tree=result,timestamp,estimatedDuration`
|
||
|
return await got(endpoint).json<any>()
|
||
![]() |
}
|
||
|
|
||
|
async function jenkinsBuilds({ hostname, job }: PathArgs) {
|
||
![]() |
const endpoint = `https://${hostname}/${job}/api/json?tree=builds[number,status,timestamp,id,result]`
|
||
|
return await got(endpoint).json<any>()
|
||
![]() |
}
|
||
|
|
||
|
async function lastJobStatusHandler({ hostname, job }: PathArgs) {
|
||
![]() |
const response = await jenkinsLastBuild({ hostname, job })
|
||
![]() |
return {
|
||
|
subject: "Last Build",
|
||
|
status: response.result,
|
||
|
color: statusToColor(response.result),
|
||
![]() |
}
|
||
![]() |
}
|
||
|
|
||
|
async function brokenBuildsHandler({ hostname, job }: PathArgs) {
|
||
![]() |
const response = await jenkinsBuilds({ hostname, job })
|
||
![]() |
const brokenBuilds = response.builds.filter(function (build) {
|
||
![]() |
return build.result.toUpperCase() !== "SUCCESS"
|
||
|
})
|
||
![]() |
return {
|
||
|
subject: "Broken Builds",
|
||
|
status: brokenBuilds.length,
|
||
|
color: brokenBuildsToColor(brokenBuilds.length),
|
||
![]() |
}
|
||
![]() |
}
|
||
|
|
||
|
async function buildFixTimeHandler({ hostname, job }: PathArgs) {
|
||
![]() |
const response = await jenkinsBuilds({ hostname, job })
|
||
![]() |
|
||
![]() |
var lastSuccessTime = 0
|
||
|
var lastFailTime = 0
|
||
![]() |
|
||
|
for (let index = 0; index < response.builds.length; index++) {
|
||
![]() |
const element = response.builds[index]
|
||
![]() |
if (element.result.toUpperCase() == "SUCCESS") {
|
||
![]() |
lastSuccessTime = element.timestamp
|
||
|
lastFailTime = lastSuccessTime
|
||
![]() |
} else {
|
||
![]() |
lastFailTime = element.timestamp
|
||
|
break
|
||
![]() |
}
|
||
|
}
|
||
![]() |
if (lastSuccessTime == 0) lastSuccessTime = new Date().getTime()
|
||
|
if (lastFailTime == 0) lastFailTime = lastSuccessTime
|
||
![]() |
|
||
|
return {
|
||
|
subject: "Fix Time",
|
||
|
status: `${shortEnglishHumanizer((lastSuccessTime - lastFailTime) | 0)}`,
|
||
|
color: buildFixTimeToColor(
|
||
|
((lastSuccessTime - lastFailTime) / 3600000) | 0
|
||
|
),
|
||
![]() |
}
|
||
![]() |
}
|