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
 | |
|     ),
 | |
|   }
 | |
| }
 |