Jenkins Pipeline语法讲解
作者:互联网
pipeline最简结构
pipeline {
agent any
stages {
stage("build") {
steps {
echo "hello world"
}
}
}
}
- pipeline:代表整条流水线,包括整条流水线的逻辑
- stages:流水线中多个stage的容器。stages部分至少包含一个stage
- stage:阶段,代表流水线的阶段。每个阶段都必须有名称。上述例子中,build就是此阶段的名称
- steps:代表阶段中的一个或多个具体步骤的容器。steps部分至少包含一个步骤。上述例子中,echo就是一个步骤。在一个stage中有且只有一个steps
- agent:指定流水线的执行位置(jenkins agent)。流水线中的每个阶段都必须在某个地方(物理机、虚拟机或Docker容器)执行,agent部分即指定具体在哪里执行。
注意:以上每一个部分都是必需的,少一个,jenkins都会报错
步骤
pipeline基本结构决定的是pipeline整体流程,但是真正“做事”的还是pipeline中的每一个步骤。步骤是pipeline中已经不能再拆分的最小操作。
post部分
...
post {
failure {
mail to: "team@example.com",subject:“The Pipeline failed”
}
}
post部分包含的是在整个pipeline或阶段完成后一些附加的步骤。post部分是可选的,并不包含在pipeline最简结构中。
根据pipeline或阶段的完成状态,post部分分成多种条件块,比如:
- always:不管当前完成状态是什么,都执行
- changed:只要当前完成状态和上一次完成状态不同就执行
- fixed:上一次完成状态为失败或者不稳定(unstable),当前完成状态为成功时执行
- regression:上一次完成状态为成功,当前完成状态为失败、不稳定或中止时执行
- aborted:当前执行结果状态是中止状态时执行
- failure:当前完成状态为失败时执行
- success:当前完成状态为成功时执行
- unstable:当前完成状态为不稳定时执行
- cleanup:清理条件块。不论当前完成状态是什么,在其他所有条件块执行完成后都执行。
post部分可以同时包含多个条件块,代码如下:
pipeline {
agent any
stages {
stage("build") {
steps {
echo "build stage"
}
post {
always {
echo "stage post always"
}
}
}
}
post {
changed {
echo "pipeline post changed"
}
always {
echo "pipeline post always"
}
...
}
}
pipeline支持的指令
pipeline的基本结构满足不了现实多变的需求。所以,jenkins pipeline通过各种指令(directive)来丰富自己。
Jenkins pipeline支持的指令有:
- environment:用于设置环境变量,可定义在stage或pipeline部分
- tools:可定义在pipeline或stage部分。它会自动下载并安装我们指定的工具,并将其加入PATH变量中
- input:定义在stage部分,会暂停pipeline,提示你输入内容
- options:用于配置jenkins pipeline本身的选项,比如options { retry(3) }表示,当pipeline失败时再重试2次。options指令可定义在stage或pipeline部分
- parallel:并行执行多个step。
- parameters:与input不同,parameters是执行pipeline前传入的一些参数
- triggers:用于定义执行pipeline的触发器
- when:当满足when定义的条件时,阶段才执行。
注意:在使用指令时,需要注意的是每个指令都有自己的作用域。如果指令使用的位置不正确,Jenkins将会报错。
pipeline内置基础步骤
文件目录相关步骤
deleteDir:删除当前目录
deleteDir是一个无参步骤,删除的是当前工作目录。通常它与dir步骤一起使用,用于删除指定目录下的内容。
dir:切换到指定目录
默认pipeline工作在工作空间目录下,dir步骤可以让我们切换到其他目录。
dir("/var/logs"){
deleteDir()
}
fileExists:判断文件是否存在
fileExists("/tmp/a.jar")判断/tmp/a.jar文件是否存在。如果参数是相对路径,则判断在相对于当前工作目录下,该文件是否存在。结果返回布尔类型
isUnix:判断是否为类Unix系统
如果当前pipeline运行在一个类Unix系统上,则返回true
pwd:确定当前目录
pwd和Linux系统中pwd命令一样,返回当前所在目录。它有一个布尔类型的可选参数:tmp,如果参数值为true,则返回与当前工作空间管理的临时目录
writeFile:将内容写入指定文件中
writeFile支持的参数有:
- file:文件路径,可以是绝对路径,也可以是相对路径
- text:要写入的文件内容
- encoding(可选):目标文件的编码。如果留空,则使用操作系统默认编码。
readFile:读取文件内容
读取指定文件的内容,以文本返回。readFile支持的参数有:
- file:
- 文件路径,可以是绝对路径,也可以是相对路径
- encoding(可选):目标文件的编码。如果留空,则使用操作系统默认编码。
示例:
...
script{
// "amVua2lucyBib29r" 是 “jenkins book”进行base64编码后的值
writeFile(file:"base64File",text:"amVua2lucyBib29r",encoding:"Base64")
def content = readFile(file:"base64File",encoding:"UTF-8")
echo "${content}"
//打印结果:jenkins book
}
命令相关步骤
与命令相关的步骤其实是Pipelin:Node and Processes插件提供的步骤。由于它是Pipeline插件的一个组件,所以基本不需要单独安装。
sh:执行shell命令
sh步骤支持的参数有:
- script:将要执行的shell脚本,通常在类UNIX系统上可以是多行脚本
- encoding:脚本执行后输出日志的编码,默认值是脚本运行所在系统的编码
- returnStatus:布尔类型,默认脚本返回的是状态码,如果是一个非零的状态码,则会引发pipeline执行失败。如果returnStatus参数为true,则不论状态码是什么,pipeline的执行都不会受影响。
- returnStdout:布尔类型,如果为true,则任务的标准输出将作为步骤的返回值,而不是打印到构建日志中(如果有错误,则依然会打印到日志中)
注:除了script参数,其他参数都是可选的。returnStatus和returnStdout参数一般不同时使用,因为返回值只能有一个;如果同时使用,则只有returnStatus参数生效。
bat、powershell步骤
bat步骤执行的是Windows的批处理命令;powershell步骤执行的是Powershell脚本,这两个步骤支持的参数和sh步骤一样。
制品相关步骤
stash:保存临时文件
stash步骤可以将一些文件保存起来,以便被同一次构建的其他步骤或阶段使用。如果整个pipeline的所有阶段在同一台机器上执行,则不需要stash步骤。因此,需要stash的文件是跨jenkins node使用的。
stash步骤会将文件存储在tar文件中,对于大文件的stash的操作将会消耗jenkins master的计算资源。jenkins官方文档推荐,当文件大小为5~100MB时,应该考虑使用其他替代方案。
stash步骤的参数列表如下:
- name:字符串类型,保存文件的集合的唯一标识
- allowEmpty:布尔类型,允许stash内容为空
- excludes:字符串类型,将哪些文件排除。如果排除多个文件,则使用逗号分隔。留空表示不排除任何文件
- includes:字符串类型,stash哪些文件,留空代表当前文件夹下的所有文件
- useDefaultExcludes:布尔类型,如果是true,则代表使用Ant风格路径默认排除文件列表
注:除了name参数,其他参数都是可选的。其中excludes和includes使用的是Ant风格路径表达式
unstash:取出之前stash文件
unstash步骤只有一个name参数,即stash时的唯一标识。通常stash和unstash步骤同时使用。
pipeline {
agent none
stages {
stage("stash"){
agent {label "master"}
steps {
writeFile(file: "a.txt",text: "$BUILD_NUMBER")
stash(name: "abc",includes: "a.txt")
}
}
stage("unstash") {
agent {label "node2"}
steps {
script{
unstash("abc")
def content = readFile("a.txt")
echo "${content}"
}
}
}
}
}
以上示例中,stash步骤在master节点上执行,而unstash步骤在node2节点上执行
其他步骤
error:主动报错,中止点前pipeline
error步骤的执行类似抛出一个异常。它只有一个必需参数:message。通常省略参数:error("there's an error")
tool:使用预定义的工具
如果在Global Tool Configuration(全局工具配置)中配置了工具,那么可以通过tool步骤得到工具路径。
tool步骤支持的参数有:
- name:工具名称
- type(可选):工具类型,指该工具安装类的全路径类名。
timeout:代码块超时时间
为timeout步骤闭包内运行的代码设置超时时间限制。如果超时,将抛出一个org.jenkinssci.plugins.workflow.steps.FlowInterruptedException异常。timeout步骤支持如下参数:
- time:整型,超时时间
- unit(可选):时间单位,默认是MINUTES
- activity(可选):布尔类型,如果值为true,则只用当日志没有活动后,才真正算作超时。
waitUntil:等待条件满足
不断重复waitUntil块内的代码,直到条件为true。waitUntil不负责处理块内代码的异常,遇到异常时直接向外抛出。waitUntil步骤最好与timeout步骤共同使用,避免死循环。
timeout(50) {
waitUntil {
script {
def r = sh script:"curl http://example",returnStatus:true
return (r == 0)
}
}
}
retry:重复执行块
执行N次闭包内的脚本。如果其中某次执行抛出异常,则只中止本次执行,并不会中止整个retry的执行。同时,在执行retry的过程中,用户是无法中止pipeline的。
steps {
retry(20){
script {
sh script:"curl http://example",returnStatus:true
}
}
}
sleep:让pipeline休眠一段时间
sleep步骤可用于简单地暂停pipeline,其支持的参数有:
- time:整型,休眠时间
- unit(可选),默认是SECONDS
sleep(120) //休眠120秒
sleep(time:"2",unit:"MINUTES")
Ant风格路径表达式
Ant是比maven更老的java构建工具、Ant发明了一种描述文件路径的表达式,大家都习惯称其为Ant风格路径表达式。其包括3中通配符:
- ?:匹配任何单个字符
- *:匹配0个或任意数量的字符
- **:匹配0个或多个目录
标签:文件,Pipeline,步骤,pipeline,stash,讲解,Jenkins,执行,stage 来源: https://www.cnblogs.com/Torres-tao/p/16309188.html