自动化集成:Pipeline流水语法详解

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

自动化集成:Pipeline流水语法详解

一、Webhook原理

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

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

自动化集成:Pipeline流水语法详解

涉及两种核心配置:

[En]

There are two core configurations involved:

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

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

自动化集成:Pipeline流水语法详解

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

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

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

二、流水线配置

1、插件安装

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

2、创建流水线

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

自动化集成:Pipeline流水语法详解

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

3、触发流水线

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

如果按照上述方式通过认证并触发流水线执行,则会生成任务日志,即流程流畅。

[En]

If you pass the authentication in the above way and trigger the pipeline execution, a task log will be generated, that is, the process is smooth.

三、Pipeline语法

1、结构语法

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

经常程序的总体结构如下:

[En]

The overall structure of the regular process is as follows:

pipeline {
    agent any
    triggers {}
    environment {}
    stages {}
    post { always {}}
}

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

2、参数解析

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

自动化集成:Pipeline流水语法详解

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

{
    "ref":"refs/heads/master",
    "repository":{
        "name":"butte-auto-parent",
        "git_http_url":"仓库地址-URL"
    },
    "head_commit":{
        "committer":{
            "user_name":"提交人名称",
        }
    },
    "before":"277bf91ba85996da6c",
    "after":"178d56ae06b79b6b66c"
}

自动化集成:Pipeline流水语法详解

依次配置以上参数,以便在工作流中使用。

[En]

Configure the above parameters in turn so that they can be used in the workflow.

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
            }
        }
    }
}
  • 数据解析:解析输出部分参数信息
    [En]

    parsing data: parsing and outputting some parameter information*

  • 拉取分支:结合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流水语法详解

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

[En]

You can also click on different modules in the process to view the log information under this module:

自动化集成:Pipeline流水语法详解

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

同系列推荐

四、源代码地址

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

Original: https://www.cnblogs.com/cicada-smile/p/15713820.html
Author: 知了一笑
Title: 自动化集成:Pipeline流水语法详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/524270/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • [转帖]shell学习之shell基础知识了解

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年5月28日
    099
  • K8S部署之VMWare网络拓扑踩坑

    知乎上最近发现一篇好文 图解K8S(01):基于Ubuntu 20.04部署1.23版K8S集群,想着之前 K8S 部署一直不成功,那么就照着这篇文章中说的试一试。结果在实验时遇到…

    Linux 2023年6月13日
    086
  • JavaScript快速入门-08-JSON

    8 JSON 因平时工作时,使用JSON的场景比较多,其JSON语法不再介绍,仅介绍在JavaScript中JSON的解析和序列化。 8.1 JSON 对象 JSON对象有两个方法…

    Linux 2023年6月7日
    0104
  • C++Lambda表达式

    C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。 Lambda 的语法形式如下: [捕获列表] (参数) mutable 或 exceptio…

    Linux 2023年6月8日
    0113
  • 随便侃侃博客挖坑的事

    很多都没有写博客了,说实在的,Markdown的语法都忘的差不多了。 今年看着停留在提醒上的写博客计划,然后又想了想要写的东西,太多了,都需要花点时间去总结,感觉静不下心来,真的无…

    Linux 2023年6月6日
    0100
  • RPA纳税申报机器人

    bash;gutter:true;1、机器人开始工作2、机器人打开企业内部税务平台,自动下载报税底表3、机器人自动登录地方税务局,填写报税数据手工报税10分钟/3个表 VS 机器人…

    Linux 2023年6月7日
    077
  • 复杂任务中,流程的解耦设计

    做事不能急,得一步异步的来; 一、业务场景 在系统开发的过程中,必然存在耗时极高的动作,是基于请求响应模式无法解决的问题,通常会采用解耦的思维,并基于异步或者事件驱动的方式去调度整…

    Linux 2023年6月14日
    071
  • Linux查看文件内容和压缩文件命令

    Cat(查看文件内容) cat [选项] 文件名 选项 效果 -n 显示行号包括空行 -b 跳过空白行编号 -s 将所有的连续的多个空行替换为一个空行(压缩成一个空行) -A 显示…

    Linux 2023年6月6日
    089
  • 设计模式——-建造者模式(生成器模式)

    建造者模式(生成器模式)定义:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 建造者模式中的4个角色: Product产品类 通常是实现了模板方法模式…

    Linux 2023年6月7日
    098
  • phpcms如何在前台文章列表前显示所属类别名称

    最近做单位网站模版遇到的问题,欲实现的效果: 但是phpcms中自带的文章列表标签没有这个功能,数据库中文章表中也只有类别id的字段,因此不能通过简单的{$r[catname]}读…

    Linux 2023年6月13日
    091
  • shell脚本中 /dev/null 的用途

    /dev/null 是一个特殊的设备文件,它丢弃一切写入其中的数据 可以将它 视为一个黑洞, 它等效于只写文件, 写入其中的所有内容都会消失, 尝试从中读取或输出不会有任何结果,同…

    Linux 2023年6月13日
    096
  • python爬虫配置随机请求头headers伪装User-Agent

    fake_useragent 库 调用方法 ua.random可以随机返回一个headers(User-Agent) from fake_useragent import User…

    Linux 2023年6月14日
    087
  • Command ‘ifconfig’ not found, but can be installed with: sudo apt install net-tools解决方法

    VMware下安装的Ubuntu 当使用ifconfig命令查看网卡配置信息的时候出错 尝试了很多方法都解决不了,直到输入了下面的内容: 然后自己就更新了很多东西 之后重新输入if…

    Linux 2023年6月7日
    0104
  • ES6

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &lt…

    Linux 2023年6月13日
    089
  • 23种设计模式概要及易懂的例子

    创建型模式(共五种) 工厂方法模式:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。 个人总结: 通过对象工厂灵活地生产多种对象 抽…

    Linux 2023年6月13日
    099
  • Windows 添加nginx到服务

    一、下载nginx 地址:http://nginx.org/en/download.html (稳定版) 解压到相应的磁盘,本文是:E:\nginx\nginx-1.18.0 二、…

    Linux 2023年6月8日
    0113
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球