获取 Jenkins 管道/Jenkins 文件中的 git 分支名称

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

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

我试过的所有东西都是空的,除了

sh(returnStdout: true, script: 'git rev-parse --abbrev-ref HEAD').trim()

总是 master

198828 次浏览

如果您的管道有一个 jenkinsfile,请检查在执行时是否在 环境变量中看到分支名称。

你可以打印它们:

pipeline {
agent any


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


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

但是,PR 91显示只在某些管道配置中设置分支名称:

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

我的一个同事告诉我使用 scm.branches[0].name,结果成功了。我把它打包到我的 Jenkins 文件中的一个函数中:

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

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

在我的剧本里。

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

}
}

投降。

Pulling...master

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

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

请注意,getEnvironment()必须是一个显式的 getter,否则 env将查找一个名为 环境的环境变量。

不要忘记,您需要批准这些方法,以便从沙箱访问它们。

对我来说,这个方法奏效了: (使用 Jenkins 2.150,使用简单的管道类型——而不是多分支,我的分支说明符:’* *’)

echo 'Pulling... ' + env.GIT_BRANCH

产出:

Pulling... origin/myBranch

其中 myBranch 是特性分支的名称

这是针对简单的管道类型的,而不是多分支

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 在公共关系建设中唯一对我有用的就是 ${CHANGE_BRANCH}

(可能无法在 master上工作,还没有看到)

为了得到詹金斯分行的名字, 如果它是一个 多分支管道多分支管道,那么我们可以很容易地使用 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来获得真正的分支机构名称,而不是詹金斯的工作/公关名称。