jenkins 检查代理节点是否联机

pnwntuvh  于 2023-01-08  发布在  Jenkins
关注(0)|答案(1)|浏览(176)

我正在尝试连接几个Jenkins代理,并在每个代理上运行一些命令。经过研究,follow the answer from this link,下面的Jenkinsfile代码工作正常:

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'
                        }
                    }
                }
            }
        }
    }
}

但是我想在做任何事情之前检查每个节点是否在线。我已经尝试过了,但没有任何运气。这是我最近的尝试:

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'
                        }
                    }
                }
            }
        }
    }
}

我的第一个想法是创建一个数组来存储所有的节点,然后检查它,并通过axis中的values为它赋值。
有人能帮忙吗?先谢了!

y53ybaqx

y53ybaqx1#

重点关注checkStatus方法,它有一些常见的错误,无法工作。对我来说,Groovy沙箱中的工作如下。(您的管理员可能需要批准一些脚本签名)。
因为我使用标签而不是节点名,所以我添加了for循环。对于#nodesByLabel调用,您需要安装管道实用程序Jenkins插件。

def checkStatus (String nodeLabel) {

    for (final String nodeName : nodesByLabel(nodeLabel)) {
        Node node = Jenkins.instance.getNode(nodeName)
    
        if (node == null) {
            println("ERROR: Node ${nodeName} doesn't exist")
            return false
        }
    
        Computer computer = node.toComputer()
 
        // TODO skip this; the node is always busy at this point
        if (computer.countBusy()) {
            println("WARNING: Ignore ${nodeName} as it is busy")
            return false
        }

        if (computer.isOffline()) {
           println "Error! Node ${nodeName} is offline."
           return false
        }
    }
    return true
}

相关问题