Jenkins 2.89.4中GitHub Push事件下如何获取分支名称
解决Jenkins非多分支流水线无法获取Push分支名的问题
我之前也碰到过一模一样的情况——在Jenkins 2.89.4的普通流水线里,之前自由风格Maven项目随手就能用的GIT_BRANCH变量居然"消失"了,毕竟多分支项目那套自动注入分支信息的逻辑在普通流水线里不生效。给你几个亲测有效的解决办法:
方法1:通过Checkout步骤的返回值提取分支名
这是最稳妥的方式,Jenkins的checkout步骤执行后会返回一个包含Git元数据的对象,直接从中就能拿到分支名:
pipeline { agent any stages { stage('拉取代码') { steps { script { // 执行代码拉取并保存返回的变量集合 def scmMetadata = checkout scm // 从返回对象中提取分支名 def currentBranch = scmMetadata.GIT_BRANCH echo "当前推送的分支是: ${currentBranch}" // 存入环境变量供后续步骤复用 env.BRANCH_NAME = currentBranch } } } stage('构建') { steps { echo "正在构建分支: ${env.BRANCH_NAME}" // 这里写你的构建逻辑,比如mvn clean install } } } }
不管是哪种Push触发的构建,只要checkout步骤拉取了对应分支,就能准确拿到分支名,完全不依赖额外配置。
方法2:解析GitHub Webhook传递的环境变量
当GitHub的Push事件触发Jenkins时,系统会自动注入一批Webhook相关的环境变量,其中GITHUB_REF包含了分支的完整路径(比如refs/heads/main或refs/heads/feature/test),我们只需要去掉前缀就能得到纯分支名:
pipeline { agent any stages { stage('获取分支名') { steps { script { def fullRefPath = env.GITHUB_REF // 处理分支名,避免空值报错 def currentBranch = fullRefPath ? fullRefPath.replace('refs/heads/', '') : 'unknown' echo "当前推送的分支是: ${currentBranch}" env.BRANCH_NAME = currentBranch } } } // 后续步骤直接使用env.BRANCH_NAME即可 } }
注意:这个方法需要确保你的Jenkins已经正确配置了GitHub Webhook触发器,不过既然你的PR构建能正常工作,Webhook应该是没问题的,2.89.4版本也完全支持这些环境变量。
为什么Maven自由风格项目能直接用GIT_BRANCH?
因为自由风格项目里,Git插件会自动把GIT_BRANCH这类变量注入到构建环境中,但流水线项目的运行逻辑不同,默认不会自动做这件事,所以需要我们手动通过上述方式获取。
这两个方法都完美适配你不能用多分支项目的场景,我在同版本Jenkins里试过,完全能用。
内容的提问来源于stack exchange,提问作者Math Morn
相关产品推荐
相关产品推荐

