Jenkins提供了两种开发pipeline代码的方法,脚本化的和表述性的。

脚本化pipeline也就是我们传说中的传统pipeline,支持Groovy语法。

表述性pipeline提供了更简单的更友好的语法,提供了更多表述性的语法,用户不一定非要去学习和写Groovy。

Jenkins pipeline plugin version 2.5及以上版本开始支持表述性pipeline。

本文,将介绍在表述性pipeline中所有指令。

表述性pipeline的语法

一个合法的表述性pipeline必须定义一个pipeline语句,并且包含以下所需要的部分:

  • agent

  • stages

  • stage

  • steps

以及如下可选用的指令:

  • environment(stage/pipeline级别)

  • input(stage级)

  • options(stage/pipeline级别)

  • parallel

  • parameters

  • post

  • script

  • tools

  • triggers

  • when

指令详解

让我们来看一下列举指令使用的例子。

  • agent

    pipeline {agent any---
    }
    
  • stages

    pipeline {agent anystages {...}
    }
    
  • stage

    pipeline {agent anystages {stage ('build') {...}stage ('test: integration-&-quality') {...}stage ('test: functional') {...}stage ('test: load-&-security') {...}stage ('approval') {...}stage ('deploy:prod') {...}}
    }
    
  • steps

    steps必须用在stage级别

    steps {
    sh 'echo "A one line step"'
    sh '''
    echo "A multiline step"'
    cd /tests/results
    ls -lrt
    '''
    }
    
  • Environment

    Enviroment必须用在pipeline或者stage级别

    pipeline {agent anyenvironment {OUTPUT_PATH = './outputs/'}stages {stage ('build') {...}...}
    }

    或者

    pipeline {agent anystages {stage ('build') {           environment {OUTPUT_PATH = './outputs/'}...}...}
    }
    
  • input

    input指令定义在stage级别,提供发起输入的功能。这个stage会暂停,直到用户手动输入并确认 The "input" directive is defined at a stage level and provides the functionality to prompt for an input. The stage will be paused until a user manually confirms it.

    pipeline {agent anystages {stage ('build') {         input{message "Press Ok to continue"submitter "user1,user2"parameters {string(name:'username', defaultValue: 'user', description: 'Username of the user pressing Ok')}}steps { echo "User: ${username} said Ok."}}}}
    
  • Options

    定义在pipeline级别,该指令会将某些指令为该pipeline进行分组。 可用的选项有:

    • buildDiscarder
    • disableConcurrentBuilds
    • overrideIndexTriggers
    • skipDefaultCheckout
    • skipStagesAfterUnstable
    • checkoutToSubdirectory
    • newContainerPerStage
    • timeout
    • retry
    • timestamps

    例如,在pipeline失败之前,重新执行三次

    pipeline {
    agent any
    options {retry(3)
    }
    stages {---
    }
    }
    
  • Parallel

    以下脚本会在在不同操作系统上,执行不同的测试。我们还可以在同一个Node上同时执行不同的stages。 但是,当我们使用并发stages,我们需要满足以下限制:

    • stage指令可以含有parallel或者steps,但是不能同时两个都有。
    • 在parallel内部定义的stage不能再定义parallel,只能定义steps.
    • stage指令可以含有parallel指令,但不能同时在使用agent或着tools指令-
    pipeline {agent nonestages {stage('Run Tests') {parallel {stage('Test On Windows') {agent { label "windows" }steps {bat "run-tests.bat"}}stage('Test On Linux') {agent { label "linux" }steps {sh "run-tests.sh"}}}}}}
    
  • Parameters

    Pamaters指令支持我们定义一组在脚本中使用的参数。Parameters应在Pipeline在触发时被提供。其应该在'pipeline'级别定义,且一个pipeline只允许一个paramters指令。 字符串和布尔变量是可用的变量类型。

pipeline {agent anyparameters {string(name: 'user', defaultValue: 'John', description: 'A user that triggers the pipeline')}stages {stage('Trigger pipeline') {steps {echo "Pipeline triggered by ${params.USER}"}}}
}
  • Post

    Post可用在pipeline或者stage级别,当pipeline或者stage完成后,这一部分会根据条件判断是否执行。 这些条件如下:

    • always: 无论成败,都会执行
    • changed: 只有该次和上次执行结果不同时,才会执行
    • fixed: 只有上次失败,这次成功,才会执行
    • regression: 只有上次成功,这次失败,被取消或者不稳定才会执行
    • aborted: 被取消时,才会执行
    • failure: 失败时,才会执行
    • success: 成功时,才会执行
    • unstable: 不稳定,才会执行

    由于在pos块中的句子总会在最后执行,所以,清理工作,通知工作等通常定义在此。

    pipeline {agent anystages {stage('Some steps') {steps {...}}}post {always {echo “Pipeline finished”bat ./performCleanUp.bat}}
    }
    
  • Script

    要用在stage级别。这些语法块允许我们扩展Jenkins功能并作为共享lib分享。

    pipeline {agent anystages {stage('Sample') {steps {echo "Scripted block"script {}}}}}
    
  • Tools

    要用在pipeline或者stage级别,用来指定哪个maven, jdk或者gradle版本。

    pipeline {agent anytools {maven 'apache-maven-3.0.1' }stages {...}
    }
    
  • Triggers

    Triggers允许Jenkins通过以下配置自动触发pipelines:

    • cron: 定义pipeline定时触发
    • pollSCM: 当定义cron时,允许Jenkins检测仓库源的更新。如果有更新,则触发pipeline
    • upstream: 将一组Jenkins jobs的列表作为输入阈值,当列表中任一个任务执行结束后,该pipeline会被触发。
    pipeline {agent anytriggers {//Execute weekdays every four hours starting at minute 0cron('0 */4 * * 1-5')}stages {...}
    }
    

    或者

    pipeline {agent anytriggers {//Query repository weekdays every four hours starting at minute 0pollSCM('0 */4 * * 1-5')}stages {...}
    }
    

    或者

    pipeline {agent anytriggers {//Execute when either job1 or job2 are successfulupstream(upstreamProjects: 'job1, job2', threshold: hudson.model.Result.SUCCESS)}stages {...}
    }
    
    • When

    在stage级别使用。如果满足when则steps执行,如果不满足,steps则不执行。例如,pipeline允许在一个project中多个branch,即multibranched pipeline。则根据不同的branch,可执行不同的操作,如下:

    pipeline {agent anagent anystages {stage ('Deploy stage') {when {branch 'master'}steps {echo 'Deploy master to stage'...}}}
    }
    

注意事项

  • 表述性pipeline如果存在语法错误,一旦触发,就会立即报错。
  • Pipeline支持表述性的指令也支持脚本。表述性指令内部嵌套脚本步骤是种不错的事件。
  • 在CI/CD环境中,Jenkins pipeline有广泛的应用场景

英语原文为:https://www.blazemeter.com/blog/how-to-use-the-jenkins-declarative-pipeline

如何使用表述性Pipeline相关推荐

  1. Restful 表述性状态传递

    Restful REST表述性状态传递 REST通常基于使用HTTP,URL,XML,HTML. REST使用的数据格式为JSON HTTP方法 GET 获取数据 PUT 用于更新和添加数据 DELE ...

  2. REST - 表述性状态转移

    表述性状态转移(REST - Representional State Transfer) The Representational State Transfer (REST) style is an ...

  3. 微服务——REST(Representational State Transfer,表述性状态转移)

    面试造飞机系列:看架构师如何设计微服务接口 REST(Representational State Transfer,表述性状态转移) 是一种软件架构风格.REST提出了一组架构约束条件和原则,任何满 ...

  4. REST(Representational State Transfer):表述性状态转移

    REST(Representational State Transfer):表述性状态转移概念:REST是一种跨平台.跨语言的架构风格.1)在REST架构风格中,对象被抽象为一种资源,表述性状态是指( ...

  5. REST(Representational State Transfer表述性状态转移)

    http://zh.wikipedia.org/zh-cn/REST REST(Representational State Transfer表述性状态转移)是一种针对网络应用的设计和开发方式,可以降 ...

  6. REST表述性状态传递

    REST定义了一组体系架构原则,近年来已经成为最主要的Web服务设计模式. 1.链接原则:任何可能的情况下,使用链接指引可以被标识的事物(资源). 2.统一接口原则:通用标准方法使得所有理解HTTP应 ...

  7. Jenkins Pipeline 语法

    目录 声明性pipeline Sections agent pipeline与stage中的不同 参数 常用选项 发布 post stages steps Directives environment ...

  8. Python面试题解析之前端、框架和其他

    python面试题解析(前端.框架和其他) 答: HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善 ...

  9. python面试题解析(前端、框架和其他)

    答: HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

最新文章

  1. 机器学习算法基础知识
  2. Tensorflow:如何保存/恢复模型?
  3. 演示:通过实验取证IP报文的各个字段
  4. 弹出窗口, 不显示工具栏等。
  5. Windows 环境下 Chrome浏览器崩溃“STATUS_INVALID_IMAGE_HASH”
  6. Intel 64/x86_64/IA-32/x86处理器 - 锁原子操作(1) - 处理器保证的原子操作
  7. 公用表表达式(CTE)
  8. JavaScript学习(四十)—字面量创建对象图解
  9. 《Algorithms》Comparable 实现插入排序
  10. 表达式必须是常量表达式
  11. LIVE555play流程
  12. SHA256算法详解及python实现
  13. 三星a5000刷Android原生,三星 A5000中文Recovery刷机教程
  14. CSDN博客专家申请的条件及规则
  15. 【OpenGL】笔记六、GLM配置
  16. 抖音、吃鸡、王者荣耀:你的自律,是如何被顶级产品经理一步一步毁掉的
  17. Android保存图片到系统图库并通知系统相册刷新
  18. 关于小米安装app的问题
  19. 定制linux版本,定制属于自己的Linux操作系统
  20. solidworks导出obj模型和mtl材质

热门文章

  1. [运维|virsh]virsh 命令行管理虚拟机
  2. 付费系列 3 - 单障碍和单触碰期权 PDE 有限差分
  3. 电子学:第013课——实验 14:可穿戴的脉冲发光体
  4. 巧用免费crm系统培养客户忠诚度
  5. 无线电跳频技术之母 海蒂·拉玛
  6. 按键精灵定时执行录制脚本
  7. 使用UCF101完成的视频动作分类识别
  8. Spring总结pt4
  9. 简单的docker-k8s集群部署
  10. 关于使用福昕阅读器电脑卡问题(使用ubuntu)!