如何检索Jenkins在使用反向分支选择策略时构建的git分支名称



我们有一个Jenkins作业,当有新的提交时,它会构建除master之外的每个分支。这种行为可以通过git插件的"选择策略:inverse"进行配置,这样它就可以监听除指定分支之外的每个分支。

这功能非常好。但问题是GIT_BRANCH环境变量总是指被排除的分支(在我们的例子中是"origin/master")。如何查询Jenkins创建的实际分支?

目前,我正在使用一种变通方法,从生成的changelog.xml中删除它。但有时,当Jenkins在不同的分支之间切换时,changelog.xml是空的,我找不到这些信息。从Jenkins检索/查询实际构建的分支的正确方法是什么?

我成功地使用了以下语法:

GIT_BRANCH=`git rev-parse HEAD | git branch -a --contains | grep remotes | sed s/.*remotes.origin.//`

因为git从不直接签出分支,所以您必须执行以下操作:

要获得签出提交的sha:

git rev-parse HEAD

获取提交的所有分支:

git branch -a --contains SHA

第二个命令的输出可能看起来像这个

master
remotes/origin/HEAD -> origin/master
remotes/origin/develop

看起来是Jenkins bug?您可以在构建脚本中获取签出分支的名称,如下所示:

git symbolic-ref -q --short HEAD

实际上Jenkins在分离的HEAD中有工作副本,这就是git branch返回"no branch"的原因。请参阅这个非常详细的答案,以深入了解分离的HEAD和分支之间的和解。

我简直不敢相信这有多难。我这么做也是为了詹金斯。我借鉴了Piotr Kuczynski的解决方案:

branch=`git rev-parse HEAD | git branch -a --contains | grep remotes | sed s/.*remotes.origin.//`
branch=`echo $branch | awk '{print $NF}'`

因为有时候,正如Matt Kantor所指出的,Piotr的解决方案会带来很多垃圾。但垃圾中的最后一句话似乎总是正确的。请注意,只有当您使用的ref与远程上存在的分支完全对应时,此解决方案才有效(因此本地分支将不起作用)。

最新更新