2013-02-20 33 views
6

当有新的提交时,我们有一个Jenkins作业构建除master以外的每个分支。这个行为可以通过git插件的'选择策略:反向'来配置,以便它监听除了指定分支以外的每个分支。如何检索使用逆分支选择策略时由Jenkins构建的git分支名称?

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

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

回答

2

因为混帐从来没有签出分支只是直接提交,你必须做到以下几点:

要获得的SHA签出的承诺:

git rev-parse HEAD 

若要获取提交的所有分支下:

git branch -a --contains SHA 

该出把第二个命令可能看起来像这样

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

看起来这是一个Jenkins的bug?您可以在构建脚本抢签出分支的名称与此:

git symbolic-ref -q --short HEAD 

其实詹金斯在分离的头的工作拷贝,这就是为什么git branch返回“无分支”。请参阅this quite detailed answer,了解与分离的HEAD和分支之间的对帐情况。

+1

谢谢Charles。这在正常的git工作区中工作,但不在jenkins工作区,其中命令不返回任何内容。在jenkins工作区运行'git分支'给出'*(无分支)'。可能选择的分支必须以某种方式从Jenkins中查询,因为它似乎根据所选分支中的commit-id进行结帐。 – harish 2013-02-22 08:10:08

+0

是的,詹金斯在独立头部工作。看到我的编辑和链接的答案。我确信其中的一个命令应该可以工作。 – CharlesB 2013-02-22 08:55:34

+0

该命令适用于CMD,但不适用于我的Jenkins,为什么? C:\ Tools \ Jenkins \ jobs \ DevOps \ jobs \ Test-GitHub \ workspace> git --version git version 2.7.0.windows。1 C:\ Tools \ Jenkins \ jobs \ DevOps \ jobs \ Test-GitHub \ workspace> git symbolic-ref -q --short HEAD C:\ Tools \ Jenkins \ jobs \ DevOps \ jobs \ Test-GitHub \ workspace >退出1 构建步骤'执行Windows批处理命令'标记为失败 完成:FAILURE – 2016-03-03 16:16:40

17

我成功地使用这个语法:

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

太棒了!对于其他人,我不得不稍微调整一下: 'git rev-parse HEAD | git branch -a --contains | grep远程| sed -e's /.* remotes.origin .//'' for OS X – 2014-01-22 14:41:29

+0

在主目录中检出一个目前正在处理的数据,这会导致'HEAD - > origin/master \ nmaster'(在结果中'\ n'确实是一个换行符),这显然是错误的。 – 2014-04-09 18:18:38

+4

请注意, - 容器还将包含比当前签出的代码更新的分支。这对我更好:'git show-ref | grep $(git rev-parse HEAD)| grep远程| grep -v HEAD | sed -e's /.* remotes.origin。''如果有多个分支指向这个提交,如果你想要它任意选择第一个分支的名字,可能将其传给'head -n1'。 – 2014-08-26 00:25:58

0

我怎么也不敢相信这艰难的。我为詹金斯也是这样做的。我piggypacked关彼得·库琴斯基的解决方案:

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

因为有时候,马特坎特指出,彼得的解决方案提供了大量的垃圾回来。但那垃圾中的最后一句话似乎总是正确的。请注意,此解决方案仅适用于您使用的引用与远程存在的分支完全对应(因此本地分支无法运行)的情况。