前言:该系列文章,围绕继续集成:Jenkins+Docker+K8S相干组件,实现自动化治理源码编译、打包、镜像构建、部署等操作;本篇文章次要形容Pipeline流水线用法。
一、Webhook原理
Pipeline流水线工作通常状况下都是主动触发的,在Git仓库中配置源码改变后告诉的地址即可。
例如在Gitee仓库中,基于WebHook的配置,能够在向仓库push代码后,主动回调事后设定的申请地址,从而触发代码更新后的打包动作,根本流程如下:
这里波及到两个外围配置:
- Gitee回调:即仓库接管到push申请后的告诉地址;在仓库治理的
WebHooks
选项中; - Jenkins流程:编写流水线工作,解决代码提交后的自动化流程;这里须要Jenkins地址能够在外网拜访,网上的组件很多,自行抉择搭建即可;
留神:能够先随便设置回调地址,在申请日志中间接拷贝申请参数,在postman中去触发Jenkins工作,这样在测试时会不便很多。
这里联合Gitee的帮忙文档,去剖析不同push动作的参数标识,能够判断分支的创立、推送、删除等操作,例如:
"after": "1c50471k92owjuh37dsadfs76ae06b79b6b66c57","before": "0000000000000000000000000000000000000000",
创立分支:before字符都是0;删除分支:after字符都是0;
二、流水线配置
1、插件装置
在Jenkins插件治理中,装置Generic-Webhook-Trigger
插件,流水线pipeline
相干组件在Jenkins初始化的时候曾经装置了。
2、创立流水线
新建Item,输出工作名称,抉择pipeline
选项即可:
抉择Webhook选项,页面提醒了触发的形式。
3、触发流水线
http://用户名:明码@JENKINS_URL/generic-webhook-trigger/invoke
基于如上形式通过认证,触发流水线执行,会生成工作日志,即流程是通顺的。
三、Pipeline语法
1、构造语法
- triggers:基于hook模式触发流水线工作;
- environment:申明全局通用的环境变量;
- stages:定义工作步骤,即流程分段解决;
- post.always:最终执行的动作;
惯例流程中的整体构造如下:
pipeline { agent any triggers {} environment {} stages {} post { always {}}}
把各个节点下的脚本配置进去,就会生成一个自动化的流水线工作。留神这里不勾选应用Groovy沙盒
选项。
2、参数解析
这里说的参数解析是指,Gitee通过hook机制申请Jenkins服务携带的参数,这里次要解析post参数即可,解析形式看阐明:
这里从hook回调的参数当选了几个流程中应用的参数,上面看具体解析形式,在上图中点击新增:
{ "ref":"refs/heads/master", "repository":{ "name":"butte-auto-parent", "git_http_url":"仓库地址-URL" }, "head_commit":{ "committer":{ "user_name":"提交人名称", } }, "before":"277bf91ba85996da6c", "after":"178d56ae06b79b6b66c"}
把上述参数顺次做好配置即可,这样在工作流中就能够应用这些参数。
3、触发器节点
这里即triggers
模块配置,核心作用是加载触发流程的一些参数,后续在脚本中应用,其余相干配置按需抉择即可,留神这里的参数须要在上个步骤中配置:
triggers { GenericTrigger( genericVariables: [ [key: 'ref', value: '$.ref'], [key: 'repository_name', value: '$.repository.name'], [key: 'repository_git_url', value: '$.repository.git_http_url'], [key: 'committer_name', value: '$.head_commit.committer.user_name'], [key: 'before', value: '$.before'], [key: 'after', value: '$.after'] ], // causeString: ' Triggered on $ref' , // printContributedVariables: true, // 打印申请参数 // printPostContent: true )}
4、环境变量
申明一些全局的环境变量,也能够间接定义,在流程中用${变量}
的形式援用:
environment { branch = env.ref.split("/")[2].trim() is_master_branch = "master".equals(branch) is_create_branch = env.before.replace('0','').trim().equals("") is_delete_branch = env.after.replace('0','').trim().equals("") is_success = false}
这里依据hook申请参数,解析出分支的操作类型:是否创立、是否删除、是否骨干分支,以及定义一个is_success
流程是否胜利的标识。
5、分段流程
这里次要分为五个步骤:解析数据、拉取分支、解决Pom文件、分支推送、我的项目打包;
stages { // 解析仓库信息 stage('Parse') { steps { echo "仓库分支 : ${branch} \n仓库名称 : ${repository_name} \n仓库地址 : ${repository_git_url} \n提交用户 : ${committer_name}" script { if ("true".equals(is_master_branch)) { echo "爱护分支 : ${branch}" } if ("true".equals(is_create_branch)) { echo "创立分支 : ${branch}" } if ("true".equals(is_delete_branch)) { echo "删除分支 : ${branch}" } } } } // 拉取仓库分支 stage('GitPull') { steps { script { if ("false".equals(is_delete_branch)) { echo "拉取分支 : ${branch}" git branch: "${branch}",url: "${repository_git_url}" } } } } // 解析仓库Pom文件 stage('MvnPom') { steps { script { // 解析Pom文件内容 def pom = readMavenPom file: 'pom.xml' def version = "${pom.version}" def encode = pom.getProperties().get("project.build.sourceEncoding") echo "Pom版本 : "+ version echo "Pom编码 : "+ encode def devVersion = "${branch}-"+version def jarName = "${branch}-"+version+".jar" echo "Now版本 : "+ devVersion echo "Jar名称 : "+ jarName // 批改Pom文件内容 // pom.getProperties().put("dev.version","${devVersion}".trim().toString()) // writeMavenPom file: 'pom.xml', model: pom echo "update pom success" } } } // 推送仓库分支 stage('GitPush') { steps { script { echo "git push success" } } } // 本地打包流程 stage('Package') { steps { script { sh 'mvn clean package -Dmaven.test.skip=true' is_success = true } } }}
- 解析数据:解析并输入局部参数信息;
- 拉取分支:联合Git命令,拉取分支代码;
- 解决Pom文件:对pom文件的读取和批改;
- 分支推送:联合Git命令,推送分支代码;
- 我的项目打包:联合Mvn命令,实现我的项目打包;
留神:这里在本地测试流程时,并没有推送代码;在我的项目打包实现后,联合shell脚本实现服务的启动公布。
6、音讯告诉
在流程的最初,辨认工作的执行标识is_success
,告诉相干人员是否打包胜利,这里的告诉形式能够抉择邮件或者其余API推送的告诉类型,不过多形容:
post { always { script { echo "notify : ${committer_name} , pipeline is success : ${is_success}" } }}
7、执行日志
实现下面pipeline
流水线脚本开发后,通过postman工具一直发送申请,实现脚本调试:
这里也能够点击流程里的不同模块,查看该模块下的日志信息:
阐明:残缺的pipeline
脚本内容放在开端的Gitee开源仓库中,有须要的自行获取。
同系列举荐:
- Jenkins管理工具详解
- 分布式服务部署公布
- 微服务灰度公布原理
- 服务自动化部署和治理
- 微服务组件二次浅封装
四、源代码地址
GitEE·地址https://gitee.com/cicadasmile/butte-auto-parentWiki·地址https://gitee.com/cicadasmile/butte-java-note