Jenkins管道分支名称返回null

时间:2017-05-03 21:09:08

标签: git jenkins groovy

我试图获取jenkins groovy脚本的分支名称。我无法获得当前的分支名称。我尝试以下方法:

stage('Check out code')
checkout scm
echo "My branch is: ${env.BRANCH_NAME}"

这是输出 - 它总是返回null。

 Checking out Revision 33b531b2f1caaf8b64d968e437306f39d2dba1da   (origin/pipeline)
  > git.exe config core.sparsecheckout # timeout=10
  > git.exe checkout -f 33b531b2f1caaf8b64d968e437306f39d2dba1da
 [Pipeline] echo
 My branch is: null

我错过了什么吗?

7 个答案:

答案 0 :(得分:29)

此变量仅适用于多分支管道:

BRANCH_NAME     对于multibranch项目,这将设置为正在构建的分支的名称,例如,如果您希望从master而不是从功能分支部署到生产。

我在正常的pipline中进行测试

答案 1 :(得分:5)

我的解决方法,不知道是否为别人工作..

def branchName = getCurrentBranch()
echo 'My branch is' + branchName

def getCurrentBranch () {
    return sh (
        script: 'git rev-parse --abbrev-ref HEAD',
        returnStdout: true
    ).trim()
}

答案 2 :(得分:4)

git.exe checkout -f 33b531b2f1caaf8b64d968e437306f39d2dba1da

这会使git repo进入detached HEAD mode,就其本质而言,它没有分支。

来自Jenkinsfile

  

结帐步骤将从源代码管理中签出代码; scm是一个特殊变量,它指示结帐步骤克隆触发此管道运行的特定修订。

所以${env.BRANCH_NAME}为空。

如“Jenkins Workflow Checkout Accessing BRANCH_NAME and GIT_COMMIT”中所述,您可以使用groovy语法(在Jenkins管道DSL中进行调整)获取刚刚检出的SHA1:

sh 'git rev-parse HEAD > commit'
def commit = readFile('commit').trim()

答案 3 :(得分:4)

在詹金斯(Jenkins)中,有两个管道选项:

  1. 新项目->管道-> env.BRANCH_NAME返回分支null
  2. 新项目->多分支管道-> env.BRANCH_NAME返回分支master or branch name

答案 4 :(得分:3)

在管道作业中,我正在使用env.GIT_BRANCH解析为origin/{BRANCH}

对于多分支作业,env.GIT_BRANCH解析为{BRANCH}(否为origin/)。

答案 5 :(得分:0)

我有同样的问题,但我通过更改

解决了这个问题
println "${env.BRANCH_NAME}"

println "${BRANCH_NAME}"

注意我的插件也是以分离模式结帐:

git checkout -f e10a170e17fb5f9282f903a7b3cd17bd2e181dee

答案 6 :(得分:0)

通过简单的管道,您可以使用以下脚本:

\\...
stage('Test') {
        steps {
            script {
                branchName = sh(label: 'getBranchName', returnStdout: true, script: 'git rev-parse --abbrev-ref HEAD').trim()
                println branchName
            }   
        }
      } 
\\...