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": "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 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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM