Jenkins Pipeline 是一套插件,支持将持续交付流水线实现和集成到 Jenkins 中。它提供了一种可扩展的方式来将简单到复杂的交付流水线建模为代码。
一、Pipeline 基本概念
1. Pipeline 核心概念
参数 | 说明 |
---|---|
Pipeline | 用户定义的CD流水线模型,包含整个构建过程 |
Node | 执行Pipeline的机器,通常是Jenkins agent |
Stage | 逻辑分组的概念,代表Pipeline的一个阶段(如构建、测试、部署) |
tep | 单个构建步骤,告诉Jenkins在特定时间点做什么 |
2. 两种语法风格
声明式Pipeline (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'make'
}
}
}
}
特点 |
---|
更简单的语法 |
预定义结构 |
更适合简单的流水线 |
内置错误处理和超时功能 |
脚本式Pipeline (Scripted Pipeline)
node {
stage('Build') {
sh 'make'
}
}
特点 |
---|
基于Groovy的完整编程能力 |
更灵活的控制结构 |
适合复杂逻辑 |
需要更多Groovy知识 |
二、Pipeline 核心组件详解
1. agent
指定整个Pipeline或特定阶段在何处执行:
agent {
label 'my-label' // 在指定标签的节点上运行
// 或
docker 'maven:3.8.1-jdk-11' // 在Docker容器中运行
}
常见选项 | 说明 |
---|---|
any | 在任何可用agent上运行 |
none | 不分配全局agent,每个stage需自己定义 |
label | 在指定标签的节点上运行 |
docker | 在Docker容器中运行 |
2. stages
包含一系列stage指令的容器:
stages {
stage('Build') { ... }
stage('Test') { ... }
stage('Deploy') { ... }
}
3. steps
在stage块中定义的具体执行步骤:
steps {
sh 'mvn clean install' // 执行shell命令
timeout(time: 1, unit: 'HOURS') { // 设置超时
retry(3) { // 重试机制
sh './flakey-command.sh'
}
}
}
4. environment
定义环境变量:
environment {
PATH = "/opt/maven/bin:$PATH"
DB_CREDENTIALS = credentials('db-secret') // 使用Jenkins凭证
}
5. options
配置Pipeline的特定选项:
options {
timeout(time: 1, unit: 'HOURS') // 超时设置
retry(3) // 失败重试次数
disableConcurrentBuilds() // 禁止并发构建
buildDiscarder(logRotator(numToKeepStr: '10')) // 构建历史保留策略
}
6. parameters
定义参数化构建的参数:
parameters {
string(name: 'VERSION', defaultValue: '1.0.0', description: '发布版本')
choice(name: 'ENV', choices: ['dev', 'staging', 'prod'], description: '部署环境')
booleanParam(name: 'RUN_TESTS', defaultValue: true, description: '是否运行测试')
}
7. triggers
定义Pipeline的触发方式:
triggers {
cron('H */4 * * 1-5') // 定时构建
pollSCM('H */15 * * *') // 轮询SCM变更
upstream(upstreamProjects: 'job1,job2', threshold: hudson.model.Result.SUCCESS)
}
8. post
定义Pipeline或stage完成后执行的操作:
post {
always {
echo '总会执行'
}
success {
slackSend(color: 'good', message: "构建成功: ${currentBuild.fullDisplayName}")
}
failure {
mail to: 'team@example.com', subject: "构建失败: ${currentBuild.fullDisplayName}"
}
unstable {
echo '标记为不稳定时执行'
}
changed {
echo '构建状态与上次不同时执行'
}
}