如何在含云动态节点的所有Jenkins节点上执行维护任务?
在动态云节点的Jenkins环境中批量执行维护任务
你已经通过以下代码获取目标节点名称:
def nodeNames(label) { def nodes = [] jenkins.model.Jenkins.instance.computers.each { c -> if (c.node.labelString.contains(label) && c.online) { // 新增在线判断,跳过离线节点 nodes.add(c.node.selfLabel.name) } } return nodes }
声明式流水线实现
声明式本身不支持动态循环,但可以通过script块结合parallel实现批量执行,示例如下:
pipeline { agent any stages { stage('在所有目标节点执行维护任务') { steps { script { def targetLabel = 'your-target-label' // 替换成你的目标标签 def nodes = nodeNames(targetLabel) def parallelTasks = [:] nodes.each { nodeName -> parallelTasks["维护节点: ${nodeName}"] = { node(nodeName) { echo "开始在节点 ${nodeName} 执行维护任务" // 这里替换成你的维护任务代码,比如: // sh 'sudo apt-get update && sudo apt-get upgrade -y' echo "节点 ${nodeName} 维护任务完成" } } } parallel parallelTasks } } } } post { always { echo "所有节点维护任务执行结束" } } }
脚本式流水线实现
脚本式逻辑更直接,支持串行或并行执行任务,示例如下:
def targetLabel = 'your-target-label' def nodes = nodeNames(targetLabel) // 串行执行(逐个节点处理) nodes.each { nodeName -> node(nodeName) { stage("维护节点: ${nodeName}") { echo "开始在节点 ${nodeName} 执行维护任务" // 替换为你的维护任务命令 // sh 'your-maintenance-command' echo "节点 ${nodeName} 维护任务完成" } } } // 或者并行执行(效率更高) def parallelTasks = [:] nodes.each { nodeName -> parallelTasks["维护节点: ${nodeName}"] = { node(nodeName) { stage("维护节点: ${nodeName}") { echo "开始在节点 ${nodeName} 执行维护任务" // 维护任务代码 echo "节点 ${nodeName} 维护任务完成" } } } } parallel parallelTasks
注意事项
- 权限问题:
jenkins.model.Jenkins.instance需要流水线拥有脚本执行权限,需在Jenkins全局安全配置中通过In-process Script Approval插件批准相关脚本。 - 离线节点处理:代码中新增
c.online判断,自动跳过离线节点,避免任务失败。 - 动态节点稳定性:云动态节点可能在执行过程中被销毁,建议在任务执行前确认节点状态,或配置节点在任务期间不被回收。
内容的提问来源于stack exchange,提问作者Shad_zam
相关产品推荐
相关产品推荐

