自从Jenkins 2.0 版本升级之后,支持了通过代码(Groovy DSL)来描述一个构建流水线,灵活方便地实现持续交付,大大提升 Jenkins Job 维护的效率,实现从 CI 到 CD 到转变。而在2016 Jenkins World 大会上,Jenkins 发布了1.0版本的声明式流水线 - Declarative Pipeline,目前已经到发布了1.2版本,它是一种新的结构化方式定义一个流水线。今天我们一起对比这两种定义流水线的方式以及特性。

1.Pipeline特性- Pipeline As Code

  Jenkins 从根本上讲是一种支持多种自动化模式的自动化引擎。Pipeline 为其添加了一套强大的自动化工具,支持从简单的持续集成到全面的持续交付。Jenkins Pipeline 特性如下:

    代码:Pipeline 以代码的形式描述,通常存储于源代码控制系统,如 Git,使团队能够编辑,审查和迭代其流程定义。

    持久性:Pipeline 可以在计划和计划外重新启动 Jenkins Master 管理时不被影响。

    可暂停:Pipeline 可以选择停止并等待人工输入或批准,然后再继续 Pipeline 运行。

    多功能:Pipeline 支持复杂的项目持续交付要求,包括并行分支/连接,循环和执行 Job 的能力。

    可扩展:Pipeline 插件支持其 DSL 的自定义扩展以及与其他插件集成。

  基于 Jenkins Pipeline,用户可以在一个 JenkinsFile 中快速实现一个项目的从构建、测试以到发布的完整流程,并且可以保存这个流水线的定义。

  下面的流程图是在 Jenkins Pipeline 中建模的一个持续交付方案的示例:

2.Pipeline 基本概念

  Node: 一个 Node 就是一个 Jenkins 节点,或者是 Master,或者是 Agent,是执行 Step 的具体运行环境,Pipeline 执行中的大部分工作都是在一个或多个声明 Node 步骤的上下文中完成的。

  Stage: 一个 Pipeline 可以从逻辑上划分为若干个 Stage,每个 Stage 代表一组操作,如:Build、Test、Deploy。注意,Stage 是一个逻辑分组的概念,可以跨多个 Node。

  Step: Step 是最基本的操作单元,小到执行一个 Shell 脚本,大到构建一个 Docker 镜像,由各类 Jenkins Plugin 提供,当插件扩展Pipeline DSL 时,通常意味着插件已经实现了一个新的步骤。

  另外在 Jenkins Pipeline 中定义的 Stage(各个阶段的逻辑划分),Jenkins 提供了 Stage View 插件,按照 Stage 逻辑划分任务,对用户透明化、可视化展示流水线的执行,如下图:

3.Scripted Pipeline

  上图通过 Jenkinsfile 定义了流水线的各个阶段(不仅限这几个阶段):构建,测试以及发布,在每个阶段可以执行相应的任务,而在 Scripted Pipeline 中,用户可以使用 Groovy 语法脚本来自定义流程控制,如下:

  CurrentBuild 可以获取档次执行的结果,可以用于判读后续流程走向,Jenkins 还提供了更多内置环境变量以及 DSL 对象,方便我们操作流水线任务,如:BUILD_ID、JOB_NAME、BRANCH_NAME、CHANGE_ID 等等,可参考Global Variable。这种方式受 Jenkins 的限制较少,我们可以灵活控制和定义一个流水线,甚至我们可以在 JenkinsFile 中定义多个 Groovy 函数来扩展 Jenkins Pipeline 的能力。

4.Declarative Pipeline

  同样的,上图定义了流水线的各个阶段,Declarative Pipeline 这种方式受 Jenkins 限制较多,需使用预定义的结构。Jenkins 已经预置了很多描述流水线的结构,可以在没有 Groovy 基础上快速建立流水线,当然在 Declarative Pipeline 同样支持写 Groovy 脚本,但官方不推荐把脚本直接写在流水线中,应该把这些逻辑定义在 Shared Libraries 中。

  如下:

4.1 Declarative Pipeline 语法

  下面介绍几个重点 Declarative Pipeline 语法:

  定义执行环境

  通过 Agent 来定义 Pipeline 的执行环境,在每个 Pipeline,Agent 是必需存在的。Agent 也可以用 Label 指定具体的 Jenkins Slave Node,并且每个 Stage 可以单独指定 Agent,灵活调度资源以及运行环境。

  环境变量

  可以定义为全局的,也可以为 Stage 来定义。

  已定义的环境变量,可以通过 Env 来访问,与 Scripted Pipeline 一样,可以访问 Jenkins 预置的环境变量。

  参数

  可以通过 Params 对象来访问构建时的参数。如:

  流程控制

  可以通过 When 语法控制流程走向,判断环境变量或自定义表达式,是否执行某一个 Stage,同时 Anyof, Allof 进行逻辑运算,Anyof 对应或运算,Allof 对应与运算。

  超时、重试机制

  资源的清理工作 & 结束后操作

  使用 Post 来完成一些资源的清理工作。其和Stages平级:

  清理结束阶段也可以执行一个邮件通知:

  并发 Stages

  Declarative Pipeline 1.2 版本对并发语法做了升级:

  其中 FailFast 可以控制如果并发的任务的其中一个失败,立即结束流水线,执行清理结束任务。

5.总结

  Scripted Pipeline 和 Declarative Pipeline 两种流水线定义的主要区别在于语法和灵活性上, Declarative Pipeline 语法要求更严,需使用 Jenkins 预定义的DSL 结构,使用简单; Scripted Pipeline 受限很少,限制主要在 Groovy 的结构和语法,大家可以根据个人或企业的情况选择两种方式,比如如果公司没有 Groovy 技术栈,可以考虑直接使用 Declarative Pipeline, 学习曲线低,可以快速上手,并且新的 Blue Ocean Editor 插件可以帮助我们可视化的创建一个流水线,如果对Groovy非常熟悉,那Scripted Pipeline 是一个不错的选择。

jenkins pipeline的声明式与脚本式的更多相关文章

  1. 二十 Spring的事务管理及其API&事务的传播行为,编程式&声明式(xml式&注解式,底层AOP),转账案例

    Spring提供两种事务方式:编程式和声明式(重点) 前者需要手写代码,后者通过配置实现. 事务的回顾: 事务:逻辑上的一组操作,组成这组事务的各个单元,要么全部成功,要么全部失败 事务的特性:ACI ...

  2. jenkins pipeline语法

    目录 一.声明式 二.脚本式 基本 判断 异常处理 Steps node withEnv 一.声明式 声明式Pipeline必须包含在名为pipeline的语句块中,典型的声明式Pipeline语法如 ...

  3. Jenkins 在声明式 pipeline 中并行执行任务

    在持续集成的过程中,并行的执行那些没有依赖关系的任务可以缩短整个执行过程.Jenkins 的 pipeline 功能支持我们用代码来配置持续集成的过程.本文将介绍在 Jenkins 中使用声明式 pi ...

  4. Jenkins教程——从安装到部署Docker服务(二)声明式流水线HelloWorld

    前言 本文通过一个声明式流水线的HelloWorld程序做一下流水线基础入门,对常用的流水线参数进行简要说明 什么是流水线 现实中的流水线 流水线比较好理解,类比于现实生活中的生产流水线,每个流程只做 ...

  5. devops持续集成,Centos7.6下gitlab+jenkins(pipeline)实现代码自动上线

    持续集成 gitlab+jenkins(pipeline)实现代码自动上线 环境准备:Centos7.6版本ip:192.168.0.13 主机名:gitip:192.168.0.23 主机名:jen ...

  6. vue的声明式渲染

    声明式渲染 答:2018-8-23声明式渲染是vue对数据进行操作的模式,也叫做响应式渲染当dom节点上绑定了vue的对象的属性时,如果这个属性发生了改变,无需你进行其它的操作,页面上的数据会自动发生 ...

  7. Jenkins pipeline声明式语法

    目录 一.最简结构 二.简单例子 一.最简结构 pipeline {     agent any     stages {         stage('pull') {             st ...

  8. JavaScript在页面中的执行顺序(理解声明式函数与赋值式函数) 转载

    JavaScript在页面中的执行顺序 https://blog.csdn.net/superhoy/article/details/52946277 2016年10月27日 15:38:52 阅读数 ...

  9. 关于CSS自文档的思考_css声明式语言式代码注释

    obert C. Martin写的<Clean Code>是我读过的最好的编程书籍之一,若没有读过,推荐你将它加入书单. 注释就意味着代码无法自说明 —— Robert C. Martin ...

随机推荐

  1. 从零搭建springboot服务01-初始搭建、内嵌swagger

    愿历尽千帆,归来仍是少年 1.基础springBoot框架 编辑工具:IDEA.jdk1.8.tomcat8.maven3.3.9 编码格式:UTF-8 参考文献:https://www.cnblog ...

  2. [其他] vscode 快速教程

    概述 vs:集成开发环境,包括软件生命周期中需要的大部分工具,如UML,代码管控,IDE等 vs code:代码编辑器,支持插件扩展,对网页和云端开发做了优化 快捷键 F1/ctrl+shift+p: ...

  3. QT windows 应用程序 exe ,设置详细信息并解决中文乱码问题

    原博主:https://blog.csdn.net/xiezhongyuan07/article/details/87691490 1.新创建一个.rc文件,随意命名,例如叫app.rc 并编辑 1 ...

  4. [转载]性能测试工具 2 步解决 too many open files 的问题,让服务器支持更多连接数

    [转载]性能测试工具 2 步解决 too many open files 的问题,让服务器支持更多连接数 大话性能 · 2018年10月09日 · 最后由 大话性能 回复于 2018年10月09日 · ...

  5. SystemVerilog MCDF验证结构

    MCDF的设计和验证花费的时间:(工作中假设的时间) design  cycle time  ==10days how about 验证?verify? 模块越往上(大')验证花费的时间越来越大,但是 ...

  6. Linux(CentOS7)下Nginx安装

    记录一下 Linux(CentOS7) 下 Nginx 安装过程 一.准备工作 版本说明: Linux版本:CentOS 7 64位 Nginx版本:nginx-1.20.0 1. 下载安装文件 采用 ...

  7. .NET平台系列15 .NET5的吊炸天性能改进

    系列目录     [已更新最新开发文章,点击查看详细] .NET5的性能改进测试功能 Benchmark.NET现在是衡量.NET代码性能的规范工具,可轻松分析代码段的吞吐量和分配. .NET5的性能 ...

  8. python爬取微信小程序(实战篇)

    python爬取微信小程序(实战篇) 本文链接:https://blog.csdn.net/HeyShHeyou/article/details/90452656 展开 一.背景介绍 近期有需求需要抓 ...

  9. python 获取时间范围内日期列表

    python 获取时间范围内日期列表 import datetime def dateRange(beginDate, endDate): dates = [] dt = datetime.datet ...

  10. Unity3d_2018_2019_2020安装包

    网上各种注册,官网登陆这么麻烦,留着自用 链接:https://pan.baidu.com/s/1LBtMetnr9xkOa18xYiFoDA 提取码:o01t 链接:https://pan.baid ...