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

如何通过参数输入让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:31:03