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

如何编写Jenkins流水线实现运行时动态选择Agent?

Jenkins流水线动态选择静态/动态Agent解决方案

核心实现思路

通过在流水线的agent块中嵌入Groovy分支逻辑,根据传入的AGENT_TYPE参数,动态绑定静态标签节点或Kubernetes动态Agent,同时复用其他参数完成对应配置。


声明式流水线完整示例

这是最常用的声明式写法,兼顾可读性与灵活性:

pipeline {
    agent none // 全局不预设Agent,由阶段动态选择
    parameters {
        choice(name: 'AGENT_TYPE', choices: ['static', 'dynamic'], description: '选择Agent类型')
        choice(name: 'AGENT_OS', choices: ['linux', 'windows'], description: '静态Agent操作系统标签')
        string(name: 'AGENT_IMAGE', defaultValue: 'jenkins/inbound-agent:latest', description: '动态Agent镜像地址')
        string(name: 'AGENT_CLOUD', defaultValue: 'kubernetes', description: 'Kubernetes云实例名称')
    }

    stages {
        // 可选:参数合法性校验
        stage('参数校验') {
            agent none
            steps {
                script {
                    if (params.AGENT_TYPE == 'dynamic') {
                        if (!params.AGENT_IMAGE?.trim() || !params.AGENT_CLOUD?.trim()) {
                            error "选择动态Agent时,AGENT_IMAGE和AGENT_CLOUD参数不能为空!"
                        }
                    }
                }
            }
        }

        stage('执行构建') {
            agent {
                script {
                    // 根据AGENT_TYPE分支处理Agent配置
                    if (params.AGENT_TYPE == 'static') {
                        // 静态Agent:使用AGENT_OS标签匹配节点
                        return node(params.AGENT_OS)
                    } else {
                        // 动态Kubernetes Agent:用参数配置云实例与镜像
                        return kubernetes {
                            cloud params.AGENT_CLOUD
                            containerTemplate {
                                name 'builder'
                                image params.AGENT_IMAGE
                                ttyEnabled true // 保持容器运行
                                command 'cat'
                            }
                        }
                    }
                }
            }
            steps {
                echo "当前使用Agent类型: ${AGENT_TYPE}"
                // 根据操作系统执行不同命令
                script {
                    if (params.AGENT_OS == 'linux' || params.AGENT_TYPE == 'dynamic') {
                        sh 'echo "Agent环境信息:" && uname -a'
                    } else if (params.AGENT_OS == 'windows') {
                        powershell 'echo "Agent环境信息:" && systeminfo'
                    }
                }
            }
        }
    }
}

关键细节说明

  1. 全局agent none:避免流水线启动时自动绑定Agent,让每个阶段可以独立选择节点
  2. script块实现动态分支:声明式流水线的agent块支持嵌入script代码,通过Groovy逻辑返回不同的Agent配置:
    • 静态Agent:直接返回node(params.AGENT_OS),利用AGENT_OS标签匹配对应的虚拟机/裸金属节点
    • 动态Kubernetes Agent:返回kubernetes配置块,复用AGENT_CLOUD指定Jenkins配置的Kubernetes云,AGENT_IMAGE指定构建容器镜像
  3. 参数校验:可选的校验阶段可以提前拦截非法参数,避免构建失败

脚本化流水线实现(可选)

如果更习惯脚本化流水线的写法,逻辑会更直观:

properties([
    parameters([
        choice(name: 'AGENT_TYPE', choices: ['static', 'dynamic'], description: '选择Agent类型'),
        choice(name: 'AGENT_OS', choices: ['linux', 'windows'], description: '静态Agent操作系统标签'),
        string(name: 'AGENT_IMAGE', defaultValue: 'jenkins/inbound-agent:latest', description: '动态Agent镜像地址'),
        string(name: 'AGENT_CLOUD', defaultValue: 'kubernetes', description: 'Kubernetes云实例名称')
    ])
])

// 参数校验
stage('参数校验') {
    node {
        if (params.AGENT_TYPE == 'dynamic') {
            if (!params.AGENT_IMAGE?.trim() || !params.AGENT_CLOUD?.trim()) {
                error "动态Agent必须填写AGENT_IMAGE和AGENT_CLOUD参数"
            }
        }
    }
}

// 动态生成Agent配置
def agentTarget = params.AGENT_TYPE == 'static' ? params.AGENT_OS : 
    kubernetesCloud(
        cloud: params.AGENT_CLOUD,
        containers: [
            containerTemplate(
                name: 'builder',
                image: params.AGENT_IMAGE,
                ttyEnabled: true,
                command: 'cat'
            )
        ]
    )

// 使用动态配置的Agent执行构建
node(agentTarget) {
    stage('执行构建') {
        echo "当前Agent类型: ${AGENT_TYPE}"
        if (params.AGENT_OS == 'linux' || params.AGENT_TYPE == 'dynamic') {
            sh 'uname -a'
        } else {
            powershell 'systeminfo'
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:43:20