ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

90DaysOfDevOps 第 71 天:什么是 Jenkins?——从 CI 工具定位到 Kubernetes 集群部署实战

2026/10/6 2:00:11 拓冰建站 浏览量
90DaysOfDevOps 第 71 天:什么是 Jenkins?——从 CI 工具定位到 Kubernetes 集群部署实战 文档/教程【免费下载链接】90DaysOfDevOpsThis 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 2022 年度课程 Day 71 的韩文讲义2022/ko/Days/day71.md为骨架系统讲解 Jenkins 在持续集成CI体系中的定位它为什么能取代夜间构建这种古老的代码整合方式其核心特性、流水线工作方式与七步 CI 架构是如何运作的。同时结合本仓库 2022/Days/CICD/Jenkins 目录下的 Helm 部署文件与 Jenkinsfile 示例给出在 Minikube/Kubernetes 集群中落地 Jenkins 的完整实战路径。读完本文你将理解 CI 服务器解决问题的本质并能独立完成一次代码提交 → 触发构建 → 自动化测试 → 发布部署的最小闭环演练。Jenkins 是什么持续集成CI的核心角色Jenkins 是一个持续集成工具它允许对新建代码进行持续的开发、测试和部署。通俗地说它承担了CI 服务器这一角色负责接管开发团队中最重复、最耗时的环节拉取新提交的代码、执行单元测试、构建软件产物并把结果反馈给开发者。围绕如何整合团队代码讲义对比了两种截然不同的模式模式一夜间构建Nightly Builds——传统的代码整合方式开发者在白天围绕各自任务持续开发到当天工作结束时统一把变更推送到源码仓库到了夜间系统统一运行单元测试并构建软件。这种方式把所有代码整合动作集中到一个固定时间点一旦某个开发者的提交存在问题可能要等到次日清晨才能暴露。模式二持续开发Continuous Development——更受青睐的方式开发者仍然随时向源码仓库提交变更但区别在于每当一次代码提交完成构建过程便立刻启动不再等待固定的时间窗口。讲义特别指出这种模式的价值当开发团队分布在全球各地时不可能要求所有人每天在同一时刻停止提交代码。持续集成的方式让提交即构建、随时可集成成为可能而 Jenkins 正是执行这套测试与构建流程的 CI 服务器。CI 工具生态对比为什么要关注 Jenkins讲义在聚焦 Jenkins 之前先列出同领域的其他 CI 工具帮助读者建立横向认知理解 Jenkins 在整体流行度背后的差异点工具定位与特点TravisCI托管的分布式持续集成服务主要用于构建和测试托管在 GitHub 上的软件项目Bamboo可并行运行多个构建以加速编译内置与仓库连接的能力为 Ant 和 Maven 提供构建任务Buildbot用于自动化软件构建、测试和发布流程的开源框架使用 Python 编写支持跨多平台的分布式并行执行Apache Gump专为 Java 项目设计每夜构建并测试 Java 项目确保所有项目在 API 与功能层面保持兼容在此之上Jenkins 与上述工具一样是开源的但它是一个用 Java 编写的自动化服务器通过持续集成自动化软件开发流程并为持续交付Continuous Delivery提供支撑。需要说明的是讲义中Jenkins 是最流行的属于作者个人的观察性表述作为技术文章我们只把它视为作者观点的转述而非可量化的项目事实。Jenkins 的核心特性讲义总结了 Jenkins 覆盖多个领域的五大特性这些特性共同构成了它在 CI/CD 工具链中事实标准式的基础能力简易安装Easy InstallationJenkins 是一个自包含的、基于 Java 的程序开箱即用为 Windows、macOS 和 Linux 操作系统提供安装包。简易配置Easy Configuration通过 Web 界面即可完成设置与配置界面内置错误检查与帮助提示。插件Plug-ins更新中心Update Centre提供大量插件可与 CI/CD 工具链中的众多工具集成。可扩展Extensible在现成插件之外插件架构允许对 Jenkins 进行二次扩展使其用途近乎无限。分布式DistributedJenkins 可以轻松将任务分发到多台机器上执行从而跨多个平台加速构建、测试与部署。Jenkins Pipeline从提交到发布的自动化链路Pipeline流水线这个词在讲义中被放在更广泛的语境下讨论它并不绑定于某个特定工具。在 Jenkins 的语境下其含义是开发者把代码提交给 Jenkins 后Jenkins 会构建出应用程序并跑完所有自动化测试当每个阶段都完成后再发布并部署这段代码。Jenkins 正是让这条链路全自动化的引擎。在本仓库 2022/Days/CICD/Jenkins/Pipeline 目录中就保存着一个与这条流水线配套的实战示例包含Jenkinsfile、Dockerfile与index.html我们在后文会结合它进行剖析。Jenkins 架构从代码提交到生产发布的七步流程讲义以一张架构图拆解了一次典型的 CI 闭环虽然本仓库图片列表中对应的架构图2022/Days/Images/Day71_CICD5.png在视觉上被归纳为六个核心环节但讲义文字明确给出如下七个步骤Step 1开发者将变更提交到源码仓库。Step 2Jenkins 按固定时间间隔轮询仓库拉取任何新代码。Step 3构建服务器把代码构建成可执行产物——本示例使用 Maven 作为知名构建服务器这也是需要另行学习的领域。Step 4如果构建失败反馈立即回传给开发者。Step 5Jenkins 将构建好的应用部署到测试服务器——本示例使用 Selenium 作为知名测试服务器同样值得深入学习。Step 6如果测试失败反馈传递给开发者。Step 7如果测试全部成功则可将代码发布到生产环境。讲义强调这个循环是连续的这正是应用能够在几分钟而不是几小时、几天、几个月甚至几年内完成更新的根本原因。在架构层面讲义还补充了两个值得关注的延伸点Master-Slave 能力Jenkins 的架构远比图中展示的复杂其 master-slave 机制允许主节点master把任务分发到从节点slave的 Jenkins 环境中执行这正是分布式特性的架构实现。CloudBees 企业版由于 Jenkins 是开源的大量需要商业支持的企业会选择 CloudBees——这是 Jenkins 的企业级版本为付费企业客户提供支持与其他附加功能讲义以 Bosch 作为客户案例原文附有案例 PDF此处不再输出外部链接。在 KubernetesMinikube中部署 Jenkins仓库实操讲义明确规划了后续的落地方向将 Jenkins 安装到 Minikube 集群中模拟向 Kubernetes 部署的过程。本仓库 2022/Days/CICD/Jenkins 目录完整保留了这一实践的产物包括部署步骤记录steps.md以及四个 Kubernetes/Helm 资源清单。部署步骤全览源自 steps.md2022/Days/CICD/Jenkins/steps.md 按顺序记录了完整流程核心命令如下# 1. 启动本地 Kubernetes 集群 minikube start # 2. 创建 jenkins 命名空间两种方式任选其一 kubectl create namespace jenkins # 或kubectl create -f jenkins-namespace.yml kubectl get namespaces # 3. 添加并更新 Jenkins 官方 Helm 仓库 helm repo list helm repo add jenkinsci https://charts.jenkins.io helm repo update # 4. 应用持久卷与服务账号RBAC资源 kubectl apply -f jenkins-volume.yml kubectl apply -f jenkins-sa.yml # 5. 使用 Helm 安装 Jenkins以本地 values 文件覆盖默认值 chartjenkinsci/jenkins helm install jenkins -n jenkins -f jenkins-values.yml $chart # 6. 进入 Minikube 节点修正持久卷目录属主jenkins 以 UID 1000 运行 minikube ssh sudo chown -R 1000:1000 /data/jenkins-volume # 7. 重建首个 Pod 以正常挂载权限修正后的卷 kubectl delete pod jenkins-0 -n jenkins # 8. 观察 Pod 状态直至就绪 kubectl get pods -n jenkins -w # 9. 从 Kubernetes Secret 中读取初始管理员密码 kubectl exec --namespace jenkins -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/chart-admin-password echo # 10. 端口转发并在浏览器登录 kubectl --namespace jenkins port-forward svc/jenkins 8080:8080 # 浏览器访问 http://localhost:8080登录后执行插件更新配套资源清单解读2022/Days/CICD/Jenkins/jenkins-namespace.yml定义一个名为jenkins的 Kubernetes Namespace作为所有 Jenkins 相关资源Pod、Service、PVC、Secret 等的逻辑隔离边界apiVersion: v1、kind: Namespace。2022/Days/CICD/Jenkins/jenkins-volume.yml声明一个hostPath类型的 PersistentVolume路径为/data/jenkins-volume/容量 20Gi、访问模式ReadWriteOnce、回收策略Retain、storageClassName: jenkins-pv。它对应了步骤 6 中需要在 Minikube 节点上修正属主的那个数据目录。2022/Days/CICD/Jenkins/jenkins-sa.yml依次定义 ServiceAccount、ClusterRole 与 ClusterRoleBinding。ClusterRole 授权了statefulsets、pods、pods/log、pods/exec、persistentvolumes、deployments、configmaps、secrets等资源的create/get/watch/list/patch/update/delete权限这是 Jenkins 得以在集群内动态调度 agent Pod、读写编排资源的 RBAC 基础。2022/Days/CICD/Jenkins/jenkins-values.yml官方 Helm Chart 的值覆盖文件是本次部署的配置核心几个关键段如下controller 段指定镜像jenkins/jenkinstagLabel: jdk11、runAsUser: 1000、fsGroup: 1000与步骤 6 的 chown 目标一致默认管理员用户admin密码由adminSecret: true自动生成并存入 SecretserviceType: ClusterIP、servicePort: 8080讲义与 steps.md 的场景面向 Minikube若在真实集群可按注释改用 NodePort 或 LoadBalancer。installPlugins 段预装 Kuberneteskubernetes:1.31.3、workflow-aggregator:2.6、git:4.10.2、configuration-as-code:1.55.1四个核心插件其中 kubernetes 插件正是后续 Jenkinsfile 中podTemplate动态调度 agent Pod 的基础。JCasC 段securityRealm使用本地用户并读取${chart-admin-username}/${chart-admin-password}authorizationStrategy为登录用户可执行任意操作同时关闭匿名读权限。agent 段启用jenkins/inbound-agenttag4.11.2-4作为默认 agentcontainerCap: 10限制最大并发 agent 数podRetention: Never表示构建完成后回收 Pod。persistence 段enabled: true、storageClass: jenkins-pv、accessMode: ReadWriteOnce、size: 8Gi与前面手动创建的 PV 相衔接。用 Jenkinsfile 定义流水线仓库示例剖析部署完成后如何让 Jenkins 真正执行构建 → 测试 → 发布仓库给出了一个最小可读的声明式示例 2022/Days/CICD/Jenkins/Pipeline/Jenkinsfile它的核心是 Kubernetes 插件提供的podTemplatepodTemplate(yaml: apiVersion: v1 kind: Pod spec: containers: - name: maven image: maven:3.8.1-jdk-8 command: - sleep args: - 99d - name: kaniko image: gcr.io/kaniko-project/executor:debug command: - sleep args: - 9999999 volumeMounts: - name: kaniko-secret mountPath: /kaniko/.docker restartPolicy: Never volumes: - name: kaniko-secret secret: secretName: dockercred items: - key: .dockerconfigjson path: config.json ) { node(POD_LABEL) { stage(Clone Repository) { git url: https://github.com/MichaelCade/Jenkins-HelloWorld.git, branch: main container(maven) { stage(Build Image) { sh echo Tests passed } } } stage(Test Image) { container(kaniko) { stage(Build Hello World App) { sh /kaniko/executor --context pwd --destination michaelcade1/helloworld:1.0 } } } } }这段流水线清晰地对应了讲义中的 CI 七步模型Clone Repository 阶段克隆示例代码仓库Jenkins-HelloWorldmain 分支即Step 1/2——提交与拉取代码。Build Image 阶段在maven容器内执行测试此处为占位回显echo Tests passed对应Step 3——构建服务器构建。Build Hello World App 阶段在kaniko容器内使用/kaniko/executor在 Kubernetes 集群内直接构建并推送容器镜像--destination指定目标镜像这对应Step 5 之后——产出可发布产物。值得说明的是podTemplate中的dockercred是一个名为dockercred的 Kubernetes Secret用于存放 Docker Registry 凭据items中把.dockerconfigjson映射为/kaniko/.docker/config.json实际使用前需要先在集群中创建该 Secret。配套的 2022/Days/CICD/Jenkins/Pipeline/Dockerfile 定义了最终交付物——一个基于busybox:latest的轻量静态 Web 容器通过ENV PORT8000设置监听端口把index.html放入/www/index.html最终由httpd启动一个极简 Web 服务器。它展示了构建产物 → 容器镜像 → 可部署应用的完整链路文件内的HEALTHCHECK与启动命令以.md前缀占位形式出现属于仓库中的教学示例写法实际运行时应替换为有效的 busybox 命令请以仓库原文件为准。总结与下一步Day 71 完成了 Jenkins 的概念筑基它从夜间构建的痛点出发以提交即触发的持续集成模型接管构建、测试与反馈闭环它的插件体系、分布式 master-slave 架构与开源生态使其成为 CI/CD 工具链中的关键枢纽。本仓库同时给出了从 Minikube Helm 部署到 Jenkinsfile 流水线的完整落地素材你可以沿着 steps.md 的步骤在本地复现整套环境。按课程安排后续Day 72将用一个逐步示例演示 Jenkins 的实际使用并把它与 ArgoCD、GitHub Actions 等其他工具串联起来形成完整的交付链条。在动手实践时建议重点体会两个闭环一是提交 → 构建 → 测试 → 反馈的 CI 闭环二是构建产物 → 容器镜像 → 集群内部署的交付闭环——理解了这两条链路也就理解了 Jenkins 在整个 DevOps 体系中不可替代的位置。赞分享文档/教程【免费下载链接】90DaysOfDevOpsThis 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 第 71 天什么是 JenkinsCI 服务器原理与架构拆解90DaysOfDevOps 第 71 天什么是 JenkinsCI 服务器原理与架构拆解 导读本文是 90DaysOfDevOps 学习路线图中 CI/文档/教程90DaysOfDevOps 之什么是 JenkinsCI 服务器、架构与 Kubernetes 部署实战90DaysOfDevOps 之什么是 JenkinsCI 服务器、架构与 Kubernetes 部署实战 本篇技术指南聚焦 90DaysOfDevOps 第文档/教程90DaysOfDevOps 第 51 天使用 Minikube 部署你的第一个 Kubernetes 集群90DaysOfDevOps 第 51 天使用 Minikube 部署你的第一个 Kubernetes 集群 引言 本篇是 90DaysOfDevOps 系列文档/教程上一篇Mousetrap.js内存管理大型应用中的事件解绑与资源释放下一篇cmdk社区贡献如何提交PR和报告问题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考