上一篇文章 “DevOps 生态介绍(六):超详细!Jenkins Pipeline 实战教程,构建你的第一个 CI 项目”直接贴了两个实际在用的Jenkinsfile 文件案例,今天这边文章会根据实际案例进行语法详解
Jenkins pipeline 介绍
Pipeline是一个组件,可以集成在Jenkins 中实现持续集成和持续交付的流水线。
定义管道:
声明式管道、脚本式管道。我这边用到的是声明式管道,有些项目需求特殊可以将两种方式联合使用
创建pipeline的三种方法:
1: 通过经典的用户界面,可以直接在Jenkins中输入基本流水线。

2:在SCM中,使用Jenkinsfile 手动编写代码,将Jenkinsfile文件上传到项目的根目录下,跟pxm.xml文件在同一目录下

3:通过Blue Ocean,Blue Ocean UI可以帮忙编写jenkinsfile。
Pipeline语法介绍
以下介绍的语法来自于官方文档。
官网地址:https://www.jenkins.io/doc/book/pipeline/syntax/
声明式管道
所有有效的声明式都必须包含在一个pipeline代码库中
备注:在Jenkinsfile文件中,所有代码的首行缩进都是用空格来标识,不支持tab键
pipeline {
}
agent:指定整个流水线或特点阶段将在Jenkins环境中的哪个位置执行,取决于agent部分的位置,大部分情况下agent 在顶层pipeline{}定义,或者也可以在stage模块中。
agent 支持的参数:any 、none、label、node、docker、dockerfile、kubernetes
pipeline {
agent any
stages {
stage {
''''''
}
}
}
or
pipeline {
agent none
stages {
stage {
agent any
}
}
}
#agent 参数样例,此样例摘自官方文档
agent any
agent none
agent {label 'node1'}
agent {node {label 'node1'}}agent {
docker {
image 'maven:3.9.3-eclipse-temurin-17'
label 'my-defined-label'
args '-v /tmp:/tmp'
}
}
agent {
// Equivalent to "docker build -f Dockerfile.build –build-arg version=1.0.2 ./build/
dockerfile {
filename 'Dockerfile.build'
dir 'build'
label 'my-defined-label'
additionalBuildArgs '–build-arg version=1.0.2'
args '-v /tmp:/tmp'
}
}
agent {
kubernetes {
defaultContainer 'kaniko'
yaml '''
kind: Pod
spec:
containers:
– name: kaniko
image: gcr.io/kaniko-project/executor:debug
imagePullPolicy: Always
command:
– sleep
args:
– 99d
volumeMounts:
– name: aws-secret
mountPath: /root/.aws/
– name: docker-registry-config
mountPath: /kaniko/.docker
volumes:
– name: aws-secret
secret:
secretName: aws-secret
– name: docker-registry-config
configMap:
name: docker-registry-config
'''
}
stages:此部分包含一个或多个阶段指令,建议至少包含针对持续交付流程每个独立部分(例如构建、测试和部署)的stages至少一个阶段指令。
stage:执行steps的一个或多个任务步骤
pipeline {
agent any
stages {
stage('Example1') {
steps {
echo 'Hello World'
}
}
stage('Example2') {
steps {
echo 'Hello World'
}
}
stage('Example3') {
steps {
echo 'Hello World'
}
}
}
}
environment:环境,指定一系列键值对。这些键值对将被定义为所有步骤或特定阶段步骤的环境变量
pipeline {
agent any
stages {
stage('Example Username/Password') {
environment {
SERVICE_CREDS = credentials('my-predefined-username-password')
}
steps {
sh 'echo "Service user is $SERVICE_CREDS_USR"'
sh 'echo "Service password is $SERVICE_CREDS_PSW"'
sh 'curl -u $SERVICE_CREDS https://myservice.example.com'
}
}
stage('Example SSH Username with private key') {
environment {
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提供很多特有的选项
#options 可用的选项
#构建丢弃器,保存最近特定次数的pipeline运行的产物和控制台输入
options { buildDiscarder(logRotator(numToKeepStr: '1')) }
#在工作区的子目录中执行自动源代码控制检出
options { checkoutToSubdirectory('foo') }
#禁止并发构建
options { disableConcurrentBuilds() }
#禁用恢复,如果控制器启动,则不允许管道恢复运行
options { disableResume() }
#保留最近五次已完成构建的存档
options { preserveStashes(buildCount: 5) }
#静默期,以秒为单位
options { quietPeriod(30) }
#重试
options { retry(3) }
#指令会跳过从源代码控制系统检出代码的操作agent
options { skipDefaultCheckout() }
#当构建状态变为“不稳定”时,跳过后续阶段
options { skipStagesAfterUnstable() }
#为流水线运行设置超时时间,超过超时时间后,Jenkins 应中止流水线运行
options { timeout(time: 1, unit: 'HOURS') }
#时间戳
options { timestamps() }
#将流水线中所有后续并行阶段的 failfast 设置为 true
options { parallelsAlwaysFailFast() }
#完全禁用经典 Jenkins UI 和 Blue Ocean 中显示的“从阶段重启”选项
options { disableRestartFromStage() }
parameters:该parameters指令提供了一系列用户在触发管道时应提供的参数。这些用户指定的参数值通过对象提供给管道步骤
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}"
}
}
}
}
triggers:触发器,定义了pipeline自动重新触发的方式。类似于Linxu系统的crontab定时任务
// Declarative //
pipeline {
agent any
triggers {
cron('H */4 * * 1-5')
}
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}
tool:工具,指定自动安装并部署到系统上的工具path。
tools {
maven 'Maven'
nodejs 'NodeJS'
}
input:输入,指令允许您使用input步骤stage提示输入。在应用任何步骤后,程序将暂停,然后再进入该input步骤对应stage的代码块或评估条件。如果步骤获得批准,程序将继续执行。作为提交的一部分提供的任何参数都将在环境中供后续步骤使用
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:什么时候
pipeline {
agent any
stages {
stage('Example Build') {
steps {
echo 'Hello World'
}
}
stage('Example Deploy') {
when {
branch 'production'
}
steps {
echo 'Deploying'
}
}
}
}
案例语法详细介绍
pipeline {
#定义了agent 为any
agent any
#定义了使用的maven工具,后面的'Maven'名字不是随意乱写的, 要跟jenkins-系统管理-全局工具配置-Maven 安装这的name一样即可
tools {
maven 'Maven'
}
parameters {
#参数话构建,选择分支
gitParameter(
name: 'BRANCH',
type: 'PT_BRANCH',
defaultValue: 'master',
branchFilter: 'origin/(.*)',
sortMode: 'DESCENDING_SMART',
selectedValue: 'DEFAULT',
description: '请选择要构建的分支'
)
##参数话构建,布尔值判断是否跳过单元测试
booleanParam(
name: 'SKIP_TEST',
defaultValue: true,
description: '是否跳过单元测试'
)
#参数话构建,选择jdk版本
choice(
name: 'JDK_VERSION',
choices: ['JDK17','JDK21'],
description: '请选择JDK版本'
)
}
#定义了jkd 环境变量的路径
environment {
JAVA_HOME = tool "${params.JDK_VERSION}"
PATH = "${env.JAVA_HOME}/bin:${env.PATH}"
}
#一个stages包含好几个stage
stages {
#这里是选择分支克隆业务源代码任务
stage('checkout_get_code') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: "*/${params.BRANCH}"]],
userRemoteConfigs: [[
credentialsId: 'f245a11f-afe0-4ca4-aa2d-1e574724677d',
url: 'https://codeup.aliyun.com/60b83b0db8301d20d58b8017/test.git'
]]
])
}
}
#构建jar包
stage('Build_jar') {
steps {
sh """
echo "build jar"
java -version
echo $JAVA_HOME
mvn clean package \\
-DskipTests=${params.SKIP_TEST}
"""
}
}
#将target的jar包打成tar.gz包
stage('tar_package') {
steps {
sh """
echo "tar package 开始…"
cd target
tar -zcvf test.tar.gz \\
ms-pats-mq-util-1.2.0-SNAPSHOT.jar
"""
}
}
#将打的tar.gz包上传到业务服务器解压并启动jar
stage('CD') {
steps {
sshPublisher(
publishers: [
sshPublisherDesc(
configName: '192.168.1.170',
transfers: [
sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: '''
#!/bin/bash
source /etc/profile
cd /data/app/mq_util
./server.sh stop
tar zxvf test.tar.gz
sleep 2
rm -rf test.tar.gz
BUILD_ID=dontKillMe
./server.sh start
sleep 2
''',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '/data/app/mq_util',
remoteDirectorySDF: false,
removePrefix: 'target/',
sourceFiles: 'target/test.tar.gz'
)
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false
)
]
)
}
}
#集成jacoco,生成单元测试覆盖率
stage('jacoco') {
steps {
jacoco()
}
}
}
}
Pipeline 代码生成工具
声明式指令生成器:http://192.168.1.182:8080/directive-generator
第一次接触jenkins pipeline时,难免你不会很熟悉的写成Jenkinsfile文件的代码,这里Jenkins 自带声明式指令生成器

片段生成器:
已git clone 源代码为例,输入git 仓库地址,分支,凭据信息后,点击“生成流水线脚本”按钮即可。将生成的代码指令复制到Jenkinsfile中就行

Declarative Directive Genertator:
以stages:stage为例

Blue Ocean 介绍
Blue Ocean 访问地址:http://192.168.1.182:8080/blue
需要安装组件“Blue Ocean”
在这个界面也可以到流水线的步骤信息

下一批文章将介绍
“DevOps 生态介绍(八):docker &dockerfile 命令介绍及构建项目的第一个镜像”




