如何通过参数输入让Jenkins任务在多个选中节点上运行?
解决Jenkins多选节点仅执行第一个的问题
你的问题出在流水线顶级agent固定绑定了单个节点,即使参数选了多个节点,整个流水线只会在第一个匹配的节点上运行。要实现多节点执行,需要动态遍历所有选中的节点,在每个节点上独立执行任务。
步骤1:确认参数配置
确保你的Node参数开启了多选功能,返回的节点标签是用逗号(或空格)分隔的字符串(比如node1,node2,node3)。
步骤2:修改流水线代码
将顶级agent设为none,然后在stage中通过遍历选中的节点列表,用parallel(并行)或循环(串行)的方式在每个节点上执行任务。
并行执行版本(推荐,效率更高)
pipeline { agent none // 不绑定全局节点 parameters { nodeParam( name: 'TARGET_NODES', description: '选择要执行任务的节点', allowedNodes: '.*', // 匹配所有节点,可自定义正则 allowMultiSelection: true, // 开启多选 defaultValue: '' ) booleanParam(name: 'CONFIRM_RUN', defaultValue: false, description: '确认执行') stringParam(name: 'Service_start', description: '要启动的服务名称') } environment { SERV = "${params.Service_start}" } stages { stage('在选中节点启动服务') { when { expression { params.CONFIRM_RUN } } steps { script { // 将选中的节点字符串拆分为列表 def targetNodes = params.TARGET_NODES.split(',')*.trim() // 构建并行任务映射 def parallelTasks = targetNodes.collectEntries { nodeLabel -> ["在节点 ${nodeLabel} 执行": { node(nodeLabel) { // 绑定当前节点 dir('service-start') { bat "net start \"${env.SERV}\" /y" } cleanWs() // 每个节点执行后清理工作区 } }] } // 执行并行任务 parallel parallelTasks } } } } post { always { echo "任务执行完成" } } }
串行执行版本(逐个节点执行)
如果不需要并行,也可以用循环逐个执行:
pipeline { agent none parameters { nodeParam( name: 'TARGET_NODES', description: '选择要执行任务的节点', allowedNodes: '.*', allowMultiSelection: true, defaultValue: '' ) booleanParam(name: 'CONFIRM_RUN', defaultValue: false, description: '确认执行') stringParam(name: 'Service_start', description: '要启动的服务名称') } environment { SERV = "${params.Service_start}" } stages { stage('在选中节点启动服务') { when { expression { params.CONFIRM_RUN } } steps { script { def targetNodes = params.TARGET_NODES.split(',')*.trim() targetNodes.each { nodeLabel -> stage("在节点 ${nodeLabel} 执行") { node(nodeLabel) { dir('service-start') { bat "net start \"${env.SERV}\" /y" } cleanWs() } } } } } } } post { always { echo "任务执行完成" } } }
关键说明
agent none:让流水线不提前绑定节点,而是在每个子任务中动态分配split(',')*.trim():将多选返回的逗号分隔字符串拆分为节点标签列表,去除空格parallel:同时在多个节点上执行任务,大幅提升效率;如果节点资源有限,改用串行循环即可node(nodeLabel):在每个任务块中绑定对应的节点,确保命令在目标节点上执行
内容的提问来源于stack exchange,提问作者sabfty
相关产品推荐
相关产品推荐

