我正在使用Jenkins Git 插件(v2.0)中的“分支指定器”选项在特定分支上运行构建,例如1.4
。
在这种情况下,${GIT_BRANCH}
包含值为 origin/1.4
。
如何获取用于克隆的本地Git分支名称(即没有origin/
前缀的1.4
)?
我尝试了带有分支名称1.4
的“检出到特定本地分支”附加行为,但什么也没改变。
我已经在GitHub上看到相关的PR,但它被拒绝了(因为它只修复了一个与仅有origin
远程一起使用的情况)。
我正在使用Jenkins Git 插件(v2.0)中的“分支指定器”选项在特定分支上运行构建,例如1.4
。
在这种情况下,${GIT_BRANCH}
包含值为 origin/1.4
。
如何获取用于克隆的本地Git分支名称(即没有origin/
前缀的1.4
)?
我尝试了带有分支名称1.4
的“检出到特定本地分支”附加行为,但什么也没改变。
我已经在GitHub上看到相关的PR,但它被拒绝了(因为它只修复了一个与仅有origin
远程一起使用的情况)。
${GIT_BRANCH##origin/}
尽管这不是一个非常通用的解决方案,但它非常简单,我还没有看到过Jenkins克隆的存储库使用除origin
以外的其他东西作为远程名称。${GIT_BRANCH#*/}
适用于任何起源,甚至适用于包含斜杠的分支。 #
执行非贪婪的glob匹配,##
启用贪婪匹配。有关详细信息,请参见Bash参考手册。${GIT_BRANCH}
是一个令牌宏,不是 shell 扩展。将其放入“检出到特定本地分支”中将无法正常工作。 - Daniel Tabuenca${{GIT_BRANCH#*/}}
(我是 Jenkins 的新手,不确定为什么这样做可以代替 ${GIT_BRANCH#*/}
- 这与转义有关,确保大括号一直到 shell 而不是被视为 Jenkins 变量。 - Yuri AstrakhanCheck out to specific local branch
的值设置为**
,而不是任何宏/变量即可。@roostergx和@NickVolynkin发布时介绍了这个功能。我在这里记录下来,希望能帮助未来的开发者们。如果选择了此选项,并且其值为空字符串或“ **”,则分支名称将从无源的远程分支计算出来。在这种情况下,将检出名为master的本地分支以 origin/master 的远程分支为基础,将检出名为develop/new-feature的本地分支以 origin/develop/new-feature 的远程分支为基础。
git symbolic-ref --short HEAD
的东西来检索分支名称。
请注意,在使用 Jenkins 变量时,您需要使用 GIT_LOCAL_BRANCH
代替 GIT_BRANCH
来获取本地分支的名称。 - Jesper Matthiesen添加Execute shell
预处理步骤,包含以下内容:
git_branch_local=$(echo $GIT_BRANCH | sed -e "s|origin/||g")
echo GIT_BRANCH_LOCAL=$git_branch_local > build.properties
添加一个Inject environment variables
预处理步骤,为build.properties
文件注入环境变量。
然后你就会得到一个没有origin/
的GIT_BRANCH_LOCAL
环境变量。
如果您将其作为本地分支检查并使用${GIT_LOCAL_BRANCH}
,它将给出本地分支名称(即“develop”而不是“origin/develop”)。 (Git插件版本3.0.0)
同时创建了一个JIRA问题(https://issues.jenkins-ci.org/browse/JENKINS-33202)来记录这个问题。
如果有人需要这个功能,我鼓励你在小组讨论中发布,并为JENKINS-33202投票。
虽然dtabuenc在对Jan Včelák的回答进行评论时说得没错,即shell语法不能直接在token宏中使用,但如果您想要在“执行Shell”构建步骤(或类似的步骤)中获取分支名称,您仍然可以使用相同的思路。
TEMP_GIT_BRANCH=${GIT_BRANCH}
MY_GIT_BRANCH="${TEMP_GIT_BRANCH#*/}"
这很好运作(并且是有效的POSIX语法,不需要bash)。
$Branch
):stage('Checkout') {
GIT_BRANCH_LOCAL = sh (
script: "echo $Branch | sed -e 's|origin/||g'",
returnStdout: true
).trim()
echo "Git branch: ${GIT_BRANCH_LOCAL}"
git branch: "${GIT_BRANCH_LOCAL}", credentialsId: '...', url: 'git@github.com:......git'
}
// get arround a git scm anoying feature
stage ('Bootstrap') {
sh "echo GIT_BRANCH_LOCAL=\\\"$GIT_BRANCH\\\" | sed -e 's|origin/||g' | tee version.properties"
}
stage('Checkout') {
load('version.properties')
checkout([$class: 'GitSCM', branches: [[name: '**']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'LocalBranch', localBranch: "${GIT_BRANCH_LOCAL}"]], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/webofmars/grails-website.git']]])
}
**
- 在“构建”部分:我使用并添加了“SonarScanner for MSBuild - Begin Analysis”,在“附加参数”中添加了:/d:sonar.branch.name=${GIT_LOCAL_BRANCH}
因此,只有这种组合的 ** 和${GIT_LOCAL_BRANCH}才对我起作用。
git name-rev
是否能给你想要的结果? - Magnus BäckGIT_*
环境变量。原来是因为我已经配置了Jenkins来监视多个分支。有一个功能请求来支持这个:https://issues.jenkins-ci.org/browse/JENKINS-7554 - markrianGIT_BRANCH
和GIT_LOCAL_BRANCH
的区别。 - Sandburg