You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 18:30:01