Jenkins指定具体分支持续集成-使用Generic Webhook Trigger插件和码云

上一篇:

使用Generic Webhook Trigger插件实现Jenkins+WebHooks(码云)持续集成

介绍了如何使用Jenkins通用插件Generic Webhook Trigger 来实现码云WebHooks持续集成,但是有一个问题就是,如果项目是多分支的情况下,每一个分支的提交都会触发Jenkins运行,这一点肯定是我们不想看到的,下边我们就解决一下这个问题。

知识背景

1、使用码云WebHooks进行持续集成的时候,我们首先应该明白,他的原理大致是这样的:当我们每一次提交代码到码云的时候,码云会帮我们发送一个关于Push的Post请求到我们的Jenkins服务器,然后Jenkins持续集成插件Generic Webhook Trigger会接收到请求的参数,对于码云平台,Push 的数据格式是这样子的:

这一点可以在码云WebHooks介绍文档(http://git.mydoc.io/?t=154711)详细的看到。

2、如果我们想自己根据不同的分支的提交情况来触发Jenkins构建,那么我们就应该知道,上述的Post数据哪一个属性代表了不同的分支情况。

3、结果是,Post数据的第三行:

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

代表了不同的分支,我是根据具体的实验数据得到的,实验过程如下:

判断分支标志位的实验过程

1、准备工作

在码云-项目管理-WebHooks下设置:

这里把Post的地址指定为: http://xuliugen.vicp.io:8030/api/jenkins

(这个地址,我是通过 花生壳和路由器 进行内网端口映射的地址,方便请求到达本地服务器的时候方便Debug)

在8030端口启动一个简单的Web服务(SSM项目),代码如下:

这里的GitOSPostBean 是根据上述码云Push 的JSON数据格式生成的Bean,(插件是IDEA的GsonFormat 这里不再介绍)

2、在1准备工作中,可以看出我实验操作的项目是 jenkins-test , Git分支如下:

3、首先,修改分支develop(全称为:refs/remotes/origin/develop)代码,然后提交代码,查看结果:

可以看到ref的值为:refs/heads/develop

4、然后,修改分支20170727-webhooks(全称为:refs/heads/feature/liugen.xu/20170727-webhooks)代码,然后提交代码,查看结果:

5、可以查看其他数据,最后得出,ref 可以很好的区分不同的分支。

配置Jenkins

配置结果如下:

1、配置就是如此简单,上一篇: 使用Generic Webhook Trigger插件实现Jenkins+WebHooks(码云)持续集成 只是勾选了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因为有一个点,所以进行了转义;

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

第一行不是指定分支的提交,可以看出未正确匹配,因此不会触发构建:

[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".

总结

到此,基本的实验过程已经完成,从确定分支标志位到设置Generic Webhook Trigger,因为Generic Webhook Trigger相对小众,更多是使用GitHub(GitHub的操作很简单、很简单)或者是自己写脚本触发,但是自己使用码云,一步步踩到这些坑,慢慢去解决,这应该是全网第一次关于此问题的讨论,当时遇到此类需求的时候特意抱着试试的态度去GitHub问了该插件的作者,很幸运的是作者及时回复,给了类似问题的地址(https://github.com/jenkinsci/generic-webhook-trigger-plugin/issues/14),但是看得云里雾里,后边慢慢研究了一下,最终实验出结果,总的来说,是一个过程,希望对大家有所帮助。


原文发布于微信公众号 - Java后端技术(JavaITWork)

原文发表时间:2017-07-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏向治洪

svn错误对照表

#, c-format msgid "Destination '%s' is not a directory" msgstr "目的 “%s” 不是目录" ...

36950
来自专栏java学习

关于Spring 和 Spring MVC的43个问题【问题汇总】

通过Spring提供的IoC容器,可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。

10210
来自专栏一个会写诗的程序员的博客

Spring FrameWork 5.0 新功能 概览Spring FrameWork 5.0 新功能 概览

整个框架的代码基于java8 通过使用泛型等特性提高可读性 对java8提高直接的代码支撑

9010
来自专栏开发与安全

gdb基础命令和常用操作补充

GDB是Unix下的一个程序调试工具,类似于windows下面的VC调试器,区别在于GDB采用全命令行控制。 使用GDB需要在编译时使用-g选项,gcc支持-...

29600
来自专栏Java学习之路

06 Spring框架 依赖注入(三)多配置文件

在Spring前几节的学习中我们都使用了一个配置文件,就像struts2中可以包含其他的配置文件,我们能不能使用多个配置文件呢(在工程比庞大,配置比较多的时候)...

312100
来自专栏沃趣科技

MySQL中server_id一致带来的问题

简 介 我们都知道在MySQL搭建复制环境的时候,需要设置每个server的server_id不一致,如果主库与从库的server_id一致,那么复制会失败。...

43760
来自专栏Kevin-ZhangCG

[ SSH框架 ] Spring框架学习之一

25260
来自专栏向治洪

Elcipse安装gradle插件

参考: http://www.gradle.org/docs/current/userguide/installation.html (1)下载Gradle ...

24680
来自专栏同步博客

PHP操作Memcached的方法汇总

memcached非关系型数据库安装、php中的memcache的扩展安装、以及php中的memcached的扩展安装可以参考:

8220
来自专栏java学习

你竟敢说你懂Spring框架?有可能你是没看到这些...(上)

所以,特地去搜刮了一些关于spring的面试题,希望能帮助各位同学在升职加薪的路上,一去不复返。

13120

扫码关注云+社区

领取腾讯云代金券