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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译、打包、镜像构建、部署等操作;本篇文章主要描述Pipeline流水线用法。
前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译、打包、镜像构建、部署等操作; 本篇文章主要描述Pipeline流水线用法

00-0.png

一、Webhook原理

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

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

02-1.png

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

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

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

02-2.png

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

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

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

二、流水线配置

1、插件安装

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

2、创建流水线

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

02-3.png

选择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参数即可,解析方式看说明:

02-4.png

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

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

02-5.png

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

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工具不断发送请求,完成脚本调试:

02-6.png

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

02-7.png

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

四、源代码地址

GitEE·地址
https://gitee.com/cicadasmile/butte-auto-parent
Wiki·地址
https://gitee.com/cicadasmile/butte-java-note
相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
3月前
|
XML jenkins 机器人
JMeter+Ant+Jenkins实现接口自动化测试持续集成
本文介绍了如何使用Ant生成JMeter接口测试报告,并集成到Jenkins中实现自动化测试。内容涵盖Ant与JMeter环境配置、build.xml文件设置、测试执行及报告生成,同时包括Jenkins插件安装、项目配置和钉钉消息通知的集成,帮助实现持续测试与结果可视化。
471 0
|
4月前
|
存储 文字识别 自然语言处理
通义大模型在文档自动化处理中的高效部署指南(OCR集成与批量处理优化)
本文深入探讨了通义大模型在文档自动化处理中的应用,重点解决传统OCR识别精度低、效率瓶颈等问题。通过多模态编码与跨模态融合技术,通义大模型实现了高精度的文本检测与版面分析。文章详细介绍了OCR集成流程、批量处理优化策略及实战案例,展示了动态批处理和分布式架构带来的性能提升。实验结果表明,优化后系统处理速度可达210页/分钟,准确率达96.8%,单文档延迟降至0.3秒,为文档处理领域提供了高效解决方案。
438 0
|
21天前
|
Java 测试技术 API
自动化测试工具集成及实践
自动化测试用例的覆盖度及关键点最佳实践、自动化测试工具、集成方法、自动化脚本编写等(兼容多语言(Java、Python、Go、C++、C#等)、多框架(Spring、React、Vue等))
65 6
|
8月前
|
人工智能 Kubernetes jenkins
容器化AI模型的持续集成与持续交付(CI/CD):自动化模型更新与部署
在前几篇文章中,我们探讨了容器化AI模型的部署、监控、弹性伸缩及安全防护。为加速模型迭代以适应新数据和业务需求,需实现容器化AI模型的持续集成与持续交付(CI/CD)。CI/CD通过自动化构建、测试和部署流程,提高模型更新速度和质量,降低部署风险,增强团队协作。使用Jenkins和Kubernetes可构建高效CI/CD流水线,自动化模型开发和部署,确保环境一致性并提升整体效率。
|
3月前
|
Web App开发 开发框架 .NET
Playwright 自动化测试系列(6)| 第三阶段:测试框架集成​指南:参数化测试 + 多浏览器并行执行
Pytest 与 Playwright 集成可提升自动化测试效率,支持参数化测试、多浏览器并行执行及统一报告生成。通过数据驱动、Fixture 管理和并行优化,显著增强测试覆盖率与执行速度,适用于复杂 Web 应用测试场景。
|
3月前
|
测试技术 API C++
Playwright 自动化测试系列(7)| 第三阶段:测试框架集成​​Page Object 模式
本课程详解Playwright测试框架中的Page Object模式,通过电商登录-下单实战演示PO架构设计与高级技巧,结合Pytest实现多用户测试。重点解析PO模式提升代码复用性、降低维护成本的核心价值,并提供常见问题解决方案,助力构建高可维护性的自动化测试体系。
|
6月前
|
人工智能 API 开发工具
GitHub官方开源MCP服务!GitHub MCP Server:无缝集成GitHub API,实现Git流程完全自动化
GitHub MCP Server是基于Model Context Protocol的服务器工具,提供与GitHub API的无缝集成,支持自动化处理问题、Pull Request和仓库管理等功能。
1157 2
GitHub官方开源MCP服务!GitHub MCP Server:无缝集成GitHub API,实现Git流程完全自动化
|
10月前
|
jenkins 测试技术 持续交付
软件测试中的自动化与持续集成
在现代软件开发过程中,自动化测试和持续集成已成为不可或缺的组成部分。本文将深入探讨自动化测试和持续集成的重要性、优势以及如何有效实施它们以提升软件质量和开发效率。通过具体案例分析,我们将展示这些技术如何在实际项目中发挥作用,并讨论其面临的挑战及应对策略。
246 60
|
10月前
|
机器学习/深度学习 人工智能 jenkins
探索软件测试中的自动化与持续集成
【10月更文挑战第21天】 在软件开发的生命周期中,软件测试扮演着至关重要的角色。随着技术的进步和开发模式的转变,自动化测试和持续集成已经成为提高软件质量和效率的关键手段。本文将深入探讨自动化测试和持续集成的概念、实施策略以及它们如何相互配合以优化软件开发流程。我们将通过分析实际案例,展示这些技术如何在实际项目中发挥作用,以及面临的挑战和解决方案。此外,文章还将讨论未来趋势,包括人工智能在测试领域的应用前景。
244 17
|
11月前
|
Devops 测试技术 持续交付
软件测试中的自动化与持续集成:最佳实践与挑战
在快速迭代的软件开发周期中,自动化测试和持续集成(CI)已成为提高软件质量和加速产品上市的关键策略。本文探讨了自动化测试和CI的实施如何帮助开发团队提前发现缺陷、缩短反馈循环,并确保代码质量。我们将深入分析自动化测试的策略选择、工具应用以及面临的挑战,同时提供一些克服这些挑战的最佳实践。
321 27