Jenkins提供了两种开发pipeline代码的方法,脚本化的和表述性的。
脚本化pipeline也就是我们传说中的传统pipeline,支持Groovy语法。
表述性pipeline提供了更简单的更友好的语法,提供了更多表述性的语法,用户不一定非要去学习和写Groovy。
Jenkins pipeline plugin version 2.5及以上版本开始支持表述性pipeline。
本文,将介绍在表述性pipeline中所有指令。
表述性pipeline的语法
一个合法的表述性pipeline必须定义一个pipeline语句,并且包含以下所需要的部分:
-
agent
-
stages
-
stage
-
steps
以及如下可选用的指令:
-
environment(stage/pipeline级别)
-
input(stage级)
-
options(stage/pipeline级别)
-
parallel
-
parameters
-
post
-
script
-
tools
-
triggers
-
when
指令详解
让我们来看一下列举指令使用的例子。
-
agent
pipeline { agent any --- }
-
stages
pipeline { agent any stages { ... } }
-
stage
pipeline { agent any stages { stage ('build') { ... } stage ('test: integration-&-quality') { ... } stage ('test: functional') { ... } stage ('test: load-&-security') { ... } stage ('approval') { ... } stage ('deploy:prod') { ... } } }
-
steps
steps必须用在stage级别
steps { sh 'echo "A one line step"' sh ''' echo "A multiline step"' cd /tests/results ls -lrt ''' }
-
Environment
Enviroment必须用在pipeline或者stage级别
pipeline { agent any environment { OUTPUT_PATH = './outputs/' } stages { stage ('build') { ... } ... } }
或者
pipeline { agent any stages { stage ('build') { environment { OUTPUT_PATH = './outputs/' } ... } ... } }
-
input
input指令定义在stage级别,提供发起输入的功能。这个stage会暂停,直到用户手动输入并确认 The "input" directive is defined at a stage level and provides the functionality to prompt for an input. The stage will be paused until a user manually confirms it.
pipeline { agent any stages { stage ('build') { input{ message "Press Ok to continue" submitter "user1,user2" parameters { string(name:'username', defaultValue: 'user', description: 'Username of the user pressing Ok') } } steps { echo "User: ${username} said Ok." } } } }
-
Options
定义在pipeline级别,该指令会将某些指令为该pipeline进行分组。 可用的选项有:
- buildDiscarder
- disableConcurrentBuilds
- overrideIndexTriggers
- skipDefaultCheckout
- skipStagesAfterUnstable
- checkoutToSubdirectory
- newContainerPerStage
- timeout
- retry
- timestamps
例如,在pipeline失败之前,重新执行三次
pipeline { agent any options { retry(3) } stages { --- } }
-
Parallel
以下脚本会在在不同操作系统上,执行不同的测试。我们还可以在同一个Node上同时执行不同的stages。 但是,当我们使用并发stages,我们需要满足以下限制:
- stage指令可以含有parallel或者steps,但是不能同时两个都有。
- 在parallel内部定义的stage不能再定义parallel,只能定义steps.
- stage指令可以含有parallel指令,但不能同时在使用agent或着tools指令-
pipeline { agent none stages { stage('Run Tests') { parallel { stage('Test On Windows') { agent { label "windows" } steps { bat "run-tests.bat" } } stage('Test On Linux') { agent { label "linux" } steps { sh "run-tests.sh" } } } } } }
-
Parameters
Pamaters指令支持我们定义一组在脚本中使用的参数。Parameters应在Pipeline在触发时被提供。其应该在'pipeline'级别定义,且一个pipeline只允许一个paramters指令。 字符串和布尔变量是可用的变量类型。
pipeline {
agent any
parameters {
string(name: 'user', defaultValue: 'John', description: 'A user that triggers the pipeline')
}
stages {
stage('Trigger pipeline') {
steps {
echo "Pipeline triggered by ${params.USER}"
}
}
}
}
-
Post
Post可用在pipeline或者stage级别,当pipeline或者stage完成后,这一部分会根据条件判断是否执行。 这些条件如下:
- always: 无论成败,都会执行
- changed: 只有该次和上次执行结果不同时,才会执行
- fixed: 只有上次失败,这次成功,才会执行
- regression: 只有上次成功,这次失败,被取消或者不稳定才会执行
- aborted: 被取消时,才会执行
- failure: 失败时,才会执行
- success: 成功时,才会执行
- unstable: 不稳定,才会执行
由于在pos块中的句子总会在最后执行,所以,清理工作,通知工作等通常定义在此。
pipeline { agent any stages { stage('Some steps') { steps { ... } } } post { always { echo “Pipeline finished” bat ./performCleanUp.bat } } }
-
Script
要用在stage级别。这些语法块允许我们扩展Jenkins功能并作为共享lib分享。
pipeline { agent any stages { stage('Sample') { steps { echo "Scripted block" script { } } } } }
-
Tools
要用在pipeline或者stage级别,用来指定哪个maven, jdk或者gradle版本。
pipeline { agent any tools { maven 'apache-maven-3.0.1' } stages { ... } }
-
Triggers
Triggers允许Jenkins通过以下配置自动触发pipelines:
- cron: 定义pipeline定时触发
- pollSCM: 当定义cron时,允许Jenkins检测仓库源的更新。如果有更新,则触发pipeline
- upstream: 将一组Jenkins jobs的列表作为输入阈值,当列表中任一个任务执行结束后,该pipeline会被触发。
pipeline { agent any triggers { //Execute weekdays every four hours starting at minute 0 cron('0 */4 * * 1-5') } stages { ... } }
或者
pipeline { agent any triggers { //Query repository weekdays every four hours starting at minute 0 pollSCM('0 */4 * * 1-5') } stages { ... } }
或者
pipeline { agent any triggers { //Execute when either job1 or job2 are successful upstream(upstreamProjects: 'job1, job2', threshold: hudson.model.Result.SUCCESS) } stages { ... } }
- When
在stage级别使用。如果满足when则steps执行,如果不满足,steps则不执行。例如,pipeline允许在一个project中多个branch,即multibranched pipeline。则根据不同的branch,可执行不同的操作,如下:
pipeline { agent anagent any stages { stage ('Deploy stage') { when { branch 'master' } steps { echo 'Deploy master to stage' ... } } } }
注意事项
- 表述性pipeline如果存在语法错误,一旦触发,就会立即报错。
- Pipeline支持表述性的指令也支持脚本。表述性指令内部嵌套脚本步骤是种不错的事件。
- 在CI/CD环境中,Jenkins pipeline有广泛的应用场景
英语原文为:https://www.blazemeter.com/blog/how-to-use-the-jenkins-declarative-pipeline