2013-02-20 30 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}'` 

因爲有時候,馬特坎特指出,彼得的解決方案提供了大量的垃圾回來。但那垃圾中的最後一句話似乎總是正確的。請注意,此解決方案僅適用於您使用的引用與遠程存在的分支完全對應(因此本地分支無法運行)的情況。