知識背景
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": "123@123.com", "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": "123@123.com", "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": "git@git.oschina.net: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 filter
的Expression
表示,在Post content parameters
的Expression
中匹配到的數據的格式是否匹配,既是與‘$.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!