如何在Jenkins参数化构建中添加代理目录下的文件/文件夹选择参数?
实现Jenkins流水线参数化选择代理节点文件/文件夹
问题修正
你之前的脚本错误在于使用了流水线运行阶段的node/stage语法——Active Choices参数的脚本是构建触发前执行的,不能直接套用流水线块,需要通过Jenkins API直接访问目标节点的文件系统。
解决方案步骤
- 在流水线项目中添加「Active Choices Parameter」,参数类型选择Multi Select(对应复选框)
- 使用以下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
相关产品推荐
相关产品推荐

