Jenkins Groovy脚本如何替换已废弃的cliOnline()节点上线方法
批量上线Jenkins节点非废弃API实现方案
改动点说明
- 废弃方法替换:原脚本使用的
cliOnline()是Jenkins内部专供CLI调用的非公开方法,已标记废弃,替换为hudson.model.Computer类公开稳定的connect(boolean force)方法,功能完全对齐,无兼容性风险。 - 修复原脚本语法问题:原代码打印上线后状态的行缺失字符串拼接符
+,改写后用Groovy原生字符串插值修复,可读性更高。 - 补充异常边界判断:增加节点Computer实例空判断,避免特殊状态节点触发空指针异常;增加短等待时间,避免状态打印时连接流程还未完成导致结果不准。
可直接运行的改写后脚本
import jenkins.model.Jenkins // 待上线节点名称关键词列表 def nodesChecklist = ["PD100069", "PD100070", "PD100090", "PD10756"] def allNodes = Jenkins.instance.getNodes() nodesChecklist.each { keyword -> allNodes.each { node -> def nodeName = node.nodeName if (nodeName.contains(keyword)) { def computer = node.toComputer() if (!computer) { println "跳过节点 ${nodeName}:实例状态异常,无法获取计算对象" return } println "节点 ${nodeName} 当前离线状态:${computer.offline}" if (computer.offline) { println "正在触发节点 ${nodeName} 上线..." // 非废弃API:强制发起节点连接,替代原cliOnline() computer.connect(true) // 等待连接流程初始化 Thread.sleep(1000) println "节点 ${nodeName} 当前在线状态:${computer.online}" } } } } // 持久化配置变更(可选,部分Jenkins版本需要执行) Jenkins.instance.save()
可选:基于OnlineNodeCommand的实现
如果你需要严格复用Jenkins CLI上线命令的内置逻辑(比如统一CLI层的权限校验、日志输出规则),可以将上线逻辑替换为如下代码,但常规运维场景直接使用上面的connect()方法更轻量,不需要额外处理CLI命令的依赖初始化:
import hudson.cli.OnlineNodeCommand import jenkins.model.Jenkins import java.io.PrintWriter def onlineCmd = new OnlineNodeCommand() onlineCmd.channel = Jenkins.instance.masterComputer.channel onlineCmd.execute(null, Locale.default, [nodeName] as String[], new PrintWriter(System.out, true))
提示:脚本需在Jenkins管理后台的「脚本控制台」执行,执行账号需具备管理员权限,建议先在测试环境验证后再操作生产实例。
内容的提问来源于stack exchange,提问作者Mads Sander Høgstrup
相关产品推荐
相关产品推荐

