Jenkins Pipeline¶
一句话概述:Jenkins 是最老牌的 CI/CD 工具,Pipeline 用 Groovy 脚本定义构建流程,插件生态极其丰富(1800+ 插件),适合复杂企业级场景。
核心知识点¶
| 概念 | 白话解释 |
|---|---|
| Declarative Pipeline | 声明式流水线 = 用固定格式写,简单易懂(推荐) |
| Scripted Pipeline | 脚本式流水线 = 用 Groovy 代码写,更灵活但更复杂 |
| Jenkinsfile | 定义流水线的文件,放在项目根目录 |
| Stage | 阶段 = 流水线中的大步骤(如 Build、Test) |
| Step | 步骤 = 阶段里的具体操作 |
| Agent | 代理 = 在哪台机器上执行流水线 |
| Node | 节点 = Jenkins 可以调度的一台机器 |
| Plugin | 插件 = 扩展 Jenkins 功能的组件 |
| Blue Ocean | Jenkins 的现代化 UI 界面 |
| Shared Library | 共享库 = 多个项目复用的流水线代码 |
安装配置¶
# === Docker 方式安装(推荐) ===
docker run -d \
--name jenkins \ # 容器名
-p 8080:8080 \ # Web 界面端口
-p 50000:50000 \ # Agent 通信端口
-v jenkins_home:/var/jenkins_home \ # 数据持久化
jenkins/jenkins:lts-jdk17 # 使用 LTS 版本 + JDK17
# === Ubuntu 直接安装 ===
# 添加 Jenkins 仓库密钥
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \
/usr/share/keyrings/jenkins-keyring.asc > /dev/null # 导入 GPG 密钥
# 添加 apt 仓库
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian-stable binary/" | sudo tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null # 添加源
sudo apt update && sudo apt install jenkins # 安装 Jenkins
sudo systemctl start jenkins # 启动 Jenkins
sudo systemctl enable jenkins # 设置开机自启
# 获取初始管理员密码
sudo cat /var/lib/jenkins/secrets/initialAdminPassword # 复制这个密码去浏览器输入
基本使用¶
1. 声明式 Pipeline(推荐)¶
// Jenkinsfile(放在项目根目录)
pipeline {
agent any // 在任意可用节点运行
environment { // 环境变量
APP_NAME = 'my-app' // 应用名
DEPLOY_ENV = 'production' // 部署环境
}
stages {
stage('Checkout') { // 阶段1:拉取代码
steps {
checkout scm // 从 SCM(Git)拉取代码
}
}
stage('Build') { // 阶段2:构建
steps {
sh 'pip install -r requirements.txt' // 安装依赖
sh 'python setup.py build' // 构建
}
}
stage('Test') { // 阶段3:测试
steps {
sh 'pytest --junitxml=report.xml' // 运行测试并输出 JUnit 格式报告
}
post {
always { // 无论成功失败都执行
junit 'report.xml' // 发布测试报告
}
}
}
stage('Deploy') { // 阶段4:部署
when {
branch 'main' // 只在 main 分支执行
}
steps {
sh './deploy.sh' // 执行部署脚本
}
}
}
post { // 流水线结束后
success {
echo 'Pipeline succeeded!' // 成功时打印
}
failure {
echo 'Pipeline failed!' // 失败时打印
}
}
}
2. 带参数的 Pipeline¶
pipeline {
agent any
parameters { // 定义参数(在 Jenkins UI 中可以填写)
string(name: 'BRANCH', defaultValue: 'main', description: '要构建的分支')
choice(name: 'ENV', choices: ['dev', 'staging', 'prod'], description: '部署环境')
booleanParam(name: 'SKIP_TEST', defaultValue: false, description: '是否跳过测试')
}
stages {
stage('Build') {
steps {
echo "Building branch: ${params.BRANCH}" // 使用参数
}
}
stage('Test') {
when {
expression { !params.SKIP_TEST } // 条件:没选跳过测试才执行
}
steps {
sh 'pytest'
}
}
stage('Deploy') {
steps {
echo "Deploying to ${params.ENV}" // 部署到选定环境
}
}
}
}
3. 并行执行¶
pipeline {
agent any
stages {
stage('Parallel Tests') { // 并行测试
parallel { // parallel 块内的阶段并行执行
stage('Unit Tests') {
steps {
sh 'pytest tests/unit/' // 单元测试
}
}
stage('Integration Tests') {
steps {
sh 'pytest tests/integration/' // 集成测试
}
}
stage('Lint') {
steps {
sh 'ruff check .' // 代码检查
}
}
}
}
}
}
高级用法¶
1. Docker 作为构建环境¶
pipeline {
agent {
docker {
image 'python:3.12-slim' // 在 Docker 容器中运行
args '-v /tmp:/tmp' // 挂载卷
}
}
stages {
stage('Test') {
steps {
sh 'python --version' // 容器内执行
sh 'pip install pytest && pytest'
}
}
}
}
2. 凭据管理¶
pipeline {
agent any
stages {
stage('Deploy') {
steps {
withCredentials([ // 从 Jenkins 凭据库读取
usernamePassword(
credentialsId: 'docker-hub', // 凭据 ID
usernameVariable: 'DOCKER_USER', // 用户名存入变量
passwordVariable: 'DOCKER_PASS' // 密码存入变量
)
]) {
sh 'docker login -u $DOCKER_USER -p $DOCKER_PASS' // 使用凭据
sh 'docker push myapp:latest'
}
}
}
}
}
3. 共享库¶
// vars/buildPython.groovy(共享库中的自定义步骤)
def call(String version = '3.12') { // 定义可调用的函数
pipeline {
agent { docker { image "python:${version}" } }
stages {
stage('Install') {
steps { sh 'pip install -r requirements.txt' }
}
stage('Test') {
steps { sh 'pytest' }
}
}
}
}
// Jenkinsfile 中使用
@Library('my-shared-lib') _ // 加载共享库
buildPython('3.12') // 调用共享库中的步骤
常见报错¶
| 报错信息 | 原因 | 解决方法 |
|---|---|---|
No agent available | 没有可用的 Agent | 检查节点是否在线、标签是否匹配 |
java.lang.OutOfMemoryError | Jenkins 内存不足 | 增加 JVM 堆内存 -Xmx2g |
Permission denied | 文件权限不足 | chmod +x 或检查 Jenkins 用户权限 |
Script not permitted | Groovy 沙箱限制 | 在"脚本审批"中批准方法调用 |
ERROR: Couldn't find any revision to build | Git 配置错误 | 检查仓库 URL 和凭据 |
RejectedAccessException | 方法未被批准 | 管理 → In-process Script Approval 批准 |
速查表¶
// === Pipeline 结构 ===
pipeline { agent any; stages { stage('X') { steps { sh 'cmd' } } } }
// === Agent 类型 ===
agent any // 任意节点
agent none // 不分配(每个 stage 自己指定)
agent { label 'linux' } // 指定标签的节点
agent { docker { image 'python:3.12' } } // Docker 容器
// === 条件执行 ===
when { branch 'main' } // 指定分支
when { tag pattern: "v\\d+.*" } // Tag 匹配模式
when { expression { return env.BUILD == 'true' } } // 表达式
when { changeset "src/**" } // 文件变更
// === 后处理 ===
post {
always { ... } // 总是执行
success { ... } // 成功时
failure { ... } // 失败时
changed { ... } // 状态变化时(如从失败变成功)
cleanup { ... } // 最后清理
}
// === 常用步骤 ===
sh 'command' // 执行 Shell 命令
bat 'command' // 执行 Windows 命令
echo 'message' // 打印信息
checkout scm // 拉取代码
junit 'report.xml' // 发布测试报告
archiveArtifacts 'dist/**' // 归档产物
input message: '继续?' // 人工审批
timeout(time: 30, unit: 'MINUTES') { ... } // 超时控制
retry(3) { ... } // 失败重试
参考:Jenkins Pipeline 文档 | 更新于 2026 年