1. 程式人生 > 實用技巧 >jenkins webhook觸發指定分支進行構建部署

jenkins webhook觸發指定分支進行構建部署

知識背景

1、使用gitlab WebHooks進行持續整合的時候,我們首先應該明白,他的原理大致是這樣的:當我們每一次提交程式碼到gitlab的時候,gitlab會幫我們傳送一個關於Push的Post請求到我們的Jenkins伺服器,然後Jenkins持續整合外掛Generic Webhook Trigger會接收到請求的引數,對於gitlab平臺,Push 的資料格式是這樣子的

{
    "before": "fb32ef5812dc132ece716a05c50c7531c6dc1b4d", 
    "after": "ac63b9ba95191a1bf79d60bc262851a66c12cda1
", "ref": "refs/heads/master", "user_name": "123", "user": { "email": "[email protected]", "name": "123", "time": "2016-12-09T17:28:02 08:00" }, "repository": { "name": "webhook", "url": "http://git.oschina.net/oschina/webhook", "description"
: "", "homepage": "http://git.oschina.net/oschina/webhook" }, "commits": [ { "id": "ac63b9ba95191a1bf79d60bc262851a66c12cda1", "message": "1234 bug fix", "timestamp": "2016-12-09T17:28:02 08:00", "url": "http://git.oschina.net/oschina/webhook/commit/ac63b9ba95191a1bf79d60bc262851a66c12cda1
", "author": { "name": "123", "email": "[email protected]", "time": "2016-12-09T17:28:02 08:00" } } ], "total_commits_count": 1, "commits_more_than_ten": false, "project": { "name": "webhook", "path": "webhook", "url": "http://git.oschina.net/oschina/webhook", "git_ssh_url": "[email protected]:oschina/webhook.git", "git_http_url": "https://git.oschina.net/oschina/webhook.git", "git_svn_url": "svn://git.oschina.net/oschina/webhook", "namespace": "oschina", "path_with_namespace": "oschina/webhook", "default_branch": "master" }, "hook_name": "push_hooks", "password": "pwd" }

這一點可以在碼雲WebHooks介紹文件(http://git.mydoc.io/?t=154711)詳細的看到。

2、如果我們想自己根據不同的分支的提交情況來觸發Jenkins構建,那麼我們就應該知道,上述的Post資料哪一個屬性代表了不同的分支情況。

3、結果是,Post資料的第三行:

"ref": "refs/heads/master", 

代表了不同的分支,我是根據具體的實驗資料得到的,實驗過程如下:

判斷分支標誌位的實驗過程

1、準備工作

在gitlab-專案管理-WebHooks下設定:

下面是重點:必須打鉤,要不新增補上webhook

配置Jenkins

配置結果如下:

1、配置就是如此簡單,上一篇:http://blog.csdn.net/xlgen157387/article/details/72852428只是勾選了Generic Webhook Trigger,什麼都沒有配置,所以造成任何分支的每一次提交都會觸發Jenkins的構建。

Generic Webhook Trigger主要有: Post content parameters、 Header parameters、Request parameters和Optional filter這幾個組成。

其中,Post content parameters是對POST請求資料的處理,其他 Header parameters、Request parameters類似,這些都是匹配請求資料中的param,他會判斷是否具有指定的這個引數,具體介紹如下:

If you want "param1" in post content { "param1": "value1" } posted to http://JENKINS_URL/generic-webhook-trigger/invoke to be contributed, you need to add "$.param1" here.

雖然如此,但是真正能夠按照指定分支或引數進行觸發的是Optional filter。

Optional filter的介紹是:This is an optional feature. If specified, this job will only trigger when given expression matches given text.

2、對於,上圖中(1)(2)(3)(4)解釋如下:

(1)篩選引數的變數名,這裡是ref;
(2)表示式Expression,使用‘$.ref’表示請求資料中的ref屬性,注意這裡有一個點;
(3)Optional filterExpression表示,在Post content parametersExpression中匹配到的資料的格式是否匹配,既是與‘$.ref’匹配的資料。這裡應該是先確定觸發器的名稱,就是(4)中指定的變數;
(4)指定觸發器的名字;

總的來說,通過(1)(2)(3)(4)的設定,將請求中的‘ref’屬性的值和Optional filter的表示式Expression進行比較,如果匹配則觸發Jenkins構建,如果不匹配則不觸發。如果只指定(1)(2)而沒有(3)(4)的話,他只會在Jenkins構建介面顯示匹配到的值和屬性,不會按照指定分支進行觸發的,如下:

還有一點需要注意的是,(3)中的值是一個正則表示式,我這裡配置的是:^(refs/heads/develop)$意思就是去匹配字串:refs/heads/develop,測試結果如下:

因此,如果匹配其它分支,替換內容即可,例如:

1、匹配分支refs/heads/master,正則為:^(refs/heads/master)$ ;
2、匹配分支refs/heads/feature/liugen.xu/20170727-webhooks,正則為:^(refs/heads/feature/liugen\.xu/20170727-webhooks)$,這裡注意下,我這裡liugen\.xu因為有一個點,所以進行了轉義;
  • 1
  • 2

3、測試結果

結果我這裡測試的是正確的,可以檢視Jenkins日誌:

第一行指定分支的提交,可以看出是SUCCESS:

[Handling POST /generic-webhook-trigger/invoke from 61.160.47.7 : http-apr-8020-exec-7] org.jenkinsci.plugins.gwt.GenericWebHookRequestReceiver.doInvoke Triggering jenkins-test
[Executor #1 for master : executing jenkins-test #23] hudson.model.Run.execute jenkins-test #23 main build action completed: SUCCESS
  • 1
  • 2

第一行不是指定分支的提交,可以看出未正確匹配,因此不會觸發構建:

[Handling POST /generic-webhook-trigger/invoke from 61.160.47.7 : http-apr-8020-exec-6] org.jenkinsci.plugins.gwt.GenericWebHookRequestReceiver.doInvoke Triggering jenkins-test

[Handling POST /generic-webhook-trigger/invoke from 61.160.47.7 : http-apr-8020-exec-6] org.jenkinsci.plugins.gwt.GenericTrigger.isMatching Not triggering "^(refs/heads/develop)$" not matching "refs/heads/feature/liugen.xu/20170727-webhooks".
  • 1
  • 2
  • 3

多個專案同時存在的問題

如果你的Jenkins配置了多個Job的話,例如下邊所示:

你可能會發現,使用上邊的配置觸發指定分支進行自動構建的時候,如果這兩個專案都滿足了ref條件,也就是說都有這個分支的話,那麼這兩個專案都會進行觸發!這肯定是不正確的,因此要進行相應的修改,其實Generic Webhook Trigger外掛的Post content parameters可以配置多個引數的,因此,我們需要從Git Post Data裡邊找出來一個可以標識專案的引數名。

具體的Post資料關於project的部分如下:

這裡的專案由於使用的是另一個測試的,所以顯示的是ufind-server而不是上述的jenkins-demo,可以去看出不同的專案確實是不同的,所以可以用來作為標識。

檢視具體的project引數資料,可以看出一下有幾個引數可以作為標識唯一專案的,這裡使用git_ssh_url(),因此我們需要把第一個引數指定為某一個分支,第二個引數指定為具體的某一個專案git地址,具體的設定需要改成如下所示:

可以看出中間的分隔符是“-”(橫線)!注意:這裡邊的sshUrl要換成你自己的url!