Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions lib/jenkins-ci-results.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { Writable } from 'node:stream'

import CLI from 'node-core-utils/lib/cli.js'
import Request from 'node-core-utils/lib/request.js'
import { PRBuild } from 'node-core-utils/lib/ci/build-types/pr_build.js'

import { createPrComment } from './github-comment.js'

export function extractBuildNumber (build) {
// e.g. https://ci.nodejs.org/job/node-test-pull-request/21633/
const match = /\/job\/node-test-pull-request\/(\d+)/.exec(build.url || '')
return match ? parseInt(match[1], 10) : null
}

export async function fetchResultsMarkdown (buildNumber) {
// node-core-utils insists on writing progress output to a stream
const nullStream = new Writable({ write (chunk, encoding, callback) { callback() } })
const cli = new CLI(nullStream)
const request = new Request({
jenkins: Buffer.from(process.env.JENKINS_API_CREDENTIALS).toString('base64')
})

const prBuild = new PRBuild(cli, request, buildNumber)
await prBuild.getResults()
return prBuild.formatAsMarkdown()
}

export async function postBuildResults (options, build, fetchResults = fetchResultsMarkdown) {
const { pr } = options
const buildNumber = extractBuildNumber(build)

const traceFields = { pr, job: build.identifier, gitRef: build.ref, buildNumber }
const logger = options.logger.child(traceFields, true)

if (!process.env.JENKINS_API_CREDENTIALS) {
logger.info('JENKINS_API_CREDENTIALS is not set, skipping CI results comment')
return
}

if (buildNumber === null) {
logger.warn('Unable to find build number in build URL, skipping CI results comment')
return
}

const markdown = await fetchResults(buildNumber)

if (!markdown) {
logger.warn('Got no CI results back from node-core-utils, skipping CI results comment')
return
}

await createPrComment({ issue_number: pr, ...options, logger }, markdown)
logger.info('Jenkins CI results comment posted')
}
9 changes: 9 additions & 0 deletions lib/push-jenkins-update.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import githubClient from './github-client.js'
import { createPrComment } from './github-comment.js'
import { postBuildResults } from './jenkins-ci-results.js'

export function pushStarted (options, build, cb) {
const pr = findPrInRef(build.ref)
Expand Down Expand Up @@ -54,6 +55,14 @@ export function pushEnded (options, build, cb) {

const optsWithPr = Object.assign({ pr }, options)

if (build.identifier === 'node-test-pull-request') {
// fetching the CI results involves many Jenkins API calls, so let them
// finish in the background instead of holding up the status update
postBuildResults(optsWithPr, build).catch((err) => {
logger.error(err, 'Error while posting Jenkins CI results')
})
}

findLatestCommitInPr(optsWithPr).then(latestCommit => {
const statusOpts = Object.assign({
sha: latestCommit.sha,
Expand Down
Loading