肖哥弹架构 跟大家“弹弹” Jenkins 设计与实战应用,需要代码关注
欢迎 关注,点赞,留言。
关注公号Solomon肖哥弹架构获取更多精彩内容
历史热点文章
- MyCat应用实战:分布式数据库中间件的实践与优化(篇幅一)
- 图解深度剖析:MyCat 架构设计与组件协同 (篇幅二)
- 一个项目代码讲清楚DO/PO/BO/AO/E/DTO/DAO/ POJO/VO
- 写代码总被Dis:5个项目案例带你掌握SOLID技巧,代码有架构风格
- 里氏替换原则在金融交易系统中的实践,再不懂你咬我
🚀 你以为Jenkins只是个简单CI工具?大错特错!本文首次公开Jenkins支撑万亿级流水的底层架构设计:7大核心架构图解密Master-Agent通信机制,深入插件系统加载原理,剖析Pipeline执行引擎运作流程。更有生产级金丝雀发布、混沌工程注入、自动化回滚等高阶玩法,带你从“会用”到“精通”,彻底掌握Jenkins架构设计与企业级实战经验!
一、架构设计
1. Jenkins 基础架构图
2. 分布式架构图
3. 总体架构关系图
3.1 框架层 (The Framework Layer)
框架层是 Jenkins 的引擎和骨架。它本身不直接完成具体的构建或部署任务,而是提供了实现这些任务所需的核心机制、扩展能力和运行时环境。它的特点是稳定、通用、可扩展。
3.1.1 核心组件:
- 运行时环境 (Runtime Environment)
- Web 容器:基于 Java Servlets 的 Web 应用程序,处理 HTTP 请求和 UI 渲染。
- 持久化模型:如何将任务(Job)、配置、构建结果等保存到磁盘(通常是
JENKINS_HOME
目录下的 XML 文件)。
- 扩展系统 (Extension System) - 灵魂所在
- 扩展点 (Extension Points) :框架层定义了一系列“接口”或“契约”,例如
Builder
、Publisher
、Trigger
、SCM
。这些扩展点规定了插件可以做什么,但不提供具体实现。 - 插件管理器 (Plugin Manager) :负责插件的发现、加载、依赖解析和生命周期管理。它使得 Jenkins 的功能可以无限扩展而无需修改核心代码。
- 扩展点 (Extension Points) :框架层定义了一系列“接口”或“契约”,例如
- 调度与执行核心 (Scheduling & Execution Core)
- 构建队列 (Build Queue) :管理等待执行的任务,处理优先级和并发控制。
- 执行器 (Executors) :代表执行任务的“槽位”或能力。它负责启动和监控构建进程。
- 节点管理 (Node Management) :管理 Master 和 Agent 的通信、状态和任务分配逻辑。
- 抽象模型 (Abstract Models)
- 定义了核心概念的对象模型,如
Job
、Run
(构建)、View
、User
等。应用层的功能都围绕这些模型构建。
- 定义了核心概念的对象模型,如
3.2 应用层 (The Application Layer)
应用层是建立在框架层之上的具体功能和实现。它利用框架层提供的扩展点和服务,来实现特定的 DevOps 实践和工具链集成。它的特点是具体、易变、面向用户。
绝大部分用户直接接触和配置的都是应用层的功能。
3.2.1 核心组成部分:
- 插件 (Plugins)
- 插件是应用层功能的主要载体。每个插件实现一个或多个框架层定义的扩展点。
- 示例:
- Git Plugin:实现了
SCM
扩展点,提供了从 Git 仓库拉取代码的能力。 - Email Extension Plugin:实现了
Publisher
扩展点,提供了发送丰富邮件通知的能力。 - JUnit Plugin:实现了
Publisher
扩展点,提供了解析和展示 JUnit 测试报告的能力。
- Git Plugin:实现了
- 用户界面 (UI) & 用户体验 (UX)
- 经典 UI:传统的 Jenkins Web 界面,用于配置自由风格任务、查看构建历史等。
- Blue Ocean UI:提供现代化的、直观的流水线可视化界面(注:目前已不再积极开发,但仍有使用)。
- 表单和配置页面:每个插件都会提供自己的配置界面,这些都属于应用层。
- 流水线 (Pipeline)
Jenkinsfile
和 Pipeline 语法是应用层的DSL(领域特定语言) 。- 它利用框架层的执行引擎和插件提供的步骤(Step),来编排复杂的构建、测试、部署流程。例如
sh
,git
,bat
,junit
这些步骤都是由相应的插件实现并注入到流水线 DSL 中的。
- API
- REST API:提供以编程方式与 Jenkins 交互的能力,用于触发构建、获取信息、管理配置等。它是对框架层核心模型的程序化暴露。
3.3 技术架构分层示例
关键特点总结:
- 模块化设计:所有功能通过插件解耦,可按需扩展
- 声明式与脚本式混合:同时支持 GUI 配置和代码化流水线(Jenkinsfile)
- 生态整合能力:无缝对接 DevOps 工具链(如:Ansible、Terraform、Prometheus)
- 可观测性:提供完整的构建日志、测试报告和性能指标追踪
3.4 两层之间的关系与交互
1. 依赖关系
2. 交互流程示例:一次构建任务
3.4 总结与比喻
层面 | 比喻 | 职责 | 特点 |
---|---|---|---|
框架层 | 电脑的操作系统 | 提供进程管理、文件系统、驱动模型等基础能力 | 稳定、通用、提供标准接口 |
应用层 | 电脑上安装的软件 (Chrome, Word,游戏) | 完成用户需要的具体任务(浏览网页、写文档、玩游戏) | 多样、易变、直接面向用户 |
这种分层架构的优势:
- 高内聚低耦合:核心框架非常稳定,新功能通过插件独立开发,互不影响。
- 极强的扩展性:社区可以为核心框架开发无数应用(插件),而无需改动一行框架代码。
- 生态繁荣:这种模式直接催生了 Jenkins 近 2000 个插件的庞大生态系统。
4. 流水线执行原理图
5. 插件系统架构图
6. CI/CD 工作流图
7. 高可用架构图
8. 安全认证架构图
二、Jenkins 功能说明
1. Jenkins 核心框架功能
功能类别 | 核心功能描述 |
---|---|
1. 持续集成引擎 | - 自动化代码拉取、构建、测试 - 实时反馈构建状态 - 支持定时/代码变更触发 |
2. 分布式构建 | - Master-Agent 架构 - 任务动态分配 - 跨平台构建(Linux/Windows/macOS) |
3. 流水线编排 | - Pipeline as Code(Groovy DSL) - 可视化 Blue Ocean 界面 - 多阶段并行执行 |
4. 插件系统 | - 1800+ 官方插件 - 自定义插件开发框架 - 依赖管理(Plugin Manager) |
5. 安全控制 | - RBAC 权限模型 - 凭证管理(Credentials) - 集成 LDAP/OAuth/GitHub SSO |
6. 扩展点体系 | - 提供 100+ 扩展点(Extension Points) - 支持核心功能二次开发 |
2. 应用层核心功能
2.1. 源代码管理集成
2.2. 构建工具支持
工具类型 | 典型实现 |
---|---|
编译型 | Maven/Gradle/MSBuild |
脚本型 | Shell/Python/PowerShell |
容器化 | Docker/Podman Build |
云原生 | Helm/Kustomize |
2.3. 测试自动化
2.4. 部署与发布
- 部署模式:
- 蓝绿部署(Blue-Green)
- 滚动更新(Rolling Update)
- 金丝雀发布(Canary Release)
- 目标环境:
2.5. 监控与反馈
功能模块 | 实现方式 |
---|---|
构建监控 | 实时控制台输出/构建时间趋势图 |
质量门禁 | SonarQube 质量阈值检查 |
通知机制 | 邮件/Slack/钉钉/Webhook 通知 |
日志分析 | ELK 集成/Logstash 管道 |
3. Jenkins 核心组件总览
组件类别 | 关键组件 | 功能描述 |
---|---|---|
中央控制器 | Jenkins Master | 调度中心、UI服务、插件管理 |
执行单元 | Jenkins Agent/Node | 实际任务执行者(可动态扩展) |
任务编排器 | Build Queue Executor Slot | 任务排队管理 并发控制(每个Agent的并行槽位) |
持久化层 | Job Config Store Build Artifact Storage | 存储任务配置 保存构建产物(如JAR包) |
安全层 | Authentication Realm Authorization Matrix | 用户认证(LDAP/OAuth等) 细粒度权限控制 |
通信桥梁 | Jenkins CLI REST API Agent Protocol (JNLP/SSH) | 命令行接口 外部系统集成 Master-Agent通信协议 |
4. 组件运转规则与交互流程
4.1. 核心组件交互图
4.2. 资源调度规则
4.3. 状态转换规则
5. 关键组件详细说明
5.1. Master-Agent 通信机制
- 协议选择:
- JNLP:Agent主动连接Master(需开放端口)
- SSH:Master主动连接Agent(更安全)
5.2. 插件加载流程
5.3. 流水线执行引擎
三、Jenkins概念对象模型
0. 核心对象模型关系图
下图清晰地展示了上述核心对象之间的静态关系(如继承、组合)和动态关系(如触发)。
交互流程:
一次简单的手动构建所涉及的对象交互:
- User 在 Jenkins UI 上点击一个 Job 的“构建”按钮。
- 这会创建一个 Cause(
UserIdCause
),记录是谁发起的。 - Job 的配置被读取,并创建一个新的 Run(例如
FreeStyleBuild
)对象。 - Run 被放入执行队列,最终分配到一个 Node(可能是
Master
或Agent
)上的 Executor 执行。 - 执行过程中,会产生日志(写入 Run 的
log
属性)。 - 执行结束后,结果(
SUCCESS
/FAILURE
)被设置到 Run 的result
属性。 - 如果配置了归档,会生成 Artifact 文件。
- 插件可能会向本次 Run 添加 Action(例如
TestResultAction
来展示测试报告)。 - 所有这些数据(Run 的状态、日志、Artifacts、Actions)都被持久化到
JENKINS_HOME
的磁盘上。 - UI 通过读取 Run 和其关联的 Action 对象来向 User 展示这次构建的详细结果页面。
1. 核心配置与身份模块
这个模块定义了 Jenkins 的静态结构和访问控制。
1.1. Node (节点)
- 说明:代表一个可以执行任务的执行环境。是
Master
和Agent
的抽象基类。 - 关键属性:
label
: 标签,用于将任务分组到合适的节点上。numExecutors
: 执行器数量,决定并发能力。
- 子类:
Master
: 主节点,负责协调。Agent
/Slave
: 代理节点,负责执行任务。
1.2. User (用户)
- 说明:代表一个可以登录和操作 Jenkins 的实体。
- 关键属性:
id
: 用户名。fullName
: 全名。email
: 邮箱。
1.3. Credential (凭证)
- 说明:安全存储敏感信息的对象(由 Credentials Plugin 引入)。
- 类型:
UsernamePasswordCredential
: 用户名密码。SSHUserPrivateKeyCredential
: SSH 私钥。StringCredential
: 秘密文本。CertificateCredential
: 证书。
1.4. View (视图)
- 说明:用于对
Job
进行分组和筛选,提供不同的仪表板视角。 - 类型:
ListView
: 列表视图,基于规则过滤。DashboardView
: 更复杂的仪表板视图(由插件提供)。
2. 任务与执行模块
这是最核心的模块,定义了要做什么和做的过程。
2.1. Job / Project (任务 / 项目)
- 说明:用户配置的自动化任务的定义或蓝图。它本身不存储执行状态,只存储配置。
- 关键属性:
name
: 名称。config
: 所有配置信息(XML格式存储)。
- 子类:
FreeStyleProject
: 自由风格项目,通过UI配置。WorkflowJob
: 流水线项目,其配置来自Jenkinsfile
。
2.2. Run (运行) / Build (构建)
- 说明:
Job
的一次具体执行。它存储了本次执行的所有状态、日志和结果。 - 关键属性:
number
: 构建号,唯一标识。result
: 结果(SUCCESS, FAILURE, UNSTABLE, ABORTED)。duration
: 持续时间。log
: 控制台输出日志。
- 子类:
FreeStyleBuild
: 对应FreeStyleProject
的运行。WorkflowRun
: 对应WorkflowJob
的运行。
2.3. Stage (阶段)
- 说明: (属于 Pipeline 插件) 将流水线逻辑划分为不同的、可视化的块(如“构建”、“测试”、“部署”)。
- 关键属性:
name
: 阶段名称。
2.4. Step (步骤)
- 说明: (属于 Pipeline 插件) 流水线中最小的执行单元。一个
Stage
包含多个Step
。 - 示例:
sh
: 执行 shell 命令。git
: 拉取代码。bat
: 执行批处理命令。junit
: 发布测试报告。
3. 流水线与编排模块
3.1. Pipeline (流水线)
- 说明:一套通过
Jenkinsfile
定义的持续交付流水线的完整模型。它是一个WorkflowJob
。
3.2. Jenkinsfile
- 说明:一个文本文件,包含了整个流水线的定义,使用 Groovy DSL 编写。它被存储在源代码库中,实现了 Pipeline as Code。
4.产物与报告模块
4.1. Artifact (制品)
- 说明:由一次
Run
产生的、需要被保留和存档的文件(如 Jar 包、War 包、文档)。 - 存储:通常存储在
$JENKINS_HOME/jobs/[job_name]/builds/[build_number]/archive/
目录下。
4.2. Action (动作)
- 说明:一个非常重要的抽象接口,用于向
Run
或Job
对象添加额外的元数据、报告或功能。 - 常见实现:
TestResultAction
: 存储和展示单元测试结果(由 JUnit 插件添加)。BuildDataAction
: 存储本次构建的 SCM 信息(如 Git Commit ID)。CauseAction
: 存储本次构建的触发原因(如由用户手动触发、由 SCM 变更触发)。BadgeAction
: 为构建添加自定义徽章。
5. 触发器与通知模块
5.1. Trigger (触发器)
- 说明:定义了一个
Job
应在何时被自动触发。 - 类型:
SCMTrigger
: 轮询 SCM 变更。TimerTrigger
: 定时触发(Cron 语法)。BuildAfterOtherProjectsTrigger
: 在其他项目构建完成后触发。
5.2. Cause (原因)
- 说明:记录一次
Run
是为什么被触发的。 - 类型:
UserIdCause
: 用户手动触发。SCMCause
: SCM 变更触发。UpstreamCause
: 由上游项目触发。
四、Jenkins 常规业务流程
0. 生产环境流水线全景图
1. 核心发布流程 (The Core Release Process)
这是生产环境的命脉,通常表现为一条分阶段(Stage)的部署流水线。
1.1. 自动化金丝雀发布/蓝绿发布流程
-
目标:以最小风险、零停机的方式发布新版本到生产环境。
-
流程详解:
-
关键工具:Kubernetes(Service/Ingress 流量切换)、Helm、Prometheus/Grafana(监控)、Istio/Linkerd(服务网格)。
-
适用场景:对可用性要求极高的用户-facing 服务。
1.2. 审批门禁流程 (Manual Approval Gates)
-
目标:在关键操作(如生产部署)前引入人工确认,平衡自动化与风险控制。
-
流程详解:
-
实现:使用 Jenkins 的
input
步骤或插件(如 Jira Approval、Telegram Notification)。 -
适用场景:法律合规要求、高风险变更、首次发布新功能。
2. 安全与合规流程 (Security & Compliance)
这些流程是生产环境的“防火墙”,确保所有发布物都符合安全标准。
2.1. 生产镜像构建与漏洞扫描流程
- 目标:确保部署到生产环境的容器镜像是纯净、安全、不可变的。
- 流程详解:
- 来源:使用通过CI测试的唯一可信二进制制品(如 application.jar)。
- 构建:在一个独立的、高权限的Jenkins Job中,基于最小化基础镜像(如
distroless
)构建 Docker 镜像。 - 扫描:立即使用 Trivy 或 Grype 对构建好的镜像进行漏洞扫描。
- 阻断:如果发现高危(CRITICAL/HIGH)漏洞,流程自动失败,无法推送到仓库。
- 推送:扫描通过后,镜像被推送到生产镜像仓库(如 Harbor、ECR),并打上唯一标签(如
git-commit-id
)。
2.2. 合规性审计与证据收集流程
- 目标:自动为每一次生产发布生成审计线索,满足合规要求(如 SOC2, ISO27001)。
- 流程详解:
- 流水线自动收集并关联:
- 构建信息:谁、在什么时候、触发了什么版本的构建。
- 代码信息:构建对应的 Git Commit ID、代码差异(Diff)。
- 测试证据:单元测试、集成测试的通过报告。
- 安全证据:漏洞扫描结果、SBOM(软件物料清单)。
- 部署证据:部署到的环境、使用的配置、审批记录。
- 所有这些信息被自动打包并上传到审计数据库或长期存储中。
- 流水线自动收集并关联:
3. 可靠性保障流程 (Reliability Assurance)
3.1. 自动化回滚流程 (Self-Healing Rollback)
- 目标:当监控系统检测到发布后异常,自动触发回滚,最大限度减少MTTR(平均恢复时间)。
- 触发条件:Prometheus等监控系统检测到5xx错误率飙升、延迟增加、业务指标异常。
- 流程详解:
3.2. 混沌工程注入流程 (Chaos Engineering)
- 目标:在生产发布后,主动注入故障,验证系统的弹性和高可用设计是否有效。
- 流程:在蓝绿部署或金丝雀发布后,自动调用 ChaosMesh 或 LitmusChaos 工具,模拟节点宕机、网络延迟、Pod 被杀等故障,观察系统是否按预期运行或自愈。
- 注意:此流程风险极高,需有完善的熔断和快速恢复机制。
4. 数据管理流程
4.1 数据库迁移流水线 (Database Migration Pipeline)
- 目标:自动化、安全地执行生产数据库的 Schema 变更。
- 流程详解:
- 准备:将 Flyway/Liquibase 迁移脚本纳入代码库,进行代码审查。
- 预检查:在预生产环境(Staging) 自动执行
dry-run
或check
命令,评估变更影响。 - 备份:执行前自动触发生产数据库备份。
- 执行:在指定的维护窗口(通过参数化选择),自动执行变更脚本。
- 验证:执行后运行简单的查询验证变更是否成功。
- 恢复预案:准备好备份恢复脚本,随时准备手动干预。
一、基础自动化流程
这些是构成复杂流水线的基础构建块。
1. 定时构建流程 (Scheduled Build)
-
目标:无需人工干预,定期自动构建项目,确保代码稳定性。
-
触发方式:
定时构建 (Build periodically)
触发器,使用 Cron 语法。 -
典型流程:
-
适用场景:每日构建 (Nightly Build)、周期性的集成测试。
2. 静态代码检查流程 (Static Code Analysis)
-
目标:在编译前提前发现代码风格、潜在漏洞和坏味道。
-
工具:SonarQube、Checkstyle、PMD、SpotBugs。
-
典型流程:
-
适用场景:强制代码质量门禁,提升代码健壮性。
二、核心CI/CD流水线
这是 Jenkins 最经典、最强大的业务流程。
1. 持续集成流水线 (CI Pipeline)
-
目标:对每个提交快速反馈,确保集成后的代码质量。
-
触发方式:
GitHub Webhook
、轮询 SCM
。 -
典型流程:
-
适用场景:所有需要保证代码质量的软件开发项目。
2. 持续交付/部署流水线 (CD Pipeline)
-
目标:将 CI 产出的制品安全、可靠地交付到不同环境,直至生产环境。
-
触发方式:由成功的 CI 流水线触发,或手动触发。
-
典型流程:
-
部署策略:蓝绿部署、金丝雀发布、滚动更新。
-
适用场景:需要频繁、可靠发布应用的团队。