Jenkins入门之Pipeline语法(1)
1.什么是pipeline
从某种抽象层次上讲,部署流水线(Deployment pipeline)是指从软件版本控制库到用户手中这一过程的自动化表现形式。——《持续交付——发布可靠软件的系统方法》
按《持续交付》中的定义,Jenkins本来就支持pipeline(通常会把部署流水线简称为pipeline,本书会交替使用这两个术语),只是一开始不叫pipeline,而叫任务。
所有的pipeline都会在Jenkins上产生一个Jenkinsfile文件. Jenkins默认是不支持Jenkinsfile的。我们需要安装pipeline插件
2.pipeline语法
2.1 脚本式语法
脚本式语法更像是Groovy代码,有着巨大的灵活性,但是鉴于使用此种语法还需要去了解Groovy代码,这里就先不去做研究
node {
stage('Build') {
// 执行构建
}
stage('Test') {
// 执行测试
}
stage('Deploy') {
try{
// 执行构建
}catch(err){
currentBuild.result = "FAILURE"
mail body: "project build error is here:$(env.BUILD_URL)" ,
from: 'xxx@yyy.com',
replyTo: 'yyy@yyyy.com',
subject: 'project build failed',
to: 'zzz@yyy.com'
throw err
}
}
}
2.2 声明式语法
在Jenkins社区推介的pipeline语法中,声明式语法更加得到青睐,因为它更加简单,更结构化.
pipline {
agent any
stages {
stage('Build') {
steps {
echo 'Building..'
}
}
stage('Test') {
steps {
echo 'Testing..'
}
}
stage('Deploy') {
steps {
echo 'Deploying..'
}
}
}
post {
failure {
mail to: 'team@example.com', subject: 'The Pipline failed :('
}
}
}
2.3 在Jenkins上新建一个流水线任务,并在pipeline写上测试代码
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Hello World'
}
}
}
}
3. pipeline语法说明
3.1 必要的Groovy知识
- 虽然Groovy同时支持静态类型和动态类型,但是在定义变量时,在Groovy中我们习惯使用def关键字,比如def x="abc"、def y=1。
- 不像Java,Groovy语句最后的分号不是必需的。
- Groovy中的方法调用可以省略括号,比如System.out.println "Hello world"。
- 支持命名参数,例如:
//定义一个函数名字为createName,并向它传递两个字符参数,函数会返回相应的字符. def createName(String giveName, String familyName){ return givenName + " " + familyName } //调用时可以这样 createName familyName = "Lee", giveName = "Bruce"
- 支持默认参数值,例如:
def sayHello(String name = "humans"){ print "hello ${name}" } sayHello() //此时括号不能省略
- 支持单引号、双引号。双引号支持插值,单引号不支持。比如
def name = 'word' print "hello ${name}" // 结果: hello world print 'hello ${name}' // 结果: hello ${name}
- 支持三单引号和三双引号,都可以进行换行,但只有三双引号支持插值
3.2 pipeline的组成
Jenkins pipeline其实就是基于Groovy语言实现的一种DSL(领域特定语言),用于描述整条流水线是如何进行的。流水线的内容包括执行编译、打包、测试、输出测试报告等步骤。
3.2.1 pipeline最简单结构
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Hello World'
}
}
}
}
- pipeline: 代表整条流水线,所有的步骤和逻辑都包含在这里面.
- stages: 整个流水线所有的步骤都包含在这个里面
- stage: 阶段. 一整个流水线中的其中一个步骤
- steps: 流水线中的一个或者多个stage中的某个详细步骤
- agent: 指定该条流水线从哪里开始执行(物理机, 虚拟机, 容器)
3.2.2 步骤
pipeline中的每一个步骤组成了一个具体的流水线, pipeline中的有些步骤集成在了插件中,只要安装了相应的插件就可以使用了.
参考地址: https://github.com/jenkinsci/pipeline-plugin/blob/master/COMPATIBILITY.md
3.3 post部分
post是整个pipeline步骤完成之后的内容,相当于是一个反馈部分
根据pipeline或阶段的完成状态,post部分分成多种条件块,包括:
• always:不论当前完成状态是什么,都执行。
• changed:只要当前完成状态与上一次完成状态不同就执行。
• fixed:上一次完成状态为失败或不稳定(unstable),当前完成状态为成功时执行。
• regression:上一次完成状态为成功,当前完成状态为失败、不稳定或中止(aborted)时执行。
• aborted:当前执行结果是中止状态时(一般为人为中止)执行。
• failure:当前完成状态为失败时执行。
• success:当前完成状态为成功时执行。
• unstable:当前完成状态为不稳定时执行。
• cleanup:清理条件块。不论当前完成状态是什么,在其他所有条件块执行完成后都执行。post部分可以同时包含多种条件块。
3.4 pipeline的指令
指令是pipeline基础结构中的补充:
# 在使用指令时,需要注意的是每个指令都有自己的“作用域”。如果指令使用的位置不正确,Jenkins将会报错
• environment:用于设置环境变量,可定义在stage或pipeline部分。
• tools:可定义在pipeline或stage部分。它会自动下载并安装我们指定的工具,并将其加入PATH变量中。
• input:定义在stage部分,会暂停pipeline,提示你输入内容。
• options:用于配置Jenkins pipeline本身的选项,比如options {retry(3)}指当pipeline失败时再重试2次。options指令可定义在stage或pipeline部分。
• parallel:并行执行多个step。在pipeline插件1.2版本后,parallel开始支持对多个阶段进行并行执行。
• parameters:与input不同,parameters是执行pipeline前传入的一些参数。
• triggers:用于定义执行pipeline的触发器。
• when:当满足when定义的条件时,阶段才执行。