zoukankan      html  css  js  c++  java
  • 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!

  • 相关阅读:
    C#获取windos 登录用户信息
    像我这样的人
    只道情深,奈何缘浅(雪之轻裳搜集)
    如果我死了,还剩下什么(雪之轻裳)
    嫁给爱情 还是嫁给现实(搜集)
    排名前 16 的 Java 工具类
    java 获取当前屏幕截图
    转:零售数据观(一):如何花30分钟成为一个标签设计“达人”
    转:数据指标系列:电商数据分析指标体系总结V1.0
    转:领域模型中的实体类分为四种类型:VO、DTO、DO、PO
  • 原文地址:https://www.cnblogs.com/fuyuteng/p/13646048.html
Copyright © 2011-2022 走看看