Jenkins声明式流水线能否基于Git分支设置Agent?
Jenkins声明式流水线:基于Git分支动态设置Agent
别担心,Jenkins声明式流水线完全支持基于Git分支来指定Agent!你觉得when块行不通是因为它主要用来控制阶段(stage)的执行逻辑,而Agent的动态配置其实可以通过表达式直接实现,不用依赖when块。
下面给你两种实用的实现方式:
方式一:直接在agent块中嵌入分支判断逻辑
利用Jenkins自动注入的env.BRANCH_NAME环境变量(只要是Git触发的流水线都会自动填充当前分支名),你可以在agent的节点配置里直接写条件表达式,动态选择对应标签的节点:
pipeline { agent { node { // 主分支用生产环境Agent,其他分支用开发环境Agent label "${env.BRANCH_NAME == 'main' ? 'production-node' : 'development-node'}" } } stages { stage('Build & Test') { steps { echo "当前分支:${env.BRANCH_NAME},运行在Agent节点:${env.NODE_NAME}" } } } }
方式二:先定义环境变量再引用(适合复杂分支规则)
如果你的分支规则比较多(比如release前缀分支、hotfix分支等),可以先在environment块里提前计算好要使用的Agent标签,再在agent块中引用,这样代码可读性更高:
pipeline { environment { // 多分支场景下的Agent标签判断 AGENT_LABEL = """ ${env.BRANCH_NAME == 'main' ? 'prod-agent' : env.BRANCH_NAME ==~ 'release/.*' ? 'staging-agent' : env.BRANCH_NAME ==~ 'hotfix/.*' ? 'hotfix-agent' : 'default-dev-agent'} """.trim() } agent { label "${AGENT_LABEL}" } stages { stage('Deploy') { steps { echo "为分支${env.BRANCH_NAME}分配的Agent标签:${AGENT_LABEL}" } } } }
小提醒
- 确保你的Jenkins节点已经配置好对应的标签,不然流水线会因为找不到匹配的节点而停滞;
- 如果是手动触发流水线,记得在触发时指定目标分支,否则
env.BRANCH_NAME可能为空或者是默认分支名; - 除了标签,你也可以用类似的逻辑动态选择Docker镜像作为Agent,只要把label换成docker配置即可。
内容的提问来源于stack exchange,提问作者David Williams
相关产品推荐
相关产品推荐

