JenkinsPipeline语法概要
Pipeline是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。Pipeline通过Domain Specific Language(DSL)syntax定义Pipeline As Code并且实现持续交付的目的。
Pipeline是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。Pipeline通过Domain Specific Language(DSL)syntax定义Pipeline As Code并且实现持续交付的目的。
基本概念
pipeline的代码定义了整个构建过程,通常包括构建应用程序,测试然后交付应用程序的阶段,下面是pipeline语法中的基本概念:
- Stage
一个
pipeline可以划分成若干个stage,每个stage代表一组操作,例如build、deploy。注意,stage是一个逻辑分组的概念,可以跨多个node或agent - Node
一个
node就是一个jenkins节点,或者是master,或者是agent,是执行step的具体运行环境 - Step
step是最基本的操作单元,小到创建一个目录,大到构建一个docker镜像,由各类jenkins plugin提供,例如sh make
脚本式和声明式流水线
声明式Pipeline是Jenkins Pipeline的一个相对较新的补充,它在Pipeline子系统之上提出了一种更为简化和有意义的语法,包括:
- 提供比
Scripted Pipeline语法更丰富的语法功能 - 声明式
Pipeline代码更容易编写和理解
所有有效的声明性Pipeline必须包含在一个pipeline块内,例如:
pipeline {
/* insert Declarative Pipeline here */
}
声明式pipeline语法
agent
agent部分指定整个Pipeline或特定阶段将在Jenkins环境中执行的位置,具体取决于该agent 部分的放置位置。该部分必须在pipeline块内的顶层定义 ,但 阶段级使用是可选的。
参数
为了支持Pipeline可能拥有的各种用例,该agent部分支持几种不同类型的参数。这些参数可以应用于pipeline块的顶层,也可以应用在每个stage指令内。
-
any 在任何可用的代理上执行
Pipeline。例如:agent any -
none 当在
pipeline块的顶层应用时,将不会为整个Pipeline运行分配全局代理,并且每个stage部分将需要包含其自己的agent部分。例如:agent none -
label 使用提供的标签在
Jenkins环境中可用的代理上执行Pipeline或阶段性执行。例如:agent { label 'my-defined-label' } -
node
agent { node { label 'labelName' } }行为相同agent { label 'labelName' },但node允许其他选项(如customWorkspace) -
docker 执行
Pipeline,或阶段执行,用给定的容器将被动态地供应一个节点预先配置成接受基于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或阶段性执行 。为了使用此选项,Jenkinsfile必须从多分支Pipeline或Pipeline从SCM加载。通常这是Dockerfile源库的根源:agent { dockerfile true }。如果Dockerfile在另一个目录中建立,请使用以下dir选项:agent { dockerfile { dir 'someSubDir' } }。您可以使用docker build …在该additionalBuildArgs选项将其他参数传递给命令,如agent { dockerfile { additionalBuildArgs '--build-arg foo=bar' } }
常用选项
这些是可以应用两个或多个agent实现的几个选项。除非明确说明,否则不需要
-
标签 一个字符串。运行
Pipeline或个人的标签stage。 此选项对于node,docker和dockerfile,并且是必需的node。 -
customWorkspace 一个字符串。运行
Pipeline或个人stage这agent是这个自定义的工作空间内的应用,而不是默认的。它可以是相对路径,在这种情况下,自定义工作区将位于节点上的工作空间根目录下,也可以是绝对路径。例如:
agent {
node {
label 'my-defined-label'
customWorkspace '/some/other/path'
}
}
此选项是有效的node,docker和dockerfile。
- reuseNode
一个布尔值,默认为
false。如果为true,则在同一工作空间中,而不是完全在新节点上运行Pipeline顶层指定的节点上的容器。 此选项适用于docker和dockerfile,并且仅在agent个人使用时才有效果。 例如:
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'
}
}
}
}
post
该post部分定义将在Pipeline运行或阶段结束时运行的操作。一些条件后 的块的内支持post:部分 always,changed,failure,success,unstable,和aborted。这些块允许在Pipeline运行或阶段结束时执行步骤,具体取决于Pipeline的状态。
条件
-
always 总是运行,无论
Pipeline运行的完成状态如何 -
changed 只有当前
Pipeline运行的状态与先前完成的Pipeline的状态不同时,才能运行 -
failure 仅当当前
Pipeline处于“失败”状态时才运行,通常在Web UI中用红色指示表示。 -
success 仅当当前
Pipeline具有“成功”状态时才运行,通常在具有蓝色或绿色指示的Web UI中表示。 -
unstable 只有当前
Pipeline具有“不稳定”状态,通常由测试失败,代码违例等引起,才能运行。通常在具有黄色指示的Web UI中表示。 -
aborted 只有当前
Pipeline处于“中止”状态时,才会运行,通常是由于Pipeline被手动中止。通常在具有灰色指示的Web UI中表示。
例如:
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
post {
always {
echo 'I will always say Hello again!'
}
}
}