Jenkins pipeline get other jobs status by curl

Requirement
- We have job_A, job_B & job_C
- Whenever job_B or job_C is built (all cases of Success or Failure or Unstable), job_A will be triggered automatically
- Job_A will get its upstream job status bu Jenkins API

Solution
- Go to your Jenkins Credentials (like http://localhost:8080/credentials/store/system/domain/_/newCredentials) and create a "Username and Password" kind credential with ID as MY_TOKEN
- Install jq & curl onto the agent machine. Ubuntu can use "sudo apt-get install jq curl"
- Jenkins pipeline (scripted type)

properties([
    parameters([
        string( name: 'NODE_LABEL', defaultValue: 'my_node', description: 'Agent to run this job, should have curl and jq installed', trim: true),
        booleanParam(name: 'DELETE_WS', defaultValue: true, description: 'Delete workspace before operation, to ensure clean results'),
        string( name: 'JENKINS_URL', defaultValue: 'http://localhost:8080', description: 'JENKINS MASTER URL of upstream projects', trim: true),
        string(name: 'UPSTREAMPROJECTS', defaultValue: 'job_B,job_C', description: 'Build this project after one of these upstream projects built. Comma seperate.', trim: true)
    ]),

    buildDiscarder(logRotator(numToKeepStr: '100')),
    pipelineTriggers([
        upstream(upstreamProjects: params.UPSTREAMPROJECTS, threshold: 'FAILURE')
    ])
])

node(params.NODE_LABEL) {
    dir(env.WORKSPACE.replaceAll('@.+', '')) {
        catchError {
            stage('Preparing workspace') {
                if (params.DELETE_WS) {
                    deleteDir()
                }
            }

            stage("Parse job info") {

                def jobName = currentBuild.getBuildCauses()[0].upstreamProject
                println jonName
                def buildNumber = currentBuild.getBuildCauses()[0].upstreamBuild
                println buildNumber
                def upstreamUrl = currentBuild.getBuildCauses()[0].upstreamUrl
                println upstreamUrl
                final String buildURL = "${params.JENKINS_URL}/${upstreamUrl}${buildNumber}"
                println buildURL
                final String URL = "${params.JENKINS_URL}/${upstreamUrl}${buildNumber}/api/json"
                env.ENVURL = URL

                withCredentials([usernameColonPassword(credentialsId: 'MY_TOKEN', variable: 'TOKEN')]) {
                   final def (String response, int code) =
                   sh(script: '''
                                 unset https_proxy
                                 unset http_proxy
                                 curl -s -w 'n%{response_code}' -u ${TOKEN} ${ENVURL}
                              '''
                            , returnStdout: true)
                            .trim()
                            .tokenize("n")

                    echo "HTTP response status code: $code"

                    if (code == 200) {
                        sh(script: "echo '$response' > response.json", returnStdout: true)

                        def buildDuration = sh(script: "jq -r '.duration' response.json", returnStdout: true).trim()
                        buildDuration = buildDuration.toInteger()/(3600000)
                        println buildDuration
                        def buildDateMili = sh(script: "jq -r '.timestamp' response.json", returnStdout: true).trim()
                        def buildDate = new Date(buildDateMili as long).format("yyyy-MM-dd HH:mm")
                        println buildDate
                        def buildStatus = sh(script: "jq -r '.result' response.json", returnStdout: true).trim()
                        print buildStatus
                    }
                }
            }
        }
    }
}
Loading