Jenkins 流水线(Pipeline)是 Jenkins 中用于实现持续集成/持续部署(CI/CD) 的核心工具,通过代码化的方式定义构建、测试、部署的全流程,支持可扩展、可版本控制的流水线配置。Jenkins 流水线主要有两种语法风格:声明式流水线(Declarative Pipeline) 和脚本式流水线(Scripted Pipeline),其中声明式是官方推荐的主流方式,语法更简洁、结构化更强。
一、核心概念
Pipeline:整个流水线的定义,由一系列阶段(Stage)组成。Stage:流水线的逻辑阶段,如「拉取代码」「编译构建」「单元测试」「部署」等,每个 Stage 包含具体的步骤(Step)。Step:流水线的最小执行单元,是 Jenkins 提供的核心操作(如 执行shell命令、
sh 拉取代码、
git 操作等)。Agent:指定流水线执行的节点(Jenkins 从节点/主节点),支持容器化执行(如 Docker)。Post:流水线执行完成后的后续操作(如成功通知、失败清理、生成报告)。Jenkinsfile:存储流水线代码的文件,通常提交到代码仓库(如 Git),实现「流水线即代码(PiC)」。
docker
二、声明式流水线(Declarative Pipeline)
声明式流水线是 Jenkins 2.5 及以上版本推出的新语法,采用结构化的 DSL(领域特定语言),强制固定的代码结构,易于阅读和维护,是绝大多数场景的首选。
1. 基本结构
声明式流水线的核心是 块,所有逻辑都包裹在其中,基本骨架如下:
pipeline
pipeline {
agent any // 指定执行节点(any 表示任意可用节点)
parameters { // 可选:流水线参数(如分支、部署环境)
string(name: 'BRANCH', defaultValue: 'main', description: '代码分支')
choice(name: 'ENV', choices: ['test', 'prod'], description: '部署环境')
}
environment { // 可选:全局环境变量
JAVA_HOME = '/usr/lib/jvm/java-17-openjdk'
PROJECT_NAME = 'my-springboot-app'
}
triggers { // 可选:流水线触发方式(如定时、代码提交)
cron('H 2 * * *') // 每天凌晨2点执行
pollSCM('H/15 * * * *') // 每15分钟轮询代码仓库
}
stages { // 流水线的核心阶段定义
stage('拉取代码') {
steps { // 该阶段的具体执行步骤
echo '开始拉取代码...'
git url: 'https://github.com/your-name/your-project.git', branch: params.BRANCH
}
}
stage('编译构建') {
steps {
echo '开始编译构建...'
sh 'mvn clean package -DskipTests' // 执行Maven构建(需节点安装Maven)
}
post { // 该阶段执行后的操作(可选)
success { echo '编译构建成功!' }
failure { echo '编译构建失败!' }
}
}
stage('单元测试') {
steps {
echo '执行单元测试...'
sh 'mvn test'
}
}
stage('部署到目标环境') {
when { // 条件判断:仅当选择prod环境时执行该阶段
expression { params.ENV == 'prod' }
}
steps {
echo "部署到${params.ENV}环境..."
// 此处可添加部署脚本(如SSH发布、K8s部署、Docker启动等)
sh './deploy.sh ${ENV}'
}
}
}
post { // 全局后置操作(流水线结束后执行)
always { echo '流水线执行完成,无论成功/失败' }
success { emailext to: 'dev@example.com', subject: '流水线执行成功' }
failure { emailext to: 'dev@example.com', subject: '流水线执行失败' }
unstable { echo '流水线状态为不稳定(如测试用例部分失败)' }
}
}
2. 关键语法详解
(1)Agent(执行节点)
用于指定流水线在哪个节点执行,支持多种配置方式:
:在任意可用节点执行。
agent any:不指定全局节点,需为每个 Stage 单独指定
agent none。
agent:在标签为
agent label 'node-01' 的从节点执行。
node-01:使用指定的 Docker 镜像作为执行环境(需 Jenkins 配置 Docker 插件)。
agent docker 'maven:3.8.5-openjdk-17'
agent {
docker {
image 'maven:3.8.5-openjdk-17'
args '-v /root/.m2:/root/.m2' // 挂载本地Maven仓库,避免重复下载依赖
}
}
(2)Parameters(流水线参数)
支持动态传入参数,常用参数类型:
:字符串参数(如分支名)。
string:下拉选择框(如部署环境)。
choice:布尔值参数(如是否执行测试)。
booleanParam:文件上传参数(如配置文件)。
file
(3)Environment(环境变量)
定义流水线的全局/阶段级环境变量,支持三种方式:
直接赋值:。从 Jenkins 凭据中读取(推荐,避免硬编码敏感信息):
KEY = 'VALUE'
environment {
DB_PASSWORD = credentials('jenkins-db-pwd-id') // 引用Jenkins中配置的凭据ID
}
动态生成:。
ENV_NAME = sh(script: 'echo $PATH', returnStdout: true).trim()
(4)When(条件判断)
用于控制 Stage 是否执行,支持多种条件:
:基于 Groovy 表达式判断(如
expression)。
params.ENV == 'prod':基于代码分支判断(如
branch)。
branch 'main':是否构建标签(如
buildingTag)。
buildingTag true:上一次构建是否有代码变更。
changed
(5)Post(后置操作)
定义流水线/Stage 执行后的操作,支持的条件:
:无论结果如何都执行。
always:执行成功时执行。
success:执行失败时执行。
failure:流水线状态为不稳定时执行(如测试用例失败)。
unstable:流水线被手动终止时执行。
aborted
(6)Triggers(触发方式)
配置流水线的自动触发规则:
:基于 cron 表达式定时触发(如
cron,
H 2 * * * 表示随机分钟,避免并发)。
H:轮询代码仓库,有变更时触发。
pollSCM:上游流水线执行完成后触发(如
upstream)。
upstream(upstreamProjects: 'projectA', threshold: hudson.model.Result.SUCCESS)
三、脚本式流水线(Scripted Pipeline)
脚本式流水线是 Jenkins 早期的流水线语法,基于Groovy 脚本的自由式编程风格,灵活性更高,但结构松散,维护成本较高,适合复杂的自定义逻辑场景。
1. 基本结构
脚本式流水线无需固定的 块,直接通过
pipeline 指定执行节点,然后定义 Stage 和 Step:
node
// 脚本式流水线示例
node('node-01') { // 指定在标签为node-01的节点执行
// 定义环境变量
def BRANCH = params.BRANCH ?: 'main'
def ENV = params.ENV ?: 'test'
// 拉取代码阶段
stage('拉取代码') {
echo '开始拉取代码...'
git url: 'https://github.com/your-name/your-project.git', branch: BRANCH
}
// 编译构建阶段
stage('编译构建') {
try {
echo '开始编译构建...'
sh 'mvn clean package -DskipTests'
echo '编译构建成功!'
} catch (e) {
echo "编译构建失败:${e.getMessage()}"
throw e // 抛出异常,终止流水线
}
}
// 部署阶段(条件判断)
stage('部署到目标环境') {
if (ENV == 'prod') {
echo "部署到${ENV}环境..."
sh './deploy.sh ${ENV}'
} else {
echo "跳过生产环境部署,当前环境:${ENV}"
}
}
// 后置操作
echo '流水线执行完成'
}
2. 核心特点
完全基于 Groovy 语法,支持循环、条件、异常捕获、函数定义等高级特性。无固定结构约束,灵活性强,但需要开发者具备 Groovy 编程能力。不支持声明式的
post 等简化语法,需通过 Groovy 代码实现对应逻辑。
triggers
四、Jenkinsfile 的使用方式
仓库托管:将 提交到代码仓库的根目录,Jenkins 从仓库中拉取并执行(推荐,实现流水线版本控制)。直接配置:在 Jenkins 流水线项目中,直接在网页端输入流水线代码(适用于临时测试,不推荐生产环境)。
Jenkinsfile
五、常用 Step 步骤
Jenkins 提供了丰富的内置 Step,以下是高频使用的操作:
代码拉取:。Shell 执行:
git url: '仓库地址', branch: '分支名'(Linux/Mac),
sh '命令'(Windows)。凭据管理:
bat '命令'(读取 Jenkins 凭据)。工件归档:
credentials('凭据ID')(保存构建产物)。测试报告:
archiveArtifacts artifacts: 'target/*.jar', fingerprint: true(解析 JUnit 测试报告)。Docker 操作:
junit 'target/surefire-reports/*.xml'、
docker.build('image-name:tag')(需 Docker 插件)。邮件通知:
docker.image('image-name:tag').push()(需 Email Extension 插件)。延迟执行:
emailext。
sleep time: 30, unit: 'SECONDS'
六、插件依赖
使用流水线的高级功能需要安装对应的 Jenkins 插件,核心插件:
Pipeline:流水线核心插件(默认已安装)。Pipeline Nodes and Processes:节点和进程管理。Pipeline Utility Steps:提供额外的流水线步骤(如读取文件、解析JSON)。Docker Pipeline:支持 Docker 容器化执行。Email Extension:增强邮件通知功能。Git Plugin:Git 代码仓库集成。
七、最佳实践
流水线即代码:将 提交到代码仓库,与项目代码一起版本控制。避免硬编码:使用 Jenkins 凭据存储敏感信息(如密码、密钥),通过
Jenkinsfile 引用。容器化执行:使用 Docker 作为 Agent,保证构建环境的一致性(避免「在我电脑上能跑」问题)。分阶段拆分:将流水线拆分为细粒度的 Stage,便于定位问题(如拉取代码、编译、测试、部署分离)。添加通知:在 Post 中配置邮件、钉钉/企业微信通知,及时反馈流水线状态。复用逻辑:通过 Groovy 函数或 Jenkins 共享库(Shared Libraries)复用通用流水线逻辑(如多项目的构建、部署步骤)。
credentials
以上是 Jenkins 流水线的核心语法和使用方式,声明式流水线满足绝大多数 CI/CD 场景,脚本式流水线则适用于需要高度自定义的复杂逻辑。实际使用中可结合 Jenkins 插件生态,扩展流水线的功能(如 Kubernetes 部署、SonarQube 代码质量检测等)。



