Pipeline 使用语法详解
概述
在本章中,我们重点介绍Pipeline的语法,从Pipeline插件2.5版开始,Pipeline支持两种独立的语法结构:Declarative Pipeline和Scripted Pipeline,两者都支持建立连续传送的Pipeline。
如“入门指南”所述,Pipeline最基本的部分是“step”,step告诉Jenkins要做什么,并且作为Declarative Pipeline和Scripted Pipeline语法的基本构建块。
为与BlueOcean编辑器兼容,通常建议使用Declarative Pipeline的方式进行编写,这种语法结构也会是Jenkins Pipeline未来发展的趋势。
Declarative Pipeline
从Pipeline2.5版本以后,Jenkins Pipeline新增了一种新的语法类型Declarative Pipeline(声明式Pipeline),它在Pipeline系统之上提供了一种更加简单和有意义的语法。
所有有效的Declarative Pipeline必须包含在一个pipeline块内,例如:
Declarative Pipeline遵循与Groovy相同的语法规则,但有以下几点例外:
-
Pipeline的顶层必须是块,具体来说就是:pipeline { }。
-
不用分号作为语句分隔符,每个声明必须独立一行。
-
块里只能包含Sections(章节)、Directives(指令)、 Steps(步骤)或赋值语句。
-
属性引用以无参方法的方式调用。例如,输入被视为input()。
Sections(章节)
Declarative Pipeline里的Sections通常包含一个或多个Directives或Steps。
agent
agent指定整个Pipeline或特定stage在Jenkins环境中执行的位置。在pipeline代码块的顶层agent必须进行定义,但在stage级使用是可选的。
为实现Pipeline可能拥有的各种用例,agent支持几种不同类型的参数。这些参数可以应用于pipeline块的顶层,也可以应用在每个stage指令内。
any
在任何可用的agent 上执行Pipeline或stage。例如:agent any
none
当在pipeline块的顶层使用none时,将不会为整个Pipeline运行分配全局agent ,每个stage部分将需要定义其自己的agent。
label
提供label标签名称,在Jenkins环境中可用的agent上执行Pipeline或stage。
例如:agent { label ‘my-defined-label’ }
node
agent { node { label ‘labelName’ } },等同于 agent { label ‘labelName’ },但node也允许其他选项(如customWorkspace)。
docker
定义此参数时,执行Pipeline或stage时会动态提供一个docker节点去运行基于Docker的Pipelines。docker还可以接受一个args参数,直接传递给docker run指令调用。
例如:agent { docker ‘maven:3-alpine’ }或
agent {
docker {
image 'maven:3-alpine'
label 'my-defined-label'
args '-v /tmp:/tmp'
}
dockerfile
使用从Dockerfile仓库中包含的dockerfile创建镜像文件来构建执行Pipeline或stage。为了使用此选项,Jenkinsfile必须从Multibranch Pipeline或“Pipeline from SCM”中加载。
默认目录是在Dockerfile仓库的根目录:agent { dockerfile true }。如果Dockerfile需在另一个目录中建立,可使用dir选项:agent { dockerfile { dir ‘someSubDir’ } }。
还可以通过docker build …使用additionalBuildArgs选项,如agent { dockerfile { additionalBuildArgs ‘–build-arg foo=bar’ } }。
通用选项
这些是可以应用于两个或多个agent中的选项。除非明确定义,否则非必需。
label
string字符串。标记在哪里运行pipeline或stage
此选项适用于node,docker和dockerfile,并且在node中是必需的。
customWorkspace
string字符串。自定义运行的工作空间,它可以是相对路径,在这种情况下,自定义工作区将位于node节点工作空间的根目录下,也可以是绝对路径。例如:
agent {
node {
label 'my-defined-label'
customWorkspace '/some/other/path'
}
}
reuseNode
一个布尔值,默认为false。如果为true,则在同一工作空间中,此选项适用于docker和dockerfile,并且仅在独立stage中使用agent时才有效。
样例
//Jenkinsfile (Declarative Pipeline)
pipeline {
agent {
docker 'maven:3-alpine' } ①
stages {
stage('Example Build') {
steps {
sh 'mvn -B clean verify'
}
}
}
}
①使用‘maven:3-alpine’的镜像创建容器,执行pipeline的所有步骤。
//Jenkinsfile (Declarative Pipeline)
pipeline {
agent none ①
stages {
stage('Example Build') {
agent {
docker 'maven:3-alpine' } ②
steps {
echo 'Hello, Maven'
sh 'mvn --version'
}
}
stage('Example Test') {
agent {
docker 'openjdk:8-jre' } ③
steps {
echo 'Hello, JDK'
sh 'java -version'
}
}
}
}
①agent none在Pipeline顶层定义,表示将不会为整个Pipeline运行分配全局agent,每个stage需自己设置agent。
②使用‘maven:3-alpine’的镜像创建容器,执行此阶段中的步骤。
③使用‘openjdk:8-jre’的镜像创建容器,执行此阶段中的步骤。
post
定义Pipeline或stage运行结束后的操作。post支持以下类型的代码块:always,changed,fa