经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Linux/Shell » 查看文章
自动化集成:Pipeline流水语法详解
来源:cnblogs  作者:知了一笑  时间:2021/12/24 8:56:59  对本文有异议

前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译、打包、镜像构建、部署等操作;本篇文章主要描述Pipeline流水线用法

一、Webhook原理

Pipeline流水线任务通常情况下都是自动触发的,在Git仓库中配置源码改动后通知的地址即可。

例如在Gitee仓库中,基于WebHook的配置,可以在向仓库push代码后,自动回调预先设定的请求地址,从而触发代码更新后的打包动作,基本流程如下:

这里涉及到两个核心配置:

  • Gitee回调:即仓库接收到push请求后的通知地址;在仓库管理的WebHooks选项中;
  • Jenkins流程:编写流水线任务,处理代码提交后的自动化流程;这里需要Jenkins地址可以在外网访问,网上的组件很多,自行选择搭建即可;

注意:可以先随意设置回调地址,在请求日志中直接拷贝请求参数,在postman中去触发Jenkins任务,这样在测试时会方便很多。

这里结合Gitee的帮助文档,去分析不同push动作的参数标识,可以判断分支的创建、推送、删除等操作,例如:

  1. "after": "1c50471k92owjuh37dsadfs76ae06b79b6b66c57",
  2. "before": "0000000000000000000000000000000000000000",

创建分支:before字符都是0;删除分支:after字符都是0;

二、流水线配置

1、插件安装

在Jenkins插件管理中,安装Generic-Webhook-Trigger插件,流水线pipeline相关组件在Jenkins初始化的时候已经安装了。

2、创建流水线

新建Item,输入任务名称,选择pipeline选项即可:

选择Webhook选项,页面提示了触发的方式。

3、触发流水线

  1. http://用户名:密码@JENKINS_URL/generic-webhook-trigger/invoke

基于如上方式通过认证,触发流水线执行,会生成任务日志,即流程是通顺的。

三、Pipeline语法

1、结构语法

  • triggers:基于hook模式触发流水线任务;
  • environment:声明全局通用的环境变量;
  • stages:定义任务步骤,即流程分段处理;
  • post.always:最终执行的动作;

常规流程中的整体结构如下:

  1. pipeline {
  2. agent any
  3. triggers {}
  4. environment {}
  5. stages {}
  6. post { always {}}
  7. }

把各个节点下的脚本配置进去,就会生成一个自动化的流水线任务。注意这里不勾选使用Groovy沙盒选项。

2、参数解析

这里说的参数解析是指,Gitee通过hook机制请求Jenkins服务携带的参数,这里主要解析post参数即可,解析方式看说明:

这里从hook回调的参数中选了几个流程中使用的参数,下面看具体解析方式,在上图中点击新增:

  1. {
  2. "ref":"refs/heads/master",
  3. "repository":{
  4. "name":"butte-auto-parent",
  5. "git_http_url":"仓库地址-URL"
  6. },
  7. "head_commit":{
  8. "committer":{
  9. "user_name":"提交人名称",
  10. }
  11. },
  12. "before":"277bf91ba85996da6c",
  13. "after":"178d56ae06b79b6b66c"
  14. }

把上述参数依次做好配置即可,这样在工作流中就可以使用这些参数。

3、触发器节点

这里即triggers模块配置,核心作用是加载触发流程的一些参数,后续在脚本中使用,其他相关配置按需选择即可,注意这里的参数需要在上个步骤中配置:

  1. triggers {
  2. GenericTrigger(
  3. genericVariables: [
  4. [key: 'ref', value: '$.ref'],
  5. [key: 'repository_name', value: '$.repository.name'],
  6. [key: 'repository_git_url', value: '$.repository.git_http_url'],
  7. [key: 'committer_name', value: '$.head_commit.committer.user_name'],
  8. [key: 'before', value: '$.before'],
  9. [key: 'after', value: '$.after']
  10. ],
  11. // causeString: ' Triggered on $ref' ,
  12. // printContributedVariables: true,
  13. // 打印请求参数
  14. // printPostContent: true
  15. )
  16. }

4、环境变量

声明一些全局的环境变量,也可以直接定义,在流程中用${变量}的方式引用:

  1. environment {
  2. branch = env.ref.split("/")[2].trim()
  3. is_master_branch = "master".equals(branch)
  4. is_create_branch = env.before.replace('0','').trim().equals("")
  5. is_delete_branch = env.after.replace('0','').trim().equals("")
  6. is_success = false
  7. }

这里根据hook请求参数,解析出分支的操作类型:是否创建、是否删除、是否主干分支,以及定义一个is_success流程是否成功的标识。

5、分段流程

这里主要分为五个步骤:解析数据、拉取分支、处理Pom文件、分支推送、项目打包;

  1. stages {
  2. // 解析仓库信息
  3. stage('Parse') {
  4. steps {
  5. echo "仓库分支 : ${branch} \n仓库名称 : ${repository_name} \n仓库地址 : ${repository_git_url} \n提交用户 : ${committer_name}"
  6. script {
  7. if ("true".equals(is_master_branch)) {
  8. echo "保护分支 : ${branch}"
  9. }
  10. if ("true".equals(is_create_branch)) {
  11. echo "创建分支 : ${branch}"
  12. }
  13. if ("true".equals(is_delete_branch)) {
  14. echo "删除分支 : ${branch}"
  15. }
  16. }
  17. }
  18. }
  19. // 拉取仓库分支
  20. stage('GitPull') {
  21. steps {
  22. script {
  23. if ("false".equals(is_delete_branch)) {
  24. echo "拉取分支 : ${branch}"
  25. git branch: "${branch}",url: "${repository_git_url}"
  26. }
  27. }
  28. }
  29. }
  30. // 解析仓库Pom文件
  31. stage('MvnPom') {
  32. steps {
  33. script {
  34. // 解析Pom文件内容
  35. def pom = readMavenPom file: 'pom.xml'
  36. def version = "${pom.version}"
  37. def encode = pom.getProperties().get("project.build.sourceEncoding")
  38. echo "Pom版本 : "+ version
  39. echo "Pom编码 : "+ encode
  40. def devVersion = "${branch}-"+version
  41. def jarName = "${branch}-"+version+".jar"
  42. echo "Now版本 : "+ devVersion
  43. echo "Jar名称 : "+ jarName
  44. // 修改Pom文件内容
  45. // pom.getProperties().put("dev.version","${devVersion}".trim().toString())
  46. // writeMavenPom file: 'pom.xml', model: pom
  47. echo "update pom success"
  48. }
  49. }
  50. }
  51. // 推送仓库分支
  52. stage('GitPush') {
  53. steps {
  54. script {
  55. echo "git push success"
  56. }
  57. }
  58. }
  59. // 本地打包流程
  60. stage('Package') {
  61. steps {
  62. script {
  63. sh 'mvn clean package -Dmaven.test.skip=true'
  64. is_success = true
  65. }
  66. }
  67. }
  68. }
  • 解析数据:解析并输出部分参数信息;
  • 拉取分支:结合Git命令,拉取分支代码;
  • 处理Pom文件:对pom文件的读取和修改;
  • 分支推送:结合Git命令,推送分支代码;
  • 项目打包:结合Mvn命令,完成项目打包;

注意:这里在本地测试流程时,并没有推送代码;在项目打包完成后,结合shell脚本完成服务的启动发布。

6、消息通知

在流程的最后,识别任务的执行标识is_success,通知相关人员是否打包成功,这里的通知方式可以选择邮件或者其他API推送的通知类型,不过多描述:

  1. post {
  2. always {
  3. script {
  4. echo "notify : ${committer_name} , pipeline is success : ${is_success}"
  5. }
  6. }
  7. }

7、执行日志

完成上面pipeline流水线脚本开发后,通过postman工具不断发送请求,完成脚本调试:

这里也可以点击流程里的不同模块,查看该模块下的日志信息:

说明:完整的pipeline脚本内容放在末尾的Gitee开源仓库中,有需要的自行获取。


同系列推荐


四、源代码地址

  1. GitEE·地址
  2. https://gitee.com/cicadasmile/butte-auto-parent
  3. Wiki·地址
  4. https://gitee.com/cicadasmile/butte-java-note

原文链接:http://www.cnblogs.com/cicada-smile/p/15713820.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号