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!

  • 相关阅读:
    开始学习编写用于 Windows SideShow 设备的小工具【转】
    Windows Mobile 6.5 Developer Tool Kit 下载
    Microsoft Security Essentials 微软免费杀毒软件下载
    SQL Server 2008 空间数据存储摘抄(SRID 点 MultiPoint LineString MultiLineString 多边形 MultiPolygon GeometryCollection)
    Vista Sidebar Gadget (侧边栏小工具)开发教程 (2)
    Vista Sidebar Gadget (侧边栏小工具)开发教程 (4)
    负载测试、压力测试和性能测试的异同
    Windows Server 2008 Vista Sidebar Gadget (侧边栏小工具) 入门开发实例
    Silverlight Tools 安装失败 解决办法
    SQL Server 2008 空间数据库 空间索引概念及创建(取自帮助)
  • 原文地址:https://www.cnblogs.com/fuyuteng/p/13646048.html
Copyright © 2011-2022 走看看