文章目录
- 概述
-
- [一、核心架构:Controller-Agent 模式深度解析](#一、核心架构:Controller-Agent 模式深度解析)
-
- [1. 核心概念](#1. 核心概念)
- [2. Jenkins 架构与工作流程(流程图)](#2. Jenkins 架构与工作流程(流程图))
- [二、CI/CD 工作流程:从代码提交到生产部署](#二、CI/CD 工作流程:从代码提交到生产部署)
-
- [CI/CD 工作流程详解(优化版流程图)](#CI/CD 工作流程详解(优化版流程图))
- [三、Jenkins 安装与启动:Docker 部署最佳实践](#三、Jenkins 安装与启动:Docker 部署最佳实践)
-
- [使用 `docker-compose` 进行部署](#使用
docker-compose进行部署)
- [使用 `docker-compose` 进行部署](#使用
- [四、Jenkins 核心使用:从自由风格到 Pipeline as Code](#四、Jenkins 核心使用:从自由风格到 Pipeline as Code)
-
- [4.1 自由风格项目:快速上手](#4.1 自由风格项目:快速上手)
- [4.2 Pipeline:CI/CD 的黄金标准](#4.2 Pipeline:CI/CD 的黄金标准)
-
- [进阶版 Declarative Pipeline 示例与详解](#进阶版 Declarative Pipeline 示例与详解)
- 五、高级特性与企业级实践
-
- [5.1 分布式构建与云原生](#5.1 分布式构建与云原生)
- [5.2 安全与权限管理](#5.2 安全与权限管理)
- [5.3 可扩展性与可维护性](#5.3 可扩展性与可维护性)
- 六、最佳实践与避坑指南
- 七、总结与学习路径
- 八、学习资源
概述
Jenkins 是一个功能强大、高度可扩展的开源自动化服务器,基于 Java 开发。它已成为 持续集成(CI) 和 持续交付/部署(CD) 领域的事实标准,通过自动化构建、测试和部署流程,极大地提升了软件开发的效率与质量。
一、核心架构:Controller-Agent 模式深度解析
理解 Jenkins 的架构是掌握其精髓的第一步。其核心是分布式的主从架构,现官方称为 Controller-Agent 模式。
1. 核心概念
- Controller (主节点) :原称 Master。它是 Jenkins 的大脑,负责:
- 提供 Web UI 和 REST API。
- 管理和调度构建任务。
- 存储配置、作业历史和插件。
- 核心原则 :Controller 应专注于调度和管理,不应执行重量级的构建任务,以保证其稳定性和响应速度。
- Agent (从节点) :原称 Slave。它是 Jenkins 的"手臂",负责:
- 在 Controller 的指派下执行具体的构建任务。
- 可以是物理机、虚拟机、Docker 容器或 Kubernetes Pod。
- 支持异构环境(例如,在 Windows Agent 上构建 .NET 项目,在 Linux Agent 上构建 Java 项目)。
- Job (任务):一个独立的可执行单元,定义了一次完整的构建过程。
- Pipeline (流水线) :以代码(
Jenkinsfile)的形式定义 CI/CD 流程,是现代 Jenkins 的核心和推荐用法。 - Plugin (插件):Jenkins 生态的灵魂,提供了与 Git、Maven、Docker、Kubernetes 等各种工具的集成能力。
2. Jenkins 架构与工作流程(流程图)
下面的图表清晰地展示了 Controller-Agent 架构以及它们如何与外部系统交互,实现了从代码提交到部署通知的完整闭环。

以下是一个从代码提交到最终部署的完整流程:
- 阶段 1:代码提交
- 开发者在本地完成功能开发后,执行 git push 将代码推送到中央 Git 仓库。
- 阶段 2:持续集成
- 触发构建:Git 仓库的 Webhook 自动触发 Jenkins 中预先配置好的 Pipeline。
- 代码检出:Jenkins Agent 从 Git 仓库拉取指定分支的最新代码。
- 构建与单元测试:Agent 执行编译命令(如 mvn clean package)并运行单元测试。
- 静态代码分析:运行 SonarQube 等工具进行代码质量检查。
- 结果反馈:如果任何一步失败,Pipeline 立即终止并通知开发者;否则,继续下一步。
- 阶段 3:持续交付
- 打包:将应用及其依赖打包成可部署的格式(如 Docker 镜像、WAR 包)。
- 部署到测试环境:将打包好的制品自动部署到与生产环境隔离的测试服务器。
- 自动化测试:在测试环境中运行集成测试、端到端测试(E2E Test)。
- 人工审批(可选):测试通过后,可以配置一个需要人工点击确认的"审批"阶段,再部署到生产环境。
- 阶段 4:持续部署
- 部署到生产环境:在获得批准后(或自动化流程中),Jenkins 将制品部署到生产环境。
- 健康检查与验证:部署后,自动执行健康检查,确保服务正常运行。
- 最终通知:向团队发送部署成功的通知。
二、CI/CD 工作流程:从代码提交到生产部署
一个典型的 Jenkins 驱动的 CI/CD 流程可以被分解为一系列明确的阶段,从开发者的代码提交开始,到最终应用上线为止。
CI/CD 工作流程详解(优化版流程图)

- 触发:开发者将代码推送到 Git 仓库(如 GitHub, GitLab)。
- 通知:Git 仓库通过 Webhook 通知 Jenkins Controller 有新的代码变更。
- 调度:Jenkins Controller 接收到通知后,根据 Job 配置,将构建任务分配给一个或多个合适的、空闲的 Agent 节点。
- 执行:
- Agent 节点接收到任务后,首先从 Git 仓库拉取最新的源代码。
- 然后,Agent 根据在 Jenkinsfile 中定义的流程,依次执行构建、测试、打包等步骤。
- 构建完成后,Agent 会将产物(如 Jar 包、Docker 镜像)上传到制品库(如 Nexus, Artifactory)。
- 如果配置了部署,Agent 会将应用部署到指定的环境(如测试、生产环境)。
- 反馈:Agent 将每个步骤的执行状态和日志实时反馈给 Jenkins Controller。
- 通知:整个 Pipeline 执行完毕后,Controller 根据最终结果(成功或失败),通过邮件、Slack 等方式发送通知给相关人员。
三、Jenkins 安装与启动:Docker 部署最佳实践
使用 Docker 部署 Jenkins 是目前的主流选择,因为它提供了环境隔离、易于管理和快速部署的优势。
使用 docker-compose 进行部署
我们推荐使用 docker-compose 来管理 Jenkins 服务,因为它可以将所有配置项(端口、数据卷、环境变量)清晰地定义在一个文件中。
创建 docker-compose.yml 文件:
yaml
# 定义 docker-compose 的版本
version: '3.8'
services:
# 定义 Jenkins 服务
jenkins:
# 使用官方的 LTS(长期支持)版本镜像,并基于 JDK 11
image: jenkins/jenkins:lts-jdk11
# 为容器指定一个友好的名称
container_name: jenkins
# 设置容器始终重启,确保服务高可用
restart: always
# 端口映射:将主机的 8080 端口映射到容器的 8080 端口(Web UI)
# 将主机的 50000 端口映射到容器的 50000 端口(Agent 通信端口)
ports:
- "8080:8080"
- "50000:50000"
# 数据卷挂载:实现数据持久化
volumes:
# 将名为 'jenkins_data' 的卷挂载到 Jenkins 的主目录,保存所有配置和作业数据
- jenkins_data:/var/jenkins_home
# 【关键】将主机的 Docker 守护进程 socket 挂载到容器内,
# 这样 Jenkins 容器内部就可以直接使用主机的 Docker 命令来构建和管理镜像
- /var/run/docker.sock:/var/run/docker.sock
# 设置容器内的环境变量
environment:
# 【可选】设置 JVM 参数,例如增大内存
- JAVA_OPTS=-Xmx2048m
# 【可选】跳过首次启动的安装向导,适合自动化部署
- JENKINS_OPTS=--httpPort=8080
# 定义顶层数据卷
volumes:
jenkins_data:
启动 Jenkins :
在 docker-compose.yml 文件所在目录执行以下命令:
bash
# -d 参数表示在后台运行
docker-compose up -d
启动后,访问 http://localhost:8080。初始密码可以通过查看容器日志获取:
bash
docker logs jenkins
四、Jenkins 核心使用:从自由风格到 Pipeline as Code
4.1 自由风格项目:快速上手
适合简单、一次性的任务,通过 UI 点选配置。但其缺点是:
- 配置不透明,难以版本控制。
- 复杂流程难以管理。
- 不推荐用于长期项目。
4.2 Pipeline:CI/CD 的黄金标准
Pipeline 将 CI/CD 流程定义为代码,通常存储在项目根目录的 Jenkinsfile 中。
进阶版 Declarative Pipeline 示例与详解
这个示例包含了并行执行、条件判断和环境变量等高级特性,并附有详细注释。
groovy
// 使用 Declarative Pipeline 语法
pipeline {
// 指定 Pipeline 的运行环境
// 'label' 指定在带有 'docker-maven' 标签的 Agent 上运行,实现任务分发
agent {
label 'docker-maven'
}
// 定义全局环境变量,在整个 Pipeline 中都可以访问
environment {
// 设置 Maven 选项,指定本地仓库路径,避免每次都重新下载依赖
MAVEN_OPTS = '-Dmaven.repo.local=./.m2/repository'
// 定义一个动态的 Docker 镜像名称,包含构建号,便于追踪
DOCKER_IMAGE = 'my-app:${BUILD_NUMBER}'
}
// 配置 Pipeline 的一些全局选项
options {
// 构建历史记录清理器:只保留最近10次构建
buildDiscarder(logRotator(numToKeepStr: '10'))
// 设置整个 Pipeline 的超时时间为60分钟,防止任务无限期卡住
timeout(time: 60, unit: 'MINUTES')
}
// 定义 Pipeline 的所有阶段
stages {
// 阶段1:检出代码
stage('Checkout') {
steps {
// 'checkout scm' 是一个内置步骤,用于拉取当前项目的源代码
checkout scm
}
}
// 阶段2:构建
stage('Build') {
steps {
// 执行 Shell 命令进行 Maven 构建,-DskipTests 跳过测试以加快构建速度
sh 'mvn clean package -DskipTests'
}
}
// 阶段3:并行测试
stage('Parallel Tests') {
// 'parallel' 步骤允许并行执行多个子阶段
parallel {
// 子阶段:单元测试
stage('Unit Tests') {
steps {
sh 'mvn test'
}
post {
// 无论成功或失败,都执行此块
always {
// 'junit' 步骤用于收集并解析 JUnit 格式的 XML 测试报告,在 Jenkins UI 中展示
junit 'target/surefire-reports/*.xml'
}
}
}
// 子阶段:集成测试
stage('Integration Tests') {
steps {
// 执行 Maven 的 verify 阶段,并激活 'integration-tests' profile
sh 'mvn verify -P integration-tests'
}
}
}
}
// 阶段4:构建 Docker 镜像
stage('Build Docker Image') {
steps {
// 'script' 步骤允许在 Declarative Pipeline 中嵌入更复杂的 Groovy 脚本
script {
// 使用 Docker 插件提供的语法构建镜像
def app = docker.build("${env.DOCKER_IMAGE}")
// 将构建好的镜像推送到镜像仓库(需要预先配置好凭证)
app.push()
}
}
}
// 阶段5:部署到测试环境
stage('Deploy to Staging') {
// 'when' 指令提供了条件执行的能力
when {
// 当分支为 'main' 或 'develop' 时,才执行此阶段
anyOf {
branch 'main'
branch 'develop'
}
}
steps {
// 执行部署脚本
sh './deploy-staging.sh'
}
}
}
// 定义 Pipeline 执行完毕后的操作,无论成功或失败都会执行
post {
always {
echo 'Pipeline execution finished.'
// 'cleanWs()' 是 Workspace Cleanup 插件提供的步骤,用于清理工作空间
cleanWs()
}
success {
// 构建成功时发送邮件通知
emailext (
subject: "✅ Build Success: ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
body: "The pipeline for ${env.JOB_NAME} completed successfully. Check ${env.BUILD_URL} for details.",
to: "${env.CHANGE_AUTHOR_EMAIL}"
)
}
failure {
// 构建失败时发送邮件通知
emailext (
subject: "❌ Build Failed: ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
body: "The pipeline for ${env.JOB_NAME} failed. Please check the logs at ${env.BUILD_URL}.",
to: "${env.CHANGE_AUTHOR_EMAIL}"
)
}
}
}
五、高级特性与企业级实践
5.1 分布式构建与云原生
- 静态 Agent:手动配置的长期运行的 Agent,适合固定环境。
- 动态 Agent (云原生) :按需创建和销毁的 Agent,是现代 CI/CD 的核心。
- Kubernetes Plugin:允许 Jenkins 在 Kubernetes 集群中为每次构建动态创建一个 Pod 作为 Agent。构建完成后,Pod 被自动销毁,实现了资源隔离和弹性伸缩。
- Docker Pipeline Plugin :在 Pipeline 中直接使用
docker.image('...').inside {}来在临时容器中执行构建步骤。
5.2 安全与权限管理
- 凭据管理 :使用 Jenkins 内置的凭据存储来管理用户名密码、SSH 密钥、API Token 等,严禁 将敏感信息硬编码在
Jenkinsfile中。 - 基于角色的策略 :通过安装
Role-Based Strategy插件,可以精细化控制不同用户或用户组对 Job、视图、Agent 等资源的访问权限。 - 脚本安全:对于 Pipeline 中使用 Groovy 脚本的部分,Jenkins 有一个脚本审批流程,以防止恶意代码执行。管理员需要在 "Manage Jenkins -> In-process Script Approval" 中审批不安全的脚本。
5.3 可扩展性与可维护性
- 多分支流水线 :自动扫描 Git 仓库的所有分支,并为每个包含
Jenkinsfile的分支创建和管理一个 Pipeline Job。完美适配 GitFlow 工作流。 - 共享库:将通用的 Pipeline 代码(如部署逻辑、通知方法)封装成 Groovy 库,版本化管理后,可在多个项目间复用,极大提升了代码的可维护性。
- 配置即代码 :使用
JCasC(Configuration as Code) 插件,可以将 Jenkins 的全局配置(凭据、节点、插件列表、系统设置等)以 YAML 文件的形式进行版本控制,实现 Jenkins 的自动化部署和灾难恢复。
六、最佳实践与避坑指南
- Pipeline as Code 是第一原则 :始终将
Jenkinsfile存放在代码仓库中。 - 保护 Controller:确保所有构建任务都在 Agent 上运行,避免压垮 Controller。
- 精细化权限控制:遵循最小权限原则,为不同团队配置合适的角色。
- 管理构建产物 :定期清理旧的构建和历史记录,防止磁盘空间耗尽。使用
buildDiscarder选项。 - 善用共享库:避免在多个项目中复制粘贴 Pipeline 代码。
- 监控与告警:集成 Prometheus 等监控系统,监控 Jenkins 的健康状态(队列长度、构建成功率、Agent 资源等)。
- 避免硬编码:所有敏感信息和可变配置都应通过凭据或参数化构建注入。
七、总结与学习路径
Jenkins 从一个简单的 CI 工具,已经演变成一个功能全面的 CD 平台和自动化编排引擎。掌握 Jenkins,不仅仅是学习其用法,更是理解现代软件工程中自动化、协作和效率的核心思想。
推荐学习路径:
- 基础:安装 Jenkins,创建一个简单的 Freestyle Job。
- 核心 :学习编写 Declarative Pipeline,掌握
stages,steps,post等核心语法。 - 进阶:实践参数化构建、多分支流水线和并行执行。
- 高级:探索共享库、与 Kubernetes 集成、配置即代码。
- 专家:深入 Jenkins 插件开发,参与社区贡献。
八、学习资源
- 官网 :https://www.jenkins.io/
- 官方文档 :https://www.jenkins.io/doc/
- Pipeline 语法生成器 :在 Jenkins UI 的
Pipeline Syntax链接中,这是一个强大的学习工具。 - 插件中心 :https://plugins.jenkins.io/
- GitHub 示例 :https://github.com/jenkinsci/pipeline-examples