Jenkins Pipeline语法(上)
Jenkins Pipeline语法(中)
Jenkins Pipeline语法(下)
如“ 入门指南 ”所述,Pipeline最基本的部分是“步骤”。基本上,步骤告诉Jenkins 要做什么,并且作为Declarative和Scripted Pipeline语法的基本构建块。
声明性Pipeline
声明性Pipeline是Jenkins Pipeline 的一个相对较新的补充, 它在Pipeline子系统之上提出了一种更为简化和有意义的语法。
所有有效的声明性Pipeline必须包含在一个pipeline块内,例如:
pipeline {
/* insert Declarative Pipeline here */
}
声明性Pipeline中有效的基本语句和表达式遵循与Groovy语法相同的规则 ,但有以下例外:
- Pipeline的顶层必须是块,具体来说是:pipeline { }
- 没有分号作为语句分隔符。每个声明必须在自己的一行
- 块只能包含章节, 指令,步骤或赋值语句。
- 属性引用语句被视为无参数方法调用。所以例如,输入被视为input()
您可以使用 声明性指令生成器 来帮助您配置声明性Pipeline中的指令和部分。
Sections
声明性Pipeline中的Sections通常包含一个或多个指令或步骤。
代理 agent
agent
指定整个Pipeline或特定stage将在Jenkins环境中执行的位置,具体取决于该agent
部分的位置。该部分必须在pipeline
块内的顶层定义,stage
块内的agent是可选的 。
是否必填 | 是 |
---|---|
参数 | 如下面所描述的 |
允许出现在 | 在顶级pipeline 块和每个stage 块中。 |
参数
为了支持Pipeline作者可能拥有的各种使用场景,agent部分支持几种不同类型的参数。这些参数可以应用于pipeline块的顶层,也可以应用在每个stage指令内。
any
在任何可用的代理上执行Pipeline或stage。例如:agent any
none
当在pipeline
块的顶层应用时,将不会为整个Pipeline运行分配全局代理,并且每个stage
部分将需要包含其自己的agent
部分。例如:agent none
label
使用提供的标签在Jenkins环境中可用的代理上执行Pipeline或stage性执行。例如:agent { label 'my-defined-label' }
node
agent { node { label 'labelName' } }
行为和 agent { label 'labelName' }
相同,但node
允许其他选项(如customWorkspace
)。
docker
用给定的容器执行Pipeline,或stage,将被动态地提供一个预先配置成基于Docker-based Pipelines的节点,或和label
参数匹配的任选节点。 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
源存储库中包含的容器构建容器来执行Pipeline或stage 。为了使用此选项,Jenkinsfile
必须从Multibranch Pipeline或Pipeline from SCM加载。通常Dockerfile
在源码库的根路径:agent { dockerfile true }
。如果Dockerfile
在其他目录中建立,请使用以下dir
选项:agent { dockerfile { dir 'someSubDir' } }
。您可以使用additionalBuildArgs
选项将其他参数传递给docker build ...
命令,如agent { dockerfile { additionalBuildArgs '--build-arg foo=bar' } }
。
常用选项
下面是可以用于两个或多个agent的常用选项。在没有明确说明的情况下选项是可选的。
-
label
一个字符串。在这些标签上运行Pipeline或每个
stage
。此选项可用于node
,docker
和dockerfile
,并且 对于node
是必需的。 -
customWorkspace
一个字符串。运行Pipeline或每个
stage
, 在这个agent
的自定义的工作空间内,而不是默认的。它可以是相对路径,在这种情况下,自定义工作区将位于节点上的工作空间根目录下,也可以是绝对路径。例如:
agent {
node {
label 'my-defined-label'
customWorkspace '/some/other/path'
}
}
-
reuseNode
一个布尔值,默认为false。如果为true,则在同一工作空间中,而不是完全在新节点上运行Pipeline顶层指定的节点上的容器。此选项适用于
docker
和dockerfile
,并且仅在agent
的每个stage
内才有效果。
例如:
Jenkinsfile (Declarative Pipeline)
pipeline {
agent { docker 'maven:3-alpine' }
stages {
stage('Example Build') {
steps {
sh 'mvn -B clean verify'
}
}
}
}
在给定名称和tag(
maven:3-alpine
)的新创建的容器中执行此Pipeline中定义的所有步骤。
Stage-level agent
部分
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顶层定义确保执行者不会被不必要地分配。使用agent none
也强制每个stage
部分包含自己的agent
部分使用此镜像在新创建的容器中执行此stage中的步骤
在新创建的容器中使用与前一个stage的不同镜像执行此stage中的步骤
发布 post
post定义将在Pipeline运行或stage结束时运行的操作。一些条件后 的块的内支持post: always,changed,failure,success,unstable,
和aborted
。这些块允许在Pipeline运行或stage结束时执行步骤,具体取决于Pipeline的状态。
是否必填 | 否 |
---|---|
参数 | 没有 |
允许出现在 | 在顶级pipeline 块和每个stage 块中。 |
条件
-
always
无论Pipeline运行的完成状态如何都会运行。
-
changed
只有当前Pipeline运行的状态与先前完成的Pipeline的状态不同时,才能运行。
-
failure
仅当当前Pipeline处于“失败”状态时才运行,通常在Web UI中用红色指示表示。
-
success
仅当当前Pipeline具有“成功”状态时才运行,通常在具有蓝色或绿色指示的Web UI中表示。
-
unstable
只有当前Pipeline具有“不稳定”状态,通常由测试失败,代码违例等引起,才能运行。通常在具有黄色指示的Web UI中表示。
-
aborted
只有当前Pipeline处于“中止”状态时,才会运行,通常是由于Pipeline被手动中止。通常在具有灰色指示的Web UI中表示。
-
cleanup
无论管道或stage的状态如何,在跑完所有其他的
post
条件后运行此条件下 的post
步骤。
例如:
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
post {
always {
echo 'I will always say Hello again!'
}
}
}
通常,该
post
部分应放在Pipeline末端post条件块包含的步骤和steps中的步骤用法相同
stage stages
包含一个或多个stage指令的序列,该stages
部分是Pipeline 描述的大部分“工作”所在的位置。建议stages
至少为持续交付流程的每个独立部分包含至少一个stage指令,例如构建,测试和部署。
是否必填 | 是 |
---|---|
参数 | 没有 |
允许出现在 | 在pipeline 内只有一次。 |
例如
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}
stages
部分一般跟在agent
,options
等后面。
步骤 steps
steps
部分定义了在给定stage
指令中执行的一系列一个或多个步骤。
是否必填 | 是 |
---|---|
参数 | 没有 |
允许出现在 | 每个stage 块内 |
例如
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}
steps
部分必须包含一个或多个步骤