如何编写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' } } } } } }
关键细节说明
- 全局
agent none:避免流水线启动时自动绑定Agent,让每个阶段可以独立选择节点 script块实现动态分支:声明式流水线的agent块支持嵌入script代码,通过Groovy逻辑返回不同的Agent配置:- 静态Agent:直接返回
node(params.AGENT_OS),利用AGENT_OS标签匹配对应的虚拟机/裸金属节点 - 动态Kubernetes Agent:返回
kubernetes配置块,复用AGENT_CLOUD指定Jenkins配置的Kubernetes云,AGENT_IMAGE指定构建容器镜像
- 静态Agent:直接返回
- 参数校验:可选的校验阶段可以提前拦截非法参数,避免构建失败
脚本化流水线实现(可选)
如果更习惯脚本化流水线的写法,逻辑会更直观:
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
相关产品推荐
相关产品推荐

