我已经创建了一个jenkins管道,它正在从scm中提取管道脚本
我将分支说明符设置为“all
”,因此它建立在对任何分支的任何更改上。
如何从Jenkinsfile访问导致此构建的分支名称?
我尝试过的所有内容除了
外都回显了sh(returnStdout: true, script: 'git rev-parse --abbrev-ref HEAD').trim()
总是master
。
答案 0 :(得分:27)
使用multibranch管道..而不是管道
在我的剧本中..
stage('Build') {
node {
echo 'Pulling...' + env.BRANCH_NAME
checkout scm
}
}
...产量
Pulling...master
答案 1 :(得分:13)
如果您的管道有jenkins文件,请检查您是否在执行时看到environment variables中的分支名称。
您可以使用以下方式打印它们:
pipeline {
agent any
environment {
DISABLE_AUTH = 'true'
DB_ENGINE = 'sqlite'
}
stages {
stage('Build') {
steps {
sh 'printenv'
}
}
}
}
但是,PR 91表明分支名称仅在某些管道配置中设置:
答案 2 :(得分:7)
一位同事告诉我使用scm.branches[0].name
并且它有效。我将它包装到Jenkinsfile中的函数中:
def getGitBranchName() {
return scm.branches[0].name
}
答案 3 :(得分:6)
对于管道:
pipeline {
environment {
BRANCH_NAME = "${GIT_BRANCH.split("/")[1]}"
}
}
答案 4 :(得分:5)
切换到多分支管道允许我访问分支名称。没有建议定期管道。
答案 5 :(得分:4)
这是针对简单管道类型的-不是多分支。使用Jenkins 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
答案 6 :(得分:2)
这对我来说很有效:(使用Jenkins 2.150,使用简单的管道类型-不是多分支,我的分支说明符:'**')
echo 'Pulling... ' + env.GIT_BRANCH
输出:
Pulling... origin/myBranch
其中myBranch是功能分支的名称
答案 7 :(得分:2)
要在 Jenkins 中获取 git 分支名称, 如果是多分支管道,那么我们可以轻松使用env.GIT_BRANCH。 但是如果是普通的pipeline那么我们可以使用SCM插件对象来获取分支名称。
以下代码适用于普通管道和多分支管道。
def branch_nem = scm.branches[0].name
if (branch_nem.contains("*/")) {
branch_nem = branch_nem.split("\\*/")[1]
}
echo branch_nem
答案 8 :(得分:1)
这对非多分支管道对我有用,可以将 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}"
答案 9 :(得分:0)
如果您将build参数用作分支说明符,例如,仅从scm.branches
获得名称是不够的。 ${BRANCH}
。
您需要将该字符串扩展为真实名称:
scm.branches.first().getExpandedName(env.getEnvironment())
请注意,getEnvironment()
必须是显式的获取器,否则env
将查找名为 environment 的环境变量。
别忘了您需要批准这些方法以使它们可以从沙箱中访问。
答案 10 :(得分:0)
FWIW在PR版本中唯一对我有用的是${CHANGE_BRANCH}
(可能不适用于master
,尚未看到)