Check if Agent Node is online

Viewed 64

I'm trying to connect to couple of my Jenkins agents and run some commands on each of them. After researching, follow the answer from this link, this Jenkinsfile code works fine:

pipeline {
    agent none
    stages {
        stage('Check') {            
            matrix {
                agent {
                    label "${SLAVE}"
                }
   
                axes {
                    axis {
                        name 'SLAVE'
                        values "slv1", "slv2",
                        "slv3"
                    }
                }
                stages {
                    stage('do something') {
                        steps {
                            sh 'hostname'
                        }
                    }
                }
            }
        }
    }
}

But I want to check each of nodes is online or not before doing anything. I haven't had any luck with what I've tried. This is my latest trying:

Boolean finalResult = true

def checkStatus(String nodeName){
    Node cleanUpNode = Jenkins.instance.getNode(nodeName)
        Computer computer = cleanUpNode.toComputer()

        if (cleanUpNode == null) {
            println("ERROR: Node ${nodeName} doesn't exist")
            finalResult = false
            continue
        }

        if (computer.countBusy()) {
            println("WARNING: Ignore ${nodeName} as it is busy")
            continue
        }
        if (computer.isOffline())
        {
            println "Error! Node ${nodeName} is offline.";
            finalResult = false
            continue
        }
    return finalResult    
}

pipeline {
    agent none
    stages {
        stage('Check') {            
            matrix {
                agent {
                    label "${SLAVE}"
                }
                when {
                      expression { checkStatus(${SLAVE}) == true }
                }
                axes {
                    axis {
                        name 'SLAVE'
                        values "slv1", "slv2",
                        "slv3"
                    }
                }
                stages {
                    stage('do something') {
                        steps {
                            sh 'hostname'
                        }
                    }
                }
            }
        }
    }
}

My first idea is create an array to store all the nodes, then check it and assign variable into it through values in axis. But this idea is not supported

Can anyone help? Thanks in advance!

0 Answers
Related