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

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

2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>


阿里云采购季(云主机223元/3年)活动入口:请点击进入>>>,


阿里云学生服务器(9.5元/月)购买入口:请点击进入>>>,

前言:该系列文章,围绕持续集成: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
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2天前
|
敏捷开发 监控 jenkins
探索自动化测试在持续集成环境中的关键作用
【5月更文挑战第6天】 在快速迭代的软件开发周期中,持续集成(CI)已经成为确保代码质量和加速交付的重要实践。本文将深入探讨自动化测试作为持续集成不可或缺的组成部分,它如何通过减少人为错误、提高测试覆盖率和加快反馈周期来强化软件开发流程。通过对现代自动化测试工具的评估以及真实案例的分析,我们揭示了自动化测试在提升软件可靠性和效率方面的核心价值,并提出了实现高效自动化测试策略的最佳实践。
|
2天前
|
敏捷开发 数据管理 测试技术
探索自动化测试在持续集成环境中的优化策略
【5月更文挑战第6天】 本文旨在深入剖析自动化测试在持续集成(CI)环境中所面临的挑战,并提出一系列创新的优化策略。通过对现代软件开发过程中自动化测试角色的分析,我们揭示了在快速迭代和部署的背景下,如何通过改进测试框架、选择合适的测试工具、以及实施数据驱动测试等手段来提高测试效率和准确性。文章不仅聚焦于技术层面的解决方案,还探讨了团队协作和流程管理对提升自动化测试效能的重要性。
|
5天前
|
设计模式 人工智能 测试技术
深入探究持续集成中的自动化测试策略
【5月更文挑战第3天】 在现代软件开发实践中,持续集成(CI)已成为提高开发效率、确保代码质量和加速产品上市速度的关键因素。自动化测试作为CI流程的核心组成部分,它确保了快速的反馈循环和高质量的构建。本文将探讨在持续集成环境中实施高效自动化测试的策略,包括测试用例的优化、测试环境的管理、以及如何整合最新的测试工具和技术。通过具体案例分析,我们将了解如何构建一个既灵活又健壮的自动化测试系统,以支持不断变化的软件开发需求。
|
6天前
|
敏捷开发 监控 测试技术
探索自动化测试在持续集成中的关键作用
【5月更文挑战第3天】 随着敏捷开发和持续集成(CI)实践的普及,自动化测试已成为确保软件质量和加速交付过程的核心环节。本文旨在深入探讨自动化测试在持续集成环境中的作用,重点分析其在提高测试效率、降低人力成本及维护软件质量保障体系中的重要性。通过实际案例研究,本文揭示了有效实施自动化测试策略的关键因素,并提出了一系列优化建议,以帮助软件开发团队充分利用自动化测试工具,实现持续交付的高效运作。
31 6
|
8天前
|
敏捷开发 监控 测试技术
探索自动化测试工具Selenium Grid的高效集成策略
【4月更文挑战第30天】在现代Web应用的快速迭代和持续部署中,测试自动化已成为确保产品质量的关键。Selenium Grid作为一款支持多种浏览器和操作系统的测试工具,提供了并行执行测试用例的能力,极大地提升了测试效率。本文将深入探讨如何高效地将Selenium Grid集成到现有的测试框架中,以及实施过程中的最佳实践,帮助团队最大化测试覆盖率,同时降低资源消耗。
|
8天前
|
敏捷开发 运维 测试技术
构建高效自动化运维体系:基于容器技术的持续集成与持续部署实践
【4月更文挑战第30天】在数字化转型的浪潮中,企业对软件交付速度和质量的要求日益提高。自动化运维作为提升效率、确保稳定性的关键手段,其重要性不言而喻。本文将探讨如何利用容器技术构建一个高效的自动化运维体系,实现从代码提交到产品上线的持续集成(CI)与持续部署(CD)。通过分析现代容器技术与传统虚拟化的差异,阐述容器化带来的轻量化、快速部署及易于管理的优势,并结合实例讲解如何在实际环境中搭建起一套完善的CI/CD流程。
|
8天前
|
中间件 测试技术 API
探索自动化测试工具的新边界:Selenium与Appium的集成实践
【4月更文挑战第30天】 随着移动应用和Web应用的不断融合,传统的自动化测试工具需要适应新的测试环境。本文将详细分析Selenium和Appium这两款流行的自动化测试工具的集成实践,探讨如何构建一个能够同时支持Web和移动端应用的自动化测试框架。通过对比两者的技术架构、功能特性以及在实际项目中的集成过程,我们旨在为读者提供一个清晰的指导,帮助他们在复杂的应用环境中实现高效、稳定的自动化测试流程。
|
8天前
|
运维 Kubernetes 持续交付
构建高效自动化运维系统:基于容器技术的持续集成与持续部署实践
【4月更文挑战第30天】 在快速发展的云计算时代,传统的运维模式已无法满足敏捷开发和快速迭代的需求。本文将介绍如何利用容器技术搭建一套高效自动化运维系统,实现软件的持续集成(CI)与持续部署(CD)。文章首先探讨了现代运维面临的挑战,接着详细阐述了容器技术的核心组件和工作原理,最后通过实际案例展示了如何整合这些组件来构建一个可靠、可扩展的自动化运维平台。
|
9天前
|
敏捷开发 机器学习/深度学习 Java
Java中的异常处理机制深入理解与实践:持续集成在软件测试中的应用探索自动化测试在敏捷开发中的关键作用
【4月更文挑战第29天】在Java编程中,异常处理是一个重要的概念。它允许开发者在程序执行过程中遇到错误或异常情况时,能够捕获并处理这些异常,从而保证程序的稳定运行。本文将详细介绍Java中的异常处理机制,包括异常的分类、异常的处理方式以及自定义异常等内容。 【4月更文挑战第29天】 随着敏捷开发和DevOps文化的兴起,持续集成(CI)已成为现代软件开发周期中不可或缺的一环。本文将探讨持续集成在软件测试领域内的关键作用、实施策略以及面临的挑战。通过对自动化构建、测试用例管理、及时反馈等核心要素的详细分析,揭示持续集成如何提高软件质量和加速交付过程。 【4月更文挑战第29天】 在当今快速发
|
10天前
|
敏捷开发 监控 jenkins
探索自动化测试在持续集成中的关键角色
【4月更文挑战第29天】 随着敏捷开发和持续集成(CI)实践的不断演进,自动化测试已成为确保软件质量和加快交付速度的核心要素。本文深入探讨了自动化测试在持续集成流程中的作用,分析了其提升效率、降低风险及促进团队协作的多重价值,并提出了有效整合自动化测试与CI的策略。通过案例分析,我们进一步验证了自动化测试在现代软件开发生态中不可替代的地位,同时指出了实施过程中可能遇到的挑战以及相应的解决方案。

热门文章

最新文章

http://www.vxiaotou.com