在 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显示分支名称仅在某些管道配置中设置:
- Branch Conditional (see this groovy script)
- parallel branches pipeline(如 OP 所见)
切换到多分支管道允许我访问分支名称。不建议使用常规管道。
一位同事告诉我使用 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 名称。
我创建了一个 jenkins 管道,它正在从 scm 中提取管道脚本。
我将分支说明符设置为“all
”,因此它建立在对任何分支的任何更改之上。
如何从 Jenkinsfile 访问导致此构建的分支名称?
除了
,我试过的所有东西都回显 nullsh(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显示分支名称仅在某些管道配置中设置:
- Branch Conditional (see this groovy script)
- parallel branches pipeline(如 OP 所见)
切换到多分支管道允许我访问分支名称。不建议使用常规管道。
一位同事告诉我使用 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 名称。