jenkins定位GitLab推送的最新Webhook中push event來自哪一個分支
轉載請標明出處:http://www.cnblogs.com/zblade/
一、調研目的
jenkins可以和GitLab搭檔,每當GitLab上有commit的時候,都可以觸發jenkins執行相關的操作,具體的實現,可以參看我前面的博文或者網上的相關博文,不再贅述。
在完成這個功能後,接下來遇到一個新的需求,就是jenkins需要獲取GitLab上的最新的push event具體來自於哪一個分支,從而定位分支的資訊,為後續的操作提供分支資訊。
這篇文章就從jenkins的角度來說說如何實現這個功能,當然,實現的過程有點繞,不過目前是調研的方案之一,也可以用python結合sh指令碼來實現,這個在後面會闡述。
二、GitLab webhook + Parameterized Trigger plugin實現Jenkins獲取對應分支的push commit trigger
1、Jenkins 設定只響應對應分支的push event
安裝完GitLab相關的外掛(參考前面的博文),我們可以具體的配置Jenkins端對GitLab 的webhook的響應:
一般預設的commit trigger是 Allow all branches to trigger this job,在這兒,勾選第二個引數 Filter branches by name, 在Inclue中填寫你需要對應響應的分支名字: prototypeTest,這樣,當前job只會響應prototypeTest上的push event 的觸發
2、利用Parameterized Trigger 觸發Jenkins job之間的通訊
在當前的這個job上,設定引數化構建過程,填寫:
然後在構建後操作中選中 Parameterized :
然後將當前job的引數傳遞到testA job上:
在testA job上,設定一個同名的引數,然後將其打印出來:
最終的測試結果:
正確的獲得testParamA傳遞過來的引數。
說完實現的操作,那麼對應本文的目的,可以這樣設計實現:
在testParamA中,只響應對應的分支,比如 prototypeTest 的push event, 在響應後,就傳遞給後續或者本job,執行對應 prototypeTest的操作。
三、利用sh指令碼和python程式碼,實現對git 最新提交的分支獲取
前面實現的方法,有一個弊端,就是一個git分支得對應的建立一個job,如果有多個分支,則需要在jenkins上建立多個job。此外,需要對著多個jenkins job進行維護,因為gitlab的分支在
開發過程中新建和刪除,這都帶來一個很大的不便利性。所以,改用python程式碼來獲取當前遠端倉庫上最新一次提交的版本資訊。很簡單的幾個程式碼:
首先是sh指令碼來獲取當前遠端倉庫上的各個分支的最新提交資訊:
for branch in `git branch -r | grep -v HEAD`;do echo -e `git show --format="%ci %cr" $branch | head -n 1` \\t$branch; done | sort -r
這段程式碼來自: https://gist.github.com/jasonrudolph/1810768 ,版權歸這位老哥所有
這時候獲得的資訊示例:
2012-02-12 03:20:24 -0800 9 hours ago origin/master 2012-02-10 10:34:35 -0800 2 days ago origin/3-2-stable 2012-01-31 09:56:12 -0800 12 days ago origin/3-1-stable 2012-01-24 11:18:06 -0800 3 weeks ago origin/3-0-stable 2011-12-31 05:09:14 -0800 6 weeks ago origin/2-3-stable
可見我們獲得了各個分支的最新提交,並做一個排序,排在第一個的,就是最近的一次提交,用python指令碼來操作獲得這個版本:
results = os.popen('sh getGitCommit.sh').read().splitlines() latest_log = results[0].split() length = len(latest_log) branch_info = latest_log[length - 1] branch_name = branch_info.split('/')[1] print(branch_name)
最終,成功獲得當前最新一次提交來自於具體的哪一個分支 branch_name, 大功告成!