在 Jenkins Pipeline/Jenkinsfile 中获取 git 分支名称

Get git branch name in Jenkins Pipeline/Jenkinsfile

我创建了一个 jenkins 管道,它正在从 scm 中提取管道脚本。
我将分支说明符设置为“all”,因此它建立在对任何分支的任何更改之上。

如何从 Jenkinsfile 访问导致此构建的分支名称?

除了

,我试过的所有东西都回显 null
sh(returnStdout: true, script: 'git rev-parse --abbrev-ref HEAD').trim()

始终是 master

如果您的管道有 jenkinsfile,请检查您在执行时是否在 environment variables 中看到您的分支名称。

您可以打印它们:

pipeline {
    agent any

    environment {
        DISABLE_AUTH = 'true'
        DB_ENGINE    = 'sqlite'
    }

    stages {
        stage('Build') {
            steps {
                sh 'printenv'
            }
        }
    }
}

然而,PR 91显示分支名称仅在某些管道配置中设置:

切换到多分支管道允许我访问分支名称。不建议使用常规管道。

一位同事告诉我使用 scm.branches[0].name,它奏效了。我将它包装到我的 Jenkinsfile 中的一个函数中:

def getGitBranchName() {
    return scm.branches[0].name
}

使用多分支管道作业类型,而不是普通的管道作业类型。多分支管道作业确实拥有描述分支的环境变量 env.BRANCH_NAME

在我的脚本中..

stage('Build') {
    node {
        echo 'Pulling...' + env.BRANCH_NAME
        checkout scm
        
    }
}

收益率...

Pulling...master

如果您使用构建参数作为分支说明符,仅从 scm.branches 获取名称是不够的,例如${BRANCH}。 您需要将该字符串扩展为真实姓名:

scm.branches.first().getExpandedName(env.getEnvironment())

请注意 getEnvironment() 必须是显式 getter 否则 env 将查找名为 environment.[=15 的环境变量=]

不要忘记您需要批准这些方法才能从沙箱中访问它们。

对我来说这很有效:(使用 Jenkins 2.150,使用简单的管道类型 - 不是多分支,我的分支说明符:'**')

echo 'Pulling... ' + env.GIT_BRANCH

输出:

Pulling... origin/myBranch

其中 myBranch 是功能分支的名称

这是针对简单的管道类型 - 不是多分支。使用詹金斯 2.150.1

environment { FULL_PATH_BRANCH = "${sh(script:'git name-rev --name-only HEAD', returnStdout: true)}" GIT_BRANCH = FULL_PATH_BRANCH.substring(FULL_PATH_BRANCH.lastIndexOf('/') + 1, FULL_PATH_BRANCH.length()) }

然后使用它env.GIT_BRANCH

对于管道:

pipeline {
  environment {
     BRANCH_NAME = "${GIT_BRANCH.split("/")[1]}"
  }
}

FWIW 在 PR 构建中唯一对我有用的是 ${CHANGE_BRANCH}

(可能不适用于 master,尚未看到)

要在 Jenkins 中获取 git 分支名称, 如果是多分支管道那么我们可以很容易地使用env.GIT_BRANCH。 但是如果是普通的管道那么我们可以使用SCM插件对象来检索分支名称。

以下代码适用于普通管道和多分支管道。

def branch_nem = scm.branches[0].name
if (branch_nem.contains("*/")) {
    branch_nem = branch_nem.split("\*/")[1]
    }
echo branch_nem

对于非多分支管道,将 SCM Branch Specifier (blank for 'any') 设置为 */branch_name 或仅将其设置为 branch_name:

BRANCH_NAME = "${GIT_BRANCH.split('/').size() > 1 ? GIT_BRANCH.split('/')[1..-1].join('/') : GIT_BRANCH}"

我可能想使用 env.CHANGE_BRANCH 来获取真实的分支名称而不是 jenkins 作业/PR 名称。