pipeline {
agent any
stages {
stage('Example Username/Password') {
environment {
// 提前创建好Username and Password类型的凭据
SERVICE_CREDS = credentials('my-predefined-username-password')
steps {
sh 'echo "Service user is $SERVICE_CREDS_USR"'
sh 'echo "Service password is $SERVICE_CREDS_PSW"'
stage('Example SSH Username with private key') {
environment {
// 提前创建好SSH Username with private key类型的凭据
SSH_CREDS = credentials('my-predefined-ssh-creds')
steps {
sh 'echo "SSH private key is located at $SSH_CREDS"'
sh 'echo "SSH user is $SSH_CREDS_USR"'
sh 'echo "SSH passphrase is $SSH_CREDS_PSW"'
options:此指令允许从Pipeline本身中配置一些特定的选项。Pipeline提供了许多这样的选项,例如buildDiscarder,也可以由插件提供,例如timestamps。分享一些参数:
buildDiscarder:保持构建的最大个数,示例:options { buildDiscarder(logRotator(numToKeepStr: '1')) }
checkoutToSubdirectory:在workspace的子目录中执行源代码自动管理切换,示例:options { checkoutToSubdirectory('foo') }
disableConcurrentBuilds:不允许同时执行管道。可用于防止同时访问共享资源等,示例:options { disableConcurrentBuilds() }
disableResume:如果控制器重新启动,则不允许恢复pipeline,示例: options { disableResume() }
newContainerPerStage:使用docker或dockerfile agent时。每个stage将在同一节点上的新容器实例中运行,而不是在同一容器实例中运行的所有stages。
overrideIndexTriggers:
retry:失败时,按指定次数重试整个管道,可以针对Pipeline或者Stage,示例: options { retry(3) }
skipStagesAfterUnstable:一旦构建状态变得不稳定,就跳过各个stages。示例: options { skipStagesAfterUnstable() }
timeout:设置管道运行的超时时间,此参数可以针对Pipeline或者Stage,例如:options { timeout(time: 1, unit: 'HOURS') }
timestamps: 所有控制台输出前加上线路发出的时间,此参数可以针对Pipeline或者Stage,示例:options { timestamps() }
pipeline {
agent any
options {
timeout(time: 1, unit: 'HOURS')
timestamps()
buildDiscarder(logRotator(numToKeepStr: '10'))
stages {
stage('Example') {
options {
timeout(time: 1200, unit: 'SECONDS')
steps {
echo 'Hello World'
parameters:为Pipeline运行前提供参数,有几种参数类型供选择:
string:字符串类型,示例:parameters { string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '') }
text:文本类型,可以包含多行,示例: parameters { text(name: 'DEPLOY_TEXT', defaultValue: 'One\nTwo\nThree\n', description: '') }
booleanParam:布尔类型,示例: parameters { booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '') }
choice:选择类型,多个选项任选其一,示例: parameters { choice(name: 'CHOICES', choices: ['one', 'two', 'three'], description: '') }
password:密码类型,可以提前设置密码,示例: parameters { password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'A secret password') }
pipeline {
agent any
parameters {
string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
text(name: 'BIOGRAPHY', defaultValue: '', description: 'Enter some information about the person')
booleanParam(name: 'TOGGLE', defaultValue: true, description: 'Toggle this value')
choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')
password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'Enter a password')
stages {
stage('Example') {
steps {
echo "Hello ${params.PERSON}"
echo "Biography: ${params.BIOGRAPHY}"
echo "Toggle: ${params.TOGGLE}"
echo "Choice: ${params.CHOICE}"
echo "Password: ${params.PASSWORD}"
使用parameters参数有一个bug,首次构建时不会让你选择参数,第二次才可以选择。
triggers:触发器,定义了Pipeline自动化触发的方式,可触发的方式有:
cron:计划任务定期触发,示例: triggers { cron('H */4 * * 1-5') }
pollSCM:与cron方式类似,但是必须发现有源码的变化,才会触发,示例: triggers { pollSCM('H */4 * * 1-5') }
pollSCM触发器仅在Jenkins 2.22或更高版本中可用。
upstream:接受以逗号分隔的作业字符串和阈值。当字符串中的任何作业以最小阈值结束时,将会触发,示例:triggers { upstream(upstreamProjects: 'job1,job2', threshold: hudson.model.Result.SUCCESS) }
pipeline {
agent any
triggers {
cron('H */4 * * 1-5')
stages {
stage('Example') {
steps {
echo 'Hello World'
Jenkins cron syntax
Jenkins cron语法遵循cron公共的语法(略有不同),每行由5个字段组成,由制表符或空格分隔。
为了允许定期调度的任务在系统上产生均匀负载,应尽可能使用符号H(表示“哈希”),使其执行pipeline的时间分散,更好的利用资源。
此外,支持使用 @yearly
, @annually
, @monthly
, @weekly
, @daily
, @midnight
, and @hourly
作为别名,他们都等同于使用哈希自动的进行均衡,例如@hourly
与H * * * *
相同,表示1小时内任意时间执行即可。
举一些cron例子:
每15分钟执行一次,可以是 at :07, :22, :37, :52:triggers{ cron('H/15 * * * *') }
在每小时的前30分钟,每10分钟执行一次:triggers{ cron('H(0-29)/10 * * * *') }
每周的周一到周五的,9点-16点之间的第45分钟每两个小时执行一次:triggers{ cron('45 9-16/2 * * 1-5') }
1-11月的每个1号和15号都要随机执行一次:triggers{ cron('H H 1,15 1-11 *') }
tools:工具,目前仅支持三种工具:maven、jdk和gradle。工具的名称必须在系统设置—>全局工具配置中定义。定义好后即可开始调用:
pipeline {
agent any
tools {
maven 'apache-maven-3.0.1'
stages {
stage('Example') {
steps {
sh 'mvn --version'
第一次运行此工具时,如果没有会去下载,或者会根据你指定的获取方式去获取,比如直接从其他机器打包过来解压等方式。
input:stage 的 input 指令允许你使用 input step提示输入。 在应用了 options 后,进入 stage 的 agent 或评估 when 条件前, stage 将暂停。 如果 input 被批准, stage 将会继续。 作为 input 提交的任何参数都将在环境中用于其他 stage 使用。可选配置:
message:必需的。 呈现给用户的信息。
id:可选的, 默认为 stage 名称。
ok:可选的,表单中 ok 按钮的描述文本。
submitter:可选的,以逗号分割的用户列表,只有列表用户才可以提交input内容。
parameters:可选参数列表,与前文介绍的相同。
pipeline {
agent any
stages {
stage('Example') {
input {
message "Should we continue?"
ok "Yes, we should."
submitter "alice,bob"
parameters {
string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
steps {
echo "Hello, ${PERSON}, nice to meet you."
when:逻辑判断,可以给定条件决定要不要执行此stage,when指令必须包含至少一个条件,如果when包含多个条件,则必须所有的条件都返回true,stage才会运行。内置条件有:
brance:分支匹配,当正在构建的分支与预设给定的分支匹配时,执行此stage,例如: when { branch 'master' }
,此参数仅适用于多分支流水线。
environment:当指定的环境变量是给定的值时,执行此stage,例如:when { environment name: 'DEPLOY_TO', value: 'production' }
expression:当指定的Groovy表达式评估为true时,执行此stage,例如: when { expression { return params.DEBUG_BUILD } }
not:当嵌套条件是错误时,执行这个stage,必须包含一个条件,例如: when { not { branch 'master' } }
allOf:当所有的嵌套条件都正确时(当when中有多个条件时,默认就是此策略),执行这个此stage,必须包含至少一个条件,例如: when { allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' } }
anyOf:当至少有一个嵌套条件为真时,执行这个阶段,必须包含至少一个条件,例如: when { anyOf { branch 'master'; branch 'staging' } }
beforeAgent:默认为false,默认情况下,如果在stage中包含agent,则会在执行when之前会先执行agent,如果将beforeAgent设置为true,则表示先执行when条件,when条件判断为执行stage后,才执行agent。
pipeline {
agent any
parameters {
choice(name: 'BRANCH_NAME', choices: ['production', 'staging'], description: 'Pick something')
string defaultValue: 'production', name: 'DEPLOY_TO', trim: true
stages {
stage('Example Build') {
when {
expression { BRANCH_NAME ==~ /(production|staging)/ }
steps {
echo "Start building ${BRANCH_NAME}"
stage('Example Deploy') {
when {
anyOf {
environment name: 'DEPLOY_TO', value: 'production'
environment name: 'DEPLOY_TO', value: 'staging'
steps {
echo 'Deploying'
Parallel:并行,声明式流水线的stage
可以在他们内部声明多个嵌套stage
, 它们将并行执行。注意,一个stage必须只有一个 steps
或 parallel
,嵌套的stage本身不能再进入 parallel
阶段,任何包含parallel
的stage
不能包含agent
或tools
,因为它们没有相关的step
。
另外,可以添加 failFast true
到包含 parallel
的 stage
中,表示当其中一个进程失败时,所有的 parallel
阶段都将被终止。
pipeline {
agent any
options {
parallelsAlwaysFailFast() //表示后续所有的parallel阶段中都设置为failFast true
timestamps()
stages {
stage('Build Stage') {
steps {
echo 'This stage is Build.'
stage('Parallel Stage --> Deploy') {
when {
branch 'prod'
parallel {
stage('Branch dev') {
agent {
label "dev"
steps {
echo "On Branch dev deploy"
stage('Branch int') {
agent {
label "int"
steps {
echo "On Branch int deploy"
stage('Branch test') {
agent {
label "test"
stages {
stage('Nested 1') {
steps {
echo "In stage Nested 1 within Branch test"
stage('Nested 2') {
steps {
echo "In stage Nested 2 within Branch test"
此示例中:只要当branch不是prod时,则将同时在dev/int/test三个环境中deploy,test环境的deploy又分为两个stage,此两个stage并不是并行执行,而是串行执行。
script:脚本式语法,可以在声明式流水线中使用,包含在step里,调用script { }块,示例如下:
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
script {
def browsers = ['chrome', 'firefox']
for (int i = 0; i < browsers.size(); ++i) {
echo "Testing the ${browsers[i]} browser"
脚本式语法
脚本式pipeline也是建立在底层流水线上的,与声明式不同的是, 脚本化流水线实际上是由 Groovy构建的通用 DSL, Groovy 语言提供的大部分功能都可以用于脚本化流水线。
脚本化流水线从 Jenkinsfile
的顶部开始向下串行执行, 就像 Groovy 或其他语言中的大多数传统脚本一样。 因此,提供流控制取决于 Groovy 表达式, 比如 if/else
条件, 例如:
node {
stage('Example') {
if (env.BRANCH_NAME == 'master') {
echo 'I only execute on the master branch'
} else {
echo 'I execute elsewhere'
另一种方法是使用Groovy的异常处理支持来管理脚本化流水线流控制。当 步骤 失败 ,无论什么原因,它们都会抛出一个异常。处理错误的行为必须使用Groovy中的 try/catch/finally
块 , 例如:
node {
stage('Example') {
try {
sh 'exit 1'
catch (exc) {
echo 'Something failed, I should sound the klaxons!'
throw