Jenkins pipeline 语法详解
原文地址http://www.cnblogs.com/fengjian2016/p/8227532.html
pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。
pipeline 是jenkins2.X 最核心的特性, 帮助jenkins 实现从CI 到 CD与 DevOps的转变
pipeline 提供一组可扩展的工具, 通过 pipeline domain specific language syntax 可以到达pipeline as code 目的
pipiline as code : jenkinsfile 存储在项目的 源代码库
为什么要使用pipeline
1. 代码: pipeline 以代码的形式实现,通过被捡入源代码控制, 使团队能够编译,审查和迭代其cd流程
2 可连续性: jenkins 重启 或者中断后都不会影响pipeline job
3.停顿: pipeline 可以选择停止并等待人工输入或者批准,然后在继续pipeline运行
4.多功能: pipeline 支持现实世界的复杂CD要求, 包括fork、join子进程,循环和并行执行工作的能力
5.可扩展: pipeline 插件支持其DSL的自动扩展以及其插件集成的多个选项。
jenkins pipeline 入门
pipeline 脚本是有groovy 语言实现的
-无需专门学习 groovy
pipeline 支持两种语法
- Declarative 声明式
- Scripted pipeline 脚本式
如何创建基本的pipeline
- 直接在jenkins web ui 网页界面输入脚本
- 通过常见一个jenkins 可以检入项目的源代码管理库
Declarativ 声明式 pipeline
声明式pipeline 基本语法和表达式遵循 groovy语法,但是有以下例外:
- 声明式pipeline 必须包含在固定格式的pipeline{} 块内
- 每个声明语句必须独立一行, 行尾无需使用分号
- 块(Blocks{}) 只能包含章节(Sections),指令(Directives),步骤(Steps),或者赋值语句
- 属性引用语句被视为无参数方法调用。 如input()
块(Blocks{})
- 由大括号括起来的语句: 如 Pipeline{}, Sections{}, parameters{}, script{}
章节(Sections)
- 通常包括一个或者多个指令或步骤 如 agent,post,stages,steps
指令(Directives)
- environment, options, parameters, triggers, stage, tools, when
步骤(steps)
- 执行脚本式pipeline, 如script{}
agent |
|
| 需要 | 必须存在,agent必须在pipeline块内的顶层定义,但是stage内是否使用为可选 |
| 参数 | any/none/label/node/docker/dockerfile |
| 常用参数 | label/customWorkspace/reuseNode |
| 展示: | |
| agent { label 'this k8s-api-label'} | |
|
agent { node{ label ' this is k8sapi-label' customWorkspace '/some/other/path' } } |
agent { docker { image 'im-web' label 'this is k8sapi-label' args '-v /tmp:/tmp' } } |
# customWorkspace node节点的工作空间
post |
|
| 需要 | 否,用于pipeline的最外层或者stage{}中 |
| 参数 | 无 |
| 常用选项 |
构建后操作的内置判定条件 always,changed,failure,sucess,unstable,aborted |
| 展示: | |
![]() pipeline {
![]() |
|
stages |
|
| 需要 | 是,包括顺序执行的一个或者多个stage命令 |
| 参数 | 无 |
| 常用选项 |
构建后操作的内置判定条件 always,changed,failure,sucess,unstable,aborted |
| 展示: | |
![]() pipeline {
![]() |
|
steps |
|
| 需要 | 是,steps位于stage指令块内部,包括一个或者多个step |
| 参数 | 无 |
| 说明 |
仅有一个step的情况下可以忽略关键字step及其{} |
| 展示: | |
![]() pipeline {
![]() |
|
Directives (指令)
environment指令指定一系列键值对,这些键值对将被定义为所有step或stage-specific step的环境变量,具体取决于environment指令在Pipeline中的位置。
该指令支持一种特殊的方法credentials(),可以通过其在Jenkins环境中的标识符来访问预定义的凭据。
对于类型为“Secret Text”的凭据,该 credentials()方法将确保指定的环境变量包含Secret Text内容;对于“标准用户名和密码”类型的凭证,指定的环境变量将被设置为username:password。
environment |
|
| 需要 | 是,environment 定义了一组全局的环境变量键值对 |
| 参数 | 无 |
| 说明 |
存在于pipeline{} 或者stage指令内, 注意特殊方法credentials() ,可以获取jenkins中预定义的凭证明文内容 |
| 展示: | |
![]() pipeline {
![]() |
|
options
buildDiscarder
pipeline保持构建的最大个数。例如:options { buildDiscarder(logRotator(numToKeepStr: '1')) }
disableConcurrentBuilds
不允许并行执行Pipeline,可用于防止同时访问共享资源等。例如:options { disableConcurrentBuilds() }
skipDefaultCheckout
默认跳过来自源代码控制的代码。例如:options { skipDefaultCheckout() }
skipStagesAfterUnstable
一旦构建状态进入了“Unstable”状态,就跳过此stage。例如:options { skipStagesAfterUnstable() }
timeout
设置Pipeline运行的超时时间。例如:options { timeout(time: 1, unit: 'HOURS') }
retry
失败后,重试整个Pipeline的次数。例如:options { retry(3) }
timestamps
预定义由Pipeline生成的所有控制台输出时间。例如:options { timestamps() }
options |
|
| 需要 | 否,预定义pipeline专有的配置信息,仅可定义一次 |
| 参数 | 无 |
| 说明 |
authorizationMatrix, buildDiscarder, catchError, disableConcurrentBuilds, overrideIndexTriggers, |
| 展示: 设置构建超时时间 为1个小时 | |
![]() pipeline {
![]() |
|
parameters
parameters指令提供用户在触发Pipeline时的参数列表。这些参数值通过该params对象可用于Pipeline步骤
可用参数
string
A parameter of a string type, for example: parameters { string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '') }
booleanParam
A boolean parameter, for example: parameters { booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '') }
目前只支持[booleanParam, choice, credentials, file, text, password, run, string]这几种参数类型,其他高级参数化类型还需等待社区支持。
parameters |
|
| 需要 | 否,定义参数化构建的参数 |
| 参数 | 无 |
| 说明 |
booleanParam,choice,file,text,password,run,string |
| 示例 | |
![]() pipeline {
![]() |
|
调用定义的参数, 需要使用 params.PerformMavenRelease


triggers
triggers指令定义了Pipeline自动化触发的方式。对于与源代码集成的Pipeline,如GitHub或BitBucket,triggers可能不需要基于webhook的集成也已经存在。目前只有两个可用的触发器:cron和pollSCM。
triggers |
|
| 需要 | 否,定义pipeline被自动触发的方式 |
| 参数 | 无 |
| 说明 |
cron,pollSCM,upstream |
| 示例 | |
![]() pipeline {
![]() |
|
when
when指令允许Pipeline根据给定的条件确定是否执行该阶段。该when指令必须至少包含一个条件。如果when指令包含多个条件,则所有子条件必须为stage执行返回true。这与子条件嵌套在一个allOf条件中相同(见下面的例子)。
更复杂的条件结构可使用嵌套条件建:not,allOf或anyOf。嵌套条件可以嵌套到任意深度
当正在构建的分支与给出的分支模式匹配时执行,例如:when { branch 'master' }。请注意,这仅适用于多分支Pipeline。
environment
当指定的环境变量设置为给定值时执行,例如: when { environment name: 'DEPLOY_TO', value: 'production' }
expression
当指定的Groovy表达式求值为true时执行,例如: when { expression { return params.DEBUG_BUILD } }
not
当嵌套条件为false时执行。必须包含一个条件。例如:when { not { branch 'master' } }
allOf
当所有嵌套条件都为真时执行。必须至少包含一个条件。例如:when { allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' } }
anyOf
当至少一个嵌套条件为真时执行。必须至少包含一个条件。例如:when { anyOf { branch 'master'; branch 'staging' } }
when |
|
| 需要 | 否 |
| 参数 | 无 |
| 说明 |
inside a stage directive |
![]() pipeline {
![]() |
|
Parallel(并行)
Declarative Pipeline近期新增了对并行嵌套stage的支持,对耗时长,相互不存在依赖的stage可以使用此方式提升运行效率。除了parallel stage,单个parallel里的多个step也可以使用并行的方式运行。

pipeline {
agent any
stages {
stage('Non-Parallel Stage') {
steps {
echo 'This stage will be executed first.'
}
}
stage('Parallel Stage') {
when {
branch 'master'
}
parallel {
stage('Branch A') {
agent {
label "for-branch-a"
}
steps {
echo "On Branch A"
}
}
stage('Branch B') {
agent {
label "for-branch-b"
}
steps {
echo "On Branch B"
}
}
}
}
}
}

变量传递
1. 自定义变量(局部)
def username = 'jenkins'
echo "hello Mr.${username}"
2. 环境变量
withEnv(['JAVA_HOME=/data/jdk']) {
sh '$JAVA_HOME/bin/start.sh'
}
3. 环境变量(全局)
environment {
JAVA_HOME='/data/jdk'
}
echo " java path $JAVA_HOME"
4. 参数化构建(全局)

parameters {
string(name: 'GIT_BRANCH', defaultValue: 'master', description: 'default build branch')
}
调用:
echo "${params.name}"

判断:
1.when 仅用于stage内部
2. when 的内置条件

1). when {branch 'master'} #当是master的时候,才执行某些事情
2). when {envionment name:'DEPLOY_TO',value:'production'} #当环境变量name 的值是production的时候,才执行某些事情
3). when {expression {return params.DEBUG_BUILD}} #表达式的返回值是真的情况下,才执行
4). when {not {branch 'master'}} #不是master的情况下,执行
5). when {allOf {branch 'master'; environment name: 'DEPLOY_TO',value:'production'}} #当大括号中所有的项都成立,才去做某些事情
6). when {anyOf {branch 'master'; branch 'staging'}} #只要满足大括号里面的某一个条件,才去做某些事情

Jenkins pipeline 语法详解的更多相关文章
- Jenkins pipeline:pipeline 语法详解
jenkins pipeline 总体介绍 pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化. ...
- Jenkins Pipeline 参数详解
Pipeline 是什么 Jenkins Pipeline 实际上是基于 Groovy 实现的 CI/CD 领域特定语言(DSL),主要分为两类,一类叫做 Declarative Pipeline,一 ...
- [持续交付实践] pipeline使用:语法详解
一.引言 jenkins pipeline语法的发展如此之快用日新月异来形容也不为过,而目前国内对jenkins pipeline关注的人还非常少,相关的文章更是稀少,唯一看到w3c有篇相关的估计是直 ...
- 自动化集成:Pipeline流水语法详解
前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译.打包.镜像构建.部署等操作:本篇文章主要描述Pipeline流水线用法. 一.Webhook原理 ...
- [转帖]helm模板文件chart编写语法详解
helm模板文件chart编写语法详解 https://blog.51cto.com/qujunorz/2421328 需要学习一下. charts编写介绍 开始 快速创建一个chart模板,helm ...
- 利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解
本文转载自利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解 导语 由于最近工作需要利用 Jenkins 远程 API 操作 Jenkins 来完成一些列操作,就抽空研究 ...
- Velocity魔法堂系列二:VTL语法详解
一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...
- Hive笔记--sql语法详解及JavaAPI
Hive SQL 语法详解:http://blog.csdn.net/hguisu/article/details/7256833Hive SQL 学习笔记(常用):http://blog.sina. ...
- Hadoop Hive sql语法详解
Hadoop Hive sql语法详解 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件 ...
随机推荐
- 使用flask写移动端API
环境 python 3.7 使用pip 安装falsk pip3 install flask #!flask/bin/python from flask import Flask, jsonify, ...
- 在链表中,元素的"位序"概念淡化,结点的"位置"概念淡化
在链表中,元素的"位序"概念淡化,结点的"位置"概念淡化 1 结点的描述与实现 C语言中用带指针的结构体类型来描述 typedef struct Lnode { ...
- Instruments学习之Allocations
Allocations:检测一个进程(选择自己的app)内存分配和使用情况等 我们启动Allocations后得到一个初始界面 初始界面.png 简单说一下上图的3个地方 1:这里有两个部分了,因为官 ...
- 读书笔记-iOS核心动画高级技巧
如果不使用+imageNamed:,那么把整张图片绘制到CGContext可能是最佳的方式了. 这里我们利用了CALayer的KVC来存储和检索任意的值,将图层和索引打标签. 使用KVC打标签
- 内部排序->选择排序->树形选择排序
文字描述 树形选择排序又称锦标赛排序; 比如,在8个运动员中决出前3名至多需要11场比赛, 而不是7+6+5=18场比赛(它的前提是甲胜乙,乙胜丙,则甲必能胜丙) 首先对n个记录的关键字进行两两比较, ...
- LeetCode 824 Goat Latin 解题报告
题目要求 A sentence S is given, composed of words separated by spaces. Each word consists of lowercase a ...
- redis的基本介绍
redis是什么? redis是一种菲关系型数据库,存储key-value类型的数据. redis支持的数据类型 这里所说的数据类型其实就是value对应的数据类型.一共有五种: String 1.S ...
- 网页制作中规范使用DIV+CSS命名规则,可以改善优化功效特别是团队合作时候可以提供合作制作效率,具体DIV CSS命名规则CSS命名大全内容如下:
页头:header 如:#header{属性:属性值;}或.header{属性:属性值;},也许你需要了解class与id区别及用法登录条:loginBar 标志:logo ...
- 安装 Samba服务
参考摘录的是博客园的文章:https://www.cnblogs.com/zhaopengcheng/p/5481048.html ubuntu系统:16.04 1. 首先用管理员权限创建一个新用户, ...
- Eclipse EE下载安装与配置
Eclipse EE下载安装与配置 一.下载 下载链接:http://www.eclipse.org/downloads/eclipse-packages/ 1.进入Eclipse官网进行下载选择Ec ...