如何使用Jenkins Git插件获取本地Git分支名称?

68

我正在使用Jenkins Git 插件(v2.0)中的“分支指定器”选项在特定分支上运行构建,例如1.4

在这种情况下,${GIT_BRANCH} 包含值为 origin/1.4

如何获取用于克隆的本地Git分支名称(即没有origin/前缀的1.4)?

我尝试了带有分支名称1.4 的“检出到特定本地分支”附加行为,但什么也没改变。

我已经在GitHub上看到相关的PR,但它被拒绝了(因为它只修复了一个与仅有origin远程一起使用的情况)。


你为什么关心本地分支的名称(如果有的话)?git name-rev 是否能给你想要的结果? - Magnus Bäck
由于此功能由插件提供:https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin#GitPlugin-Environmentvariables - Max Romanovsky
我也遇到了这个问题。最近版本的插件开始在前面添加“origin/”。我需要获取分支名称,因为我正在另一个位置检出代码。 - ifightcrime
我一直在尝试弄清楚为什么Jenkins没有为我的构建设置GIT_*环境变量。原来是因为我已经配置了Jenkins来监视多个分支。有一个功能请求来支持这个:https://issues.jenkins-ci.org/browse/JENKINS-7554 - markrian
存在另一个变量 GIT_BRANCHGIT_LOCAL_BRANCH 的区别。 - Sandburg
14个回答

83
你可以很容易地从变量中去掉前缀:${GIT_BRANCH##origin/} 尽管这不是一个非常通用的解决方案,但它非常简单,我还没有看到过Jenkins克隆的存储库使用除origin以外的其他东西作为远程名称。
更新:实际上,${GIT_BRANCH#*/}适用于任何起源,甚至适用于包含斜杠的分支。 #执行非贪婪的glob匹配,##启用贪婪匹配。有关详细信息,请参见Bash参考手册

3
${GIT_BRANCH} 是一个令牌宏,不是 shell 扩展。将其放入“检出到特定本地分支”中将无法正常工作。 - Daniel Tabuenca
4
这个问题没有明确指定需要将它放入“结账到特定的本地分支”。 - Jan Včelák
2
@dtabuenc,您对如何从令牌宏中删除“origin”有何评论? - alukach
1
我也遇到了同样的问题,但还没有解决。Token Macro文档中说${MACRO_NAME#origin/}应该可以解决问题,但在我的情况下并不起作用,因为我使用了Set build name插件,该插件使用了Token Macro插件。 - Germán Diago
1
正如@GermánDiago所指出的,这无法与“设置构建名称”插件一起使用。 - Colin Basnett
在某些情况下,您需要将大括号加倍:${{GIT_BRANCH#*/}}(我是 Jenkins 的新手,不确定为什么这样做可以代替 ${GIT_BRANCH#*/} - 这与转义有关,确保大括号一直到 shell 而不是被视为 Jenkins 变量。 - Yuri Astrakhan

16
截至2016年3月(Git插件v2.4.3),这已经得到本地支持。在Git插件中,仅需将Check out to specific local branch的值设置为**,而不是任何宏/变量即可。
该字段的描述详细介绍了新行为:

如果选择了此选项,并且其值为空字符串或“ **”,则分支名称将从无源的远程分支计算出来。在这种情况下,将检出名为master的本地分支以 origin/master 的远程分支为基础,将检出名为develop/new-feature的本地分支以 origin/develop/new-feature 的远程分支为基础。

@roostergx和@NickVolynkin发布时介绍了这个功能。我在这里记录下来,希望能帮助未来的开发者们。

谢谢Sean,这个与M2 Release插件(0.14.0)和git插件3.7.0完美配合。 - napster
这实际上也解决了分离头的问题,如果您的构建使用类似于 git symbolic-ref --short HEAD 的东西来检索分支名称。 请注意,在使用 Jenkins 变量时,您需要使用 GIT_LOCAL_BRANCH 代替 GIT_BRANCH 来获取本地分支的名称。 - Jesper Matthiesen

14
我用以下步骤完成了这个操作:
  1. 添加Execute shell预处理步骤,包含以下内容:

    git_branch_local=$(echo $GIT_BRANCH | sed -e "s|origin/||g") echo GIT_BRANCH_LOCAL=$git_branch_local > build.properties

  2. 添加一个Inject environment variables预处理步骤,为build.properties文件注入环境变量。

然后你就会得到一个没有origin/GIT_BRANCH_LOCAL环境变量。


9

Chris的回答帮助了我,谢谢!

别忘了在“源代码管理”下面添加“附加行为 -> 检出到特定本地分支”。

在此输入图片描述

直到我添加这个选项之前,当我尝试使用${GIT_LOCAL_BRANCH}变量时它是不可用的。 (例如:执行shell命令“printenv”,然后检查控制台输出)


8

如果您将其作为本地分支检查并使用${GIT_LOCAL_BRANCH},它将给出本地分支名称(即“develop”而不是“origin/develop”)。 (Git插件版本3.0.0)


4
我在jenkins-ci组(https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/jenkinsci-dev/xuweZbwn9zE/BAWfs-ZeFAAJ)发布了一条消息,建议增强Git插件的“Check Out to Local Branch”选项。默认情况下,git插件会检出一个分离的头。本地分支允许您指定特定的分支名称。使用此方法配置时,本地分支名称与指定的名称完全相同。
如果您正在使用Jenkins进行maven发布,则本地分支名称必须与远程分支名称相同。有关此内容,请参阅google groups上的帖子。
为了满足此要求,我创建了一个拉取请求(https://github.com/jenkinsci/git-plugin/pull/381),其中包含代码和测试案例。

同时创建了一个JIRA问题(https://issues.jenkins-ci.org/browse/JENKINS-33202)来记录这个问题。

如果有人需要这个功能,我鼓励你在小组讨论中发布,并为JENKINS-33202投票。


这已经合并了。 - AnneTheAgile
1
此功能是在版本2.4.3(2016年3月19日)中引入的。https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin#GitPlugin-Changelog - Nick Volynkin

4

虽然dtabuenc在对Jan Včelák的回答进行评论时说得没错,即shell语法不能直接在token宏中使用,但如果您想要在“执行Shell”构建步骤(或类似的步骤)中获取分支名称,您仍然可以使用相同的思路。

TEMP_GIT_BRANCH=${GIT_BRANCH}
MY_GIT_BRANCH="${TEMP_GIT_BRANCH#*/}"

这很好运作(并且是有效的POSIX语法,不需要bash)。


3
基于这个stackoverflow的答案:如何从Jenkinsfile(groovy)中执行的shell命令获取输出并保存到变量中? 我用了以下代码,最后成功使其工作(下面的示例假定分支变量为$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'
}

2
在管道中,您可以这样做:
// 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']]])
}

根据@burcakulug的回答 - webofmars

2
经过长时间的努力,我终于找到了解决方案,以便在我的Jenkins自由风格项目(而不是Jenkinsfile)中获取本地git名称(用于SonarQube),并且没有“origin /” 。 我正在使用Windows环境。
在Jenkins中:
- 在“源代码管理”部分:添加“检出特定本地分支”,在“分支名称”中输入: ** - 在“构建”部分:我使用并添加了“SonarScanner for MSBuild - Begin Analysis”,在“附加参数”中添加了:/d:sonar.branch.name=${GIT_LOCAL_BRANCH} 因此,只有这种组合的 ** 和${GIT_LOCAL_BRANCH}才对我起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接