Jenkins Pipeline作业如何设置分支名变量 解决BRANCH_NAME返回null问题
问题原因
env.BRANCH_NAME返回null的核心原因是:该变量是Jenkins 多分支流水线(Multibranch Pipeline) 类型任务专属的自动注入环境变量,普通单分支Pipeline任务、自由风格任务默认不会注入这个变量,直接读取自然返回null。
不同场景下的正确配置方法
场景1:使用多分支流水线任务
这类任务不需要手动定义分支变量,Jenkins会在构建触发时自动为env.BRANCH_NAME赋值为当前构建对应的分支名,直接读取使用即可,参考脚本:node{ // 多分支流水线自动注入变量,可直接调用 echo "当前构建分支:${env.BRANCH_NAME}" }注意不要在脚本全局作用域提前定义同名局部变量覆盖环境变量,避免取值异常。
场景2:使用普通单分支Pipeline任务
这类任务默认没有自动注入的分支名变量,需要在拉取代码的步骤执行完成后,手动解析获取分支名,常用实现方式有3种:- 通过checkout步骤的返回值解析
Git插件执行完拉取动作后会返回SCM元信息,从中截取分支名即可:
node{ // 先执行代码拉取 def scmMeta = checkout scm // Git返回的分支名带refs/heads/前缀,需要截掉 def BRANCH_NAME = scmMeta.GIT_BRANCH.replaceFirst('refs/heads/', '') echo "当前构建分支:${BRANCH_NAME}" }- 通过Git命令直接获取
拉取代码后执行原生Git命令读取当前分支,兼容性最好:
node{ checkout scm // 执行git命令拿短分支名,trim()用来去掉命令输出末尾的换行符 def BRANCH_NAME = sh(script: 'git rev-parse --abbrev-ref HEAD', returnStdout: true).trim() echo "当前构建分支:${BRANCH_NAME}" }- 读取构建参数
如果你的任务配置了分支选择类的构建参数(比如参数名为BRANCH),可以直接读取参数值作为分支名:
node{ def BRANCH_NAME = params.BRANCH echo "当前构建分支:${BRANCH_NAME}" }- 通过checkout步骤的返回值解析
注意事项
不要在node块外、checkout步骤执行前尝试读取分支名变量,此时还未完成代码拉取、SCM元信息还未生成,会出现取值为null的问题。
内容的提问来源于stack exchange,提问作者Ashish Rajbanshi
相关产品推荐
相关产品推荐

