当前位置: 首页 > news >正文

jenkins指定具体项目具体分支进行构建部署

知识背景

1、使用码云WebHooks进行持续集成的时候,我们首先应该明白,他的原理大致是这样的:当我们每一次提交代码到码云的时候,码云会帮我们发送一个关于Push的Post请求到我们的Jenkins服务器,然后Jenkins持续集成插件Generic Webhook Trigger会接收到请求的参数,对于码云平台,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" }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

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

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

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

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

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

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

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、配置就是如此简单,上一篇: 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.
  • 1

虽然如此,但是真正能够按照指定分支或参数进行触发的是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!

总结

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

相关文章:

  • 教你一步步composer安装Magento2.3
  • 真正能支撑高并发以及高可用的复杂系统中的缓存架构有哪些东西?
  • 配置嵌入式Servlet容器
  • Spring Boot学习记4
  • 小R的烦恼 BZOJ3280
  • 捋一捋PHP第三方微信登录
  • JDK动态代理源码解析
  • 比传统事务快10倍?一张图读懂阿里云全局事务服务GTS
  • 关于lncRNA数据收集
  • 在Java中使用tabula提取PDF中的表格数据
  • Kafka入门经典教程
  • 使用 Buildah 创建小体积的容器
  • Linux-office办公的另外之选
  • Service Mesh服务网格:8种方式简化微服务部署
  • 【Sensors】环境传感器(5)
  • ES6指北【2】—— 箭头函数
  • [ JavaScript ] 数据结构与算法 —— 链表
  • Android单元测试 - 几个重要问题
  • Android系统模拟器绘制实现概述
  • Apache Pulsar 2.1 重磅发布
  • CSS魔法堂:Absolute Positioning就这个样
  • es的写入过程
  • golang 发送GET和POST示例
  • java8-模拟hadoop
  • Java超时控制的实现
  • oldjun 检测网站的经验
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • PHP的Ev教程三(Periodic watcher)
  • use Google search engine
  • 仿天猫超市收藏抛物线动画工具库
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 记录:CentOS7.2配置LNMP环境记录
  • 收藏好这篇,别再只说“数据劫持”了
  • 消息队列系列二(IOT中消息队列的应用)
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 一些css基础学习笔记
  • ​iOS安全加固方法及实现
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • $().each和$.each的区别
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (6)添加vue-cookie
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • . Flume面试题
  • ... 是什么 ?... 有什么用处?
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET大文件上传知识整理
  • .net反编译工具
  • .NET开发者必备的11款免费工具
  • .NET设计模式(11):组合模式(Composite Pattern)