news 2026/10/5 6:41:28

90DaysOfDevOps 第 71 天:认识 Jenkins——开源的持续集成与持续交付自动化服务器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
90DaysOfDevOps 第 71 天:认识 Jenkins——开源的持续集成与持续交付自动化服务器
  • 文档/教程

【免费下载链接】90DaysOfDevOps

This repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.

项目地址:https://gitcode.com/gh_mirrors/90/90DaysOfDevOps
点击查看免费下载

本文是 90DaysOfDevOps 学习路线中 CI/CD 专题的入门篇,聚焦 Jenkins 的核心定位:它既是一个持续集成(Continuous Integration)工具,也是一台用 Java 编写的自动化服务器,负责把开发者提交的代码自动完成构建、测试与部署。读完本文,你将理解夜间构建与持续集成两条路径的差异、Jenkins 相比 TravisCI / Bamboo / Buildbot / Apache Gump 等竞品的定位,掌握 Jenkins 的五大特性、Pipeline 概念与七步架构工作流,并能结合本仓库中真实存在的 minikube + Helm 部署清单与 Jenkinsfile,了解 Jenkins 如何在 Kubernetes 环境中落地。

什么是 Jenkins?

Jenkins 是一个持续集成工具,它让"新编写的代码"可以持续地进行开发、测试与部署。换句话说,它把软件交付中最容易出错、最耗时的重复环节——拉取代码、编译构建、运行测试、发布部署——交给一台自动化服务器来驱动。

要理解 Jenkins 的价值,首先要理解"集成代码"的两种典型方式:

方式一:夜间构建(Nightly Build)——传统做法

开发者在一天之内各自在自己的任务上开发,到当天结束时,把各自的改动推送到源代码仓库;然后到了夜间,统一运行单元测试并构建软件。这种方式可以称为"旧式"的代码集成方式:所有变更集中在一个时间点被整合,反馈周期以"天"为单位。

方式二:持续集成(Continuous Integration)——推荐做法

开发者的提交行为不变,依然是随时把改动提交到源代码仓库;但不同的是,每当一次代码提交发生,构建流程就会立即、持续地被触发,而不是等到夜间统一执行。

持续集成的最大意义在于:对于分布在世界各地的开发者团队,不需要为"每天某个固定时刻必须停止提交代码"而牺牲效率。无论身处哪个时区,任何一次提交都会马上进入构建与测试管道,问题也能第一时间暴露。Jenkins 正是在这里登场,充当那台控制测试与构建过程的 CI 服务器。

与其它 CI 工具的横向对比

在深入 Jenkins 之前,原文档也列举了同领域的其它工具,便于理解 Jenkins 为什么是社区里最常见的选择之一:

  • TravisCI:托管的、分布式的持续集成服务,用于构建和测试托管在 GitHub 上的软件项目。
  • Bamboo:支持并行运行多个构建以加快编译速度,内置连接仓库的功能,并带有 Ant、Maven 的构建任务。
  • Buildbot:开源的软件构建、测试与发布流程自动化框架,使用 Python 编写,支持跨多个平台的分布式并行任务执行。
  • Apache Gump:专注于 Java 项目,设计目标就是每晚构建并测试 Java 项目,确保所有项目在 API 层和功能层面保持兼容。

与上述工具一样,Jenkins 也是开源软件,但它的不同之处在于:它是用 Java 编写的自动化服务器,通过持续集成自动化软件开发过程,并进一步支撑持续交付(Continuous Delivery)。

Jenkins 的核心特性

Jenkins 的功能覆盖面很广,但以下五个特性构成了它的核心优势:

  • 易安装(Easy Installation):Jenkins 是一个自包含的、基于 Java 的程序,开箱即可运行,官方提供 Windows、macOS 和 Linux 操作系统的安装包。
  • 易配置(Easy Configuration):通过 Web 界面即可完成安装与配置,界面自带错误检查和内建帮助,降低了上手门槛。
  • 插件体系(Plug-ins):Update Centre(更新中心)提供了大量插件,能够与 CI/CD 工具链中的众多工具集成。
  • 可扩展(Extensible):除了现成插件,Jenkins 还可以通过插件架构本身进行扩展,这为它的使用场景提供了近乎无限的可能性。
  • 分布式(Distributed):Jenkins 可以轻松地把工作分发到多台机器上执行,从而在多平台上加速构建、测试和部署。

从仓库中的 Helm values 文件也能印证这套特性。在 jenkins-values.yml 里,controller.installPlugins明确列出了一组随控制器启动即安装的插件:kubernetes:1.31.3、workflow-aggregator:2.6、git:4.10.2、configuration-as-code:1.55.1——这正是"插件体系"和"可扩展"在真实部署清单中的直接体现;而agent段中的jenkins/inbound-agent镜像、containerCap: 10等配置,则对应"分布式"特性:由控制器按需在 Kubernetes 集群中拉起执行任务的 agent。

Jenkins Pipeline:从提交到部署的自动化流水线

"Pipeline(流水线)"这个词在前面章节出现过,但当时讨论的范畴更宏观,没有落到具体工具上。在 Jenkins 的语境下,Pipeline 是这样的过程:

你向 Jenkins 提交代码 → Jenkins 构建你的应用 → 运行全部自动化测试 → 每一步完成后发布并部署代码。

Jenkins 正是实现这一整套流程自动化的引擎。下面这张图用管道的隐喻展示了 CI/CD 流水线的五个串联阶段:代码提交(Code Commit)→ 构建(Build)→ 测试(Test)→ 发布(Release)→ 部署(Deploy)。

本仓库中保存了一份可直接研读的声明式 Pipeline 示例,见 2022/Days/CICD/Jenkins/Pipeline/Jenkinsfile。它展示了 Jenkins 在 Kubernetes 上运行流水线的典型形态:

  • 通过podTemplate定义一个 Kubernetes Pod 作为构建环境,内含两个容器:maven:3.8.1-jdk-8负责构建,gcr.io/kaniko-project/executor:debug负责在容器内构建并推送 Docker 镜像;
  • 流水线包含Clone Repository阶段:用git步骤从远程仓库克隆代码;
  • Build Image阶段在 maven 容器中执行构建(示例中以输出Tests passed模拟测试通过);
  • Test Image阶段在 kaniko 容器中执行/kaniko/executor --context \pwd` --destination michaelcade1/helloworld:1.0`,把当前目录构建成镜像并推送到目标仓库。

配套的 Dockerfile 定义了被构建的 Hello World 应用镜像:基于busybox:latest,通过环境变量PORT=8000指定端口,把 index.html 放进/www目录,再用 busybox 自带的httpd起一个极简 Web 服务器。这样一个"提交 → 构建 → 测试 → 产出镜像"的闭环,就是 Jenkins Pipeline 最直观的落地示例。

Jenkins 架构与七步工作流

Jenkins 可以安装到多种操作系统上:Windows、Linux、macOS,也支持以 Docker 容器形式部署,甚至可以运行在 Kubernetes 集群中。原文档提到,后续章节计划在 minikube 集群中安装 Jenkins,模拟向 Kubernetes 的部署——而本仓库的 CICD/Jenkins 目录恰好保存了这套部署的完整配置。

下面这张图展示了 Jenkins 参与软件交付的完整架构,可以拆解为七个步骤:

  1. 提交:开发者把代码改动提交到源代码仓库。
  2. 拉取:Jenkins 按固定间隔检查仓库,拉取任何新代码。
  3. 构建:构建服务器把代码编译成可执行产物——示例中使用 Maven 作为广为人知的构建工具(这也是后续章节要覆盖的话题)。
  4. 构建失败反馈:如果构建失败,反馈信息立刻送回给开发者。
  5. 测试:Jenkins 把构建好的应用部署到测试服务器——示例中使用 Selenium 作为广为人知的测试工具(同样值得后续深入研究)。
  6. 测试失败反馈:如果测试失败,反馈信息传递给开发者。
  7. 发布:如果测试通过,就可以发布到生产环境。

这个循环是持续不断的——正是它让应用可以在几分钟内完成更新,而不是几小时、几天、几个月甚至几年。

更进一步的架构能力:Master-Slave 与 CloudBees

如果需求更复杂,Jenkins 架构还有更多可挖掘的能力:它具备master-slave(主从)机制,master 可以把任务分发给 slave Jenkins 环境执行,这正是前面"分布式"特性的架构基石,也与仓库中jenkins-values.yml里agent段的配置(jenkins/inbound-agent、containerCap、podRetention等)一一对应。

另外,由于 Jenkins 是开源软件,大量需要企业级支持的企业会选择CloudBees——它是 Jenkins 的企业版本,为付费企业客户带来技术支持以及可能更多的附加功能。原文档中提到了 Bosch 采用这一路线的案例(此处不再展开外部链接,案例详情可自行查阅官方公开资料)。

仓库实操:在 minikube 中用 Helm 部署 Jenkins

本仓库的 steps.md 记录了在 minikube 中部署 Jenkins 的完整命令序列,下面按原样给出并补充关键说明:

minikube start # 创建命名空间(二选一) kubectl create namespace jenkins # 或 kubectl create -f jenkins-namespace.yml # 见 2022/Days/CICD/Jenkins/jenkins-namespace.yml kubectl get namespaces # 添加 Jenkins 官方 Helm 仓库并更新索引 helm repo list helm repo add jenkinsci https://charts.jenkins.io helm repo update # 应用持久卷与服务账号清单 kubectl apply -f jenkins-volume.yml kubectl apply -f jenkins-sa.yml # 使用 values 文件安装 Jenkins 到 jenkins 命名空间 chart=jenkinsci/jenkins helm install jenkins -n jenkins -f jenkins-values.yml $chart # 修复持久卷属主(minikube 节点上) minikube ssh sudo chown -R 1000:1000 /data/jenkins-volume # 重启 jenkins-0 Pod 使属主生效,并观察 Pod 状态 kubectl delete pod jenkins-0 -n jenkins kubectl get pods -n jenkins -w # 取出管理员初始密码(chart 生成的 secret) kubectl exec --namespace jenkins -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/chart-admin-password && echo # 端口转发后浏览器访问 kubectl --namespace jenkins port-forward svc/jenkins 8080:8080 # 打开浏览器登录 http://localhost:8080,然后执行插件更新

这套部署中几个关键清单文件的职责如下:

  • jenkins-namespace.yml:定义名为jenkins的 Kubernetes 命名空间,隔离 Jenkins 相关资源。
  • jenkins-sa.yml:创建名为jenkins的 ServiceAccount,并绑定一个 ClusterRole + ClusterRoleBinding,授予其对 statefulsets、pods、deployments、secrets、configmaps、persistentvolumeclaims 等资源的增删改查权限——这为 Jenkins 控制器在集群内按需调度 agent Pod、操作资源提供了 RBAC 基础。
  • jenkins-values.yml:Helm values 文件,集中定义了控制器的镜像(jenkins/jenkins,tagLabel: jdk11)、以非 root 用户runAsUser: 1000运行、健康探针(startup/liveness/readiness 均探测/login路径)、installPlugins插件清单、JCasC(Configuration as Code)默认配置(内置 admin 用户与登录授权策略loggedInUsersCanDoAnything)、持久化(persistence.enabled: true,8Gi 存储)以及 agent 侧的默认 Pod 模板与资源配额。其中adminUser: "admin"、密码默认随机生成并存放在 Secret 中,这正是前面用kubectl exec读取密码的原因。

需要说明的是,以上命令与配置文件均来自本仓库的 2022/Days/CICD/Jenkins 目录,属于学习环境(minikube + Helm)下的部署路径;生产环境通常需要根据集群的存储类、安全策略和 Ingress 配置做相应调整,例如jenkins-values.yml中注释提及的serviceType(minikube 用 NodePort,其他环境用 LoadBalancer 或 ClusterIP + Ingress)。

继续深入:仓库内可研读的资源

围绕 Jenkins 这一主题,可以继续阅读本仓库中的以下文件:

  • Pipeline/Jenkinsfile:Kubernetes 环境下的声明式 Pipeline 完整示例(podTemplate + maven + kaniko)。
  • Pipeline/Dockerfile 与 Pipeline/index.html:被 Pipeline 构建的 Hello World 应用源码。
  • steps.md:minikube 部署 Jenkins 的逐条命令备忘。
  • jenkins-values.yml:Jenkins Helm Chart 的完整 values 配置(含插件、JCasC、agent、持久化、备份等全部参数)。
  • jenkins-sa.yml 与 jenkins-namespace.yml:RBAC 与命名空间清单。

下一步将进入第 72 天,继续沿着 Jenkins 主题深入:寻找一个可以完整走一遍的示例应用,并用 Jenkins 结合其它工具串联出完整的 CI/CD 实战流程。详见 2022/ja/Days/day72.md。

  • 文档/教程

【免费下载链接】90DaysOfDevOps

This repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.

项目地址:https://gitcode.com/gh_mirrors/90/90DaysOfDevOps
点击查看免费下载

相关推荐

上一篇:FreeLLMAPI 完整快速上手:一条命令,把 34 家免费 LLM 提供商装进一个 /v1
下一篇:10 分钟部署 FreeLLMAPI:把 34 家 AI 提供商的免费模型装进一个接口

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 6:40:59

ABB机器人与PLC的ModbusTCP通信:Float拆分寄存器与字节序实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/5 6:39:27

Ludusavi深度解析:从零开始掌握游戏存档备份的完整指南

Ludusavi深度解析:从零开始掌握游戏存档备份的完整指南 【免费下载链接】ludusavi Backup tool for PC game saves 项目地址: https://gitcode.com/GitHub_Trending/lu/ludusavi 作为PC游戏玩家,你是否曾因系统重装、游戏更新或意外删除而丢失宝贵…

作者头像 李华
网站建设 2026/10/5 6:38:27

Intel RealSense SDK 实战指南:五步从接上相机到第一帧点云

Intel RealSense SDK 实战指南:五步从接上相机到第一帧点云 【免费下载链接】librealsense RealSense SDK 项目地址: https://gitcode.com/GitHub_Trending/li/librealsense Intel RealSense SDK(开源实现为 librealsense)是一套跨平台…

作者头像 李华
网站建设 2026/10/5 6:37:32

2002年Windows XP系统下载视频资源迁移云盘

【手头工具】15年前的USB2.0(内存极小,1.5G这样), 失灵的旧电脑鼠标(没错,无法新建文件夹),脱机模式无网络支持,2002年组装的台式机【拷贝内容】经典音乐 经典电影 感人…

作者头像 李华