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

如何在Jenkins参数化构建中添加代理目录下的文件/文件夹选择参数?

实现Jenkins流水线参数化选择代理节点文件/文件夹

问题修正

你之前的脚本错误在于使用了流水线运行阶段的node/stage语法——Active Choices参数的脚本是构建触发前执行的,不能直接套用流水线块,需要通过Jenkins API直接访问目标节点的文件系统。

解决方案步骤

  1. 在流水线项目中添加「Active Choices Parameter」,参数类型选择Multi Select(对应复选框)
  2. 使用以下Groovy脚本获取目标节点node1的c:\project目录下所有递归文件/文件夹:
// 指定目标代理节点名称
def targetNode = "node1"
// 获取Jenkins节点实例
def node = Jenkins.instance.getNode(targetNode)

if (!node) {
    return ["错误:代理节点 ${targetNode} 不存在"]
}

// 目标目录路径
def dirPath = "c:\\project"
def filePath = node.createPath(dirPath)

if (!filePath.exists()) {
    return ["错误:目录 ${dirPath} 不存在"]
}

// 递归收集所有文件和文件夹的绝对路径
def items = []
filePath.listFiles().each { item ->
    items.add(item.getRemote())
}

// 返回排序后的选项列表
return items.sort()

可选:用PowerShell命令实现

如果更习惯PowerShell语法,也可以用以下脚本通过节点执行PowerShell命令获取结果:

def targetNode = "node1"
def node = Jenkins.instance.getNode(targetNode)

if (!node) {
    return ["错误:代理节点不存在"]
}

// 执行PowerShell命令获取递归文件路径
def output = node.channel.call {
    def psCmd = "Get-ChildItem -Path 'c:\\project' -Recurse | Select-Object -ExpandProperty FullName"
    new hudson.util.ArgumentListBuilder("powershell.exe", "-Command", psCmd).execute().text
}

// 处理输出,过滤空行并排序
return output.split("\n").findAll { it.trim() != "" }.sort()

注意事项

  • 确保Jenkins服务账号拥有目标代理节点c:\project目录的读取权限
  • 如果遇到脚本权限问题,需要在Jenkins全局安全配置中授权该脚本访问Jenkins API(通过Script Security插件)
  • 若需要相对路径而非绝对路径,可修改脚本中item.getRemote()的处理逻辑,截取相对部分

内容的提问来源于stack exchange,提问作者Amosc91

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:33:14