基于Jenkins pipeline的持续交付流水线介绍及实践

Posted 铸盾师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Jenkins pipeline的持续交付流水线介绍及实践相关的知识,希望对你有一定的参考价值。

———————————————前言在今年年初的DevOps Dozen awards评选中,Jenkins不负众望,获得了最佳开源项目奖。可以说,jenkins已经处于DevOps和持续交付领域的核心位置,它已经成为构建交付流水线的最佳工具。Jenkins能够获此殊荣,得益于其在2016年为持续交付而开发的重要功能—pipeline as code本文将为大家介绍基于Jenkins2的pipeline as code特性搭建持续交付流水线的方法。


Pipeline as code 简介

流水线即代码,通过编码而非在Jenkins Web UI上配置持续交付工具的方式来定义部署流水线的方式。如下图所示,pipeline as code 通过一段 Groovy DSL编写的代码来描述流水线的运行方式,我们将这段代码保存在名为Jenkinsfile的文件中,并放置到被测服务的主干根目录下。通过jenkins监控服务的主干路径(或者分支路径),每当代码发生变化则触发流水线的构建。

基于Jenkins pipeline的持续交付流水线介绍及实践

图1

Pipeline的优势
  • 不同于以往创建流水线的插件,pipeline as code 使用一段脚本代码就可以描述整条流水线,创建、修改、移植、维护等各个方面更加方便;

  • 更加健壮:当Jenkins重启后,流水线可继续执行;

  • 可暂停性:流水线可以实现job的暂停和等待用户的输入或确认后继续执行,更切合实际情况;

  • 可扩展性:通过groovy的编程更容易的扩展插件;

  • Multibranch pipeline 插件支持通过分支触发来构建流水线

Pipeline 基本概念

Stage: 一个Pipeline可以根据执行逻辑划分为若干个Stage,每个Stage包含了多个操作(step)。例如 ,一个包含“编译—自动化测试—发布”等三个阶段的流水线,则可创建三个stage,每个stage分别完成编译、自动化测试、发布等操作。当建立了若干个stage后,就可以通过StageView插件在jenkins上看到流水线上每个stage的进度,如下图:

基于Jenkins pipeline的持续交付流水线介绍及实践

图2

Step:Step是构建过程中最基本的操作单元,小到执行一个命令,大到构建一个Docker镜像,由各类Jenkins Plugin提供。每个stage里通常包含1个~若干个step。常用的step包括:

  • 执行Shell

    基于Jenkins pipeline的持续交付流水线介绍及实践

    基于Jenkins pipeline的持续交付流水线介绍及实践

  • Checkout 代码

    基于Jenkins pipeline的持续交付流水线介绍及实践

  • 归档

    基于Jenkins pipeline的持续交付流水线介绍及实践

  • 用户输入

  • 不带input

    基于Jenkins pipeline的持续交付流水线介绍及实践

    带input

    基于Jenkins pipeline的持续交付流水线介绍及实践

Node: 一个Node就是一个Jenkins节点(一台机器),是执行Step的具体运行环境。一般而言,jenkins所在的机器(Master)负责将流水线任务分配给各个远程节点进行执行,节点通过label来标识。

基于Jenkins pipeline的持续交付流水线介绍及实践

图3,stage-step-node之间的关系


Pipeline shared Libraries

在Jenkinsfile中,可以引用共享库来扩展代码,我们也可以自行将一些常用的功能封装成库供多个pipeline来使用,例如通知模块或者度量模块,都可以封装成库。

基于Jenkins pipeline的持续交付流水线介绍及实践

图4,共享库建立及使用方法


流水线构建实例

基于Jenkins pipeline的持续交付流水线介绍及实践

图5,部署流水线流程

编译阶段

  1. 首先我们使用lock将编译使用的节点进行加锁,使该节点在同一时间只能进行一次编译;

  2. 将代码checkout到节点指定路径,这里我们用到ws block来指定我们的工作路径;

  3. 调用metric共享库向后台记录信息,用于后续的质量度量;

  4. 调用sendmail共享库对交付人员进行通知;

  5. 在工作环境执行编译脚本对代码进行编译;

  6. 将编译产物进行打包,共后续的测试及上线使用。

基于Jenkins pipeline的持续交付流水线介绍及实践

图6

自动化测试阶段

  1. 对自动化运行时间设置超时(此例为20分钟),主要目的是控制后端分布式运行框架的运行时间,如果超时则进行通知,以便我们增加分布式运行机器来缩短用例执行时间;

  2. 调用ansible插件来进行测试环境的部署以及用例的执行;

  3. 调用junit插件来生成结果报告;

基于Jenkins pipeline的持续交付流水线介绍及实践

图7

人工测试阶段

基于Jenkins pipeline的持续交付流水线介绍及实践

图8

打包+上线阶段

在这一阶段,我们主要借助上线平台提供的接口完成服务的上线:

  1. 首先,我们会对之前构建后的产物再次进行打包(可能会添加一些和流量相关的实验配置),并生成上线要使用的rpm包,放到制品仓库;

  2. 其次,调用diff脚本生成diff报告(新上线文件与线上环境的对比),供开发同学进行确认;

  3. 最后,开发确认后,传入要部署的服务与版本,调用上线平台接口完成部署。

基于Jenkins pipeline的持续交付流水线介绍及实践

图9

报告阶段

图10,质量报告样例


质量报告中的部分信息是在流水线运行过程中进行收集的(调用前文提到的metric库)。比如回归测试的结果,我们调用jenkins提供的api对报告结果进行提取,并保存到数据库中。

图11,提取测试结果的函数


写在最后

到此为止,我们对流水线整个环节的建设进行了介绍。然而无论是持续交付也好,pipeline as code也好,我们都是新手。本文可能暴露了很多不成熟与错误之处,敬请大家谅解。我们将在后续的不断实践中完善流水线的构建,争取给大家带来更具有参考性的文章,谢谢大家。




以上是关于基于Jenkins pipeline的持续交付流水线介绍及实践的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins流水线(pipeline)实战之:从部署到体验

基于Jenkins打造符合DevOps能力成熟度三级标准的持续集成流水线

Jenkins的流水线

Jenkins pipeline:pipeline 使用之语法详解

如何使用 Jenkins 的脚本化流水线(Pipeline)

高速流水线,Jenkins Shared Pipeline