如何在Jenkins slave节点上执行Active Choice参数中的Groovy脚本
Active Choice Reactive Reference Parameter 中运行的Groovy脚本默认在Jenkins Master节点执行,无法直接指定slave运行,可通过以下两种方案实现需求:
方案一:通过Jenkins内置API在指定slave节点执行命令
该方案适合对实时性要求高,需要每次拉取参数时都实时执行脚本的场景,需要先在脚本审批页面放行用到的Jenkins API方法。
改造后的代码示例如下:
import jenkins.model.Jenkins import hudson.util.StreamTaskListener import java.io.ByteArrayOutputStream // 可替换为动态参数获取的节点名,比如新增一个名为SLAVE_NAME的选择参数后,这里写SLAVE_NAME即可动态获取选中的节点 def targetSlave = "你的目标slave节点名称" def node = Jenkins.instance.getNode(targetSlave) // 节点异常兜底 if (!node || !node.toComputer().isOnline()) { return ["目标slave节点不存在或离线,请检查节点状态"] } // 构造slave执行器 def listener = StreamTaskListener.fromStdout() def launcher = node.createLauncher(listener) def outputStream = new ByteArrayOutputStream() // 在slave节点执行python脚本,注意替换为slave上test.py的实际绝对路径 def exitCode = launcher.launch() .cmdAsSingleString("python /data/script/test.py") .stdout(outputStream) .start() .join() if (exitCode != 0) { return ["脚本执行失败,退出码:${exitCode}"] } // 返回结果供参数选项使用 return outputStream.toString().trim().tokenize()
注意事项:
- 首次运行会触发脚本权限拦截,需要到「Manage Jenkins → In-process Script Approval」中审批所有被拦截的方法
- 需确保目标slave已安装Python运行环境,且test.py文件已提前同步到对应路径
- 如果需要动态选择执行节点,可新增一个选择类参数,将节点名作为选项,脚本中直接引用该参数名即可拿到选中的节点名,实现按需选择执行节点
方案二:预生成结果缓存到Master
该方案适合对实时性要求不高的场景,不需要申请高危Groovy API权限,稳定性更高:
- 提前创建一个定时运行的流水线任务,配置在你需要的slave节点上执行test.py,将执行结果写入到Jenkins Master可以读取的文件或者Jenkins全局变量中
- Active Choice参数的Groovy脚本直接读取缓存的结果,拆分后返回作为选项即可
内容的提问来源于stack exchange,提问作者Alfred
相关产品推荐
相关产品推荐

