diff --git a/jenkins/pipelines/post-build-status-update.jenkinsfile b/jenkins/pipelines/post-build-status-update.jenkinsfile new file mode 100644 index 000000000..7a9e58048 --- /dev/null +++ b/jenkins/pipelines/post-build-status-update.jenkinsfile @@ -0,0 +1,70 @@ +#!/usr/bin/env groovy + +// DESCRIPTION: +// Sends the status of a node-test-commit-* sub build to the Github Bot, which +// then updates the corresponding PR's CI status on github.com. + +import groovy.json.JsonOutput + +pipeline { + agent { label 'jenkins-workspace' } + + parameters { + string(defaultValue: '', description: 'test/aix, linter, etc.', name: 'IDENTIFIER') + string(defaultValue: '', description: 'pending, success, unstable, failure', name: 'STATUS') + string(defaultValue: '', description: 'URL for upstream Jenkins job', name: 'URL') + string(defaultValue: '', description: 'Current commit being tested in upstream Jenkins job', name: 'COMMIT') + string(defaultValue: '', description: 'Current branch being tested in upstream Jenkins job', name: 'REF') + } + + stages { + stage('Send status report') { + steps { + validateParams(params) + sendBuildStatus(params.IDENTIFIER, params.STATUS, params.URL, params.COMMIT, params.REF) + } + } + } +} + +def sendBuildStatus(identifier, status, url, commit, ref) { + def path = "" + def message = "" + + if (status == "pending") { + path = "start" + message = "running tests" + } else if (status == "failure") { + path = "end" + message = "tests failed" + } else if (status == "unstable") { + path = "end" + message = "flaky tests failed" + status = "success" + } else if (status == "success") { + path = "end" + message = "tests passed" + } + + def buildPayload = JsonOutput.toJson([ + 'identifier': identifier, + 'status': status, + 'url': url, + 'commit': commit, + 'ref': ref, + 'message': message + ]) + + def script = "curl -s -o /dev/null --connect-timeout 5 -X POST " + + "-H 'Content-Type: application/json' -d '${buildPayload}' " + + "http://github-bot.nodejs.org:3333/node/jenkins/${path}" + + sh(returnStdout: true, script: script) +} + +def validateParams(params) { + if (params.IDENTIFIER == '' || params.STATUS == '' || params.URL == '' || + params.COMMIT == '' || params.REF == '') { + error('All parameter fields are required.') + } +}