6

我们有一个 Jenkins 工作,当有新的提交时,它会构建除 master 之外的每个分支。可以通过 git 插件的“选​​择策略:反向”配置此行为,以便它侦听除指定分支之外的每个分支。

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

目前,我正在使用一种解决方法,即从生成的 changelog.xml 中对其进行 grep。但是有时当 Jenkins 在不同的分支之间切换时 changelog.xml 是空的,我找不到这个信息。从 Jenkins 检索/查询实际构建的分支的正确方法是什么?

4

4 回答 4

18

我成功地使用了这个语法:

GIT_BRANCH=`git rev-parse HEAD | git branch -a --contains | grep remotes | sed s/.*remotes.origin.//`
于 2014-01-08T12:38:32.190 回答
2

看起来这是一个詹金斯的错误?您可以使用以下命令在构建脚本中获取签出分支的名称:

git symbolic-ref -q --short HEAD

实际上 Jenkins 在分离的 HEAD 中有工作副本,这就是为什么git branch返回“无分支”。请参阅这个非常详细的答案,以深入了解分离的 HEAD 和分支之间的协调。

于 2013-02-20T17:06:22.843 回答
2

因为 git 从不直接签出一个分支,只是一个提交,你必须执行以下操作:

要获取签出提交的 sha:

git rev-parse HEAD

要获取提交所在的所有分支:

git branch -a --contains SHA

第二个命令的输出可能如下所示

master
remotes/origin/HEAD -> origin/master
remotes/origin/develop
于 2013-11-04T02:03:04.777 回答
0

我不敢相信这有多难。我也在为詹金斯做这个。我捎带了 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 与远程存在的分支完全对应时才有效(因此本地分支将不起作用)。

于 2015-12-02T20:59:06.897 回答