ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

90DaysOfDevOps 全景篇:CI/CD 管道 — 持续集成与持续部署的完整实践指南

90DaysOfDevOps 全景篇:CI/CD 管道 — 持续集成与持续部署的完整实践指南 文档/教程【免费下载链接】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 挑战 Day 70 的技术解读围绕现代 DevOps 环境的支柱——CI/CD持续集成/持续部署管道展开从软件开发生命周期SDLC的无限循环讲起深入 CI 的自动化构建与测试、CD 的环境部署与制品交付并结合本仓库中真实的 Jenkins Helm 部署清单、Kubernetes 权限配置与声明式 Jenkinsfile 流水线给出可落地、可复现的实践路径。为什么说 CI/CD 是现代 DevOps 环境的支柱CI/CDContinuous Integration / Continuous Deployment管道通过自动化应用的构建Build、测试Test与部署Deploy从根本上弥合了开发Dev与运维Ops之间的鸿沟。正如本仓库 Day 70 英文原稿 与 韩文翻译版 所强调的这不是一个可选项而是现代 DevOps 环境的支柱backbone。快速高效地交付软件把从代码提交到生产上线的过程压缩到分钟级甚至秒级。加速产品上市通过有效的流程让应用以最快速度触达市场。持续交付增量价值无需等待数月甚至数年的版本发布周期缺陷修复和新功能可以像流水线一样源源不断地流出。它的核心价值在于让开发者能够频繁地做出小而关键small impactful changes的变更从而获得更快的修复速度和更高的功能产出速度。软件开发生命周期SDLC永不停歇的无限循环在深入 CI/CD 之前先回到 DevOps 的理论基础。本仓库在 Day 5 的 DevOps 理论讲解 中已经系统性地介绍了这些概念Day 70 则站在更深入学习的视角重新强调 SDLC 中与 CI/CD 直接相关的关键环节。软件开发生命周期Software Development Life Cycle, SDLC是一个永远重复的循环因此通常被画在无限循环infinity loop中代码Code开发者编写代码构建Build代码被编译、整合在一起测试Test对代码进行缺陷检测部署Deploy/ 运营Operate发布到生产环境供终端用户或客户使用监控Monitor收集反馈与运行指标计划Plan围绕反馈规划改进然后冲洗、重复rinse and repeat。CI 与 CD 恰好覆盖了这个循环中最容易出错的三个环节——构建、测试与部署并把它们从人工操作变成自动触发的流水线。深入 CI持续集成的原理与工作流持续集成的定义持续集成Continuous Integration是一种现代软件开发实践要求开发者每天多次将代码变更集成integrate到一个共享仓库中。其核心逻辑是增量式代码变更频率更高、更可靠由 CI 触发的自动化构建与测试工作流步骤确保合并进仓库的代码变更是可信赖的。代码编写完成并 push 到 GitHub 或 GitLab 这样的代码仓库之后魔法便开始了自动化构建对代码进行验证让团队或项目所有者尽早发现问题。三类核心自动化测试代码被分析后会接受一系列自动化测试其中最常见的三类是测试类型作用单元测试Unit Testing测试源代码的单个独立单元函数、方法、模块验证测试Validation Testing确认软件满足或适配预期用途格式测试Format Testing检查语法及其它格式错误测试以 Workflow 形式存在随 push 触发这些测试被组织成Workflow并配置为每次向 master 分支 push 时自动执行。这也是为什么几乎所有主流开发团队都会搭建某种形式的 CI/CD workflow——因为在全球化协作的开发团队里来自不同时区、不同项目的开发者随时都可能提交新代码构建一套自动化测试工作流、在代码被接受之前确保所有人都在同一页面上远比每次由人工执行高效得多。测试全部通过并成功后就可以将代码编译并推送到制品仓库——例如 Docker Hub。这个制品仓库中的镜像将在后续 CD 阶段被消费和部署可以看到CI 阶段本身与软件开发的日常节奏高度一致创建应用、添加/修复缺陷、更新源代码管理、做版本管理同时持续测试。一个值得关注的行业趋势原作者在文档中特别指出一个趋势越来越多的商业软件off-the-shelf software开始以制品形式交付。比如从 Oracle、Microsoft 等供应商获取软件时很可能是从 Docker Hub 类型的制品仓库中消费镜像然后再用自己的 CD 管道把这些软件部署到自身环境中。这意味着 CD 能力将逐渐成为每个团队的基础设施级能力。深入 CD持续部署与环境的制品交付持续部署的定义当 CI 阶段产出了测试通过的代码版本就进入持续部署Continuous DeploymentCD阶段把代码发布到目标环境。这里的环境不仅指生产环境通常还包括**暂存staging**等其它环境。软件供应商会完整走通这个阶段而原作者相信未来我们所有人都将以这种方式部署所需的商业软件——即从制品仓库消费镜像再通过 CD 管道投放至自己的环境。CD 的关键正确代码 正确配置 → 正确环境在软件部署的第一天v1 首版下一步要确保的是把正确的代码基座code base拉取到正确的环境。制品可能来自软件仓库如 Docker Hub——拉取最新发布版本与此同时还很可能从另一个代码仓库Git 仓库拉取应用配置这些工作由CD 工具统一执行把所有内容推送到目标环境。需要特别强调的是软件与配置的部署通常不会同时进行。更常见的做法是先进入暂存环境携带新配置运行验证一切正确这一步可以是人工测试步骤也可以再次自动化推荐自动化验证通过后才允许代码被部署到生产环境。当应用发布v2时流程重复将应用 配置部署到暂存确认无误再部署到生产。这种暂存先行、生产随后的分阶段推进是降低发布风险的核心手段。为什么必须使用 CI/CD自动化与小问题的早期拦截CI/CD 的价值在于把原本必须手动完成的工作自动化并在小问题悄悄溜进主代码库之前将其拦截。可以想象如果把坏代码直接推到客户面前后果将不堪设想。防止技术债Technical DebtCI/CD 还有助于防止技术债的累积。技术债的概念是主代码仓库会随时间不断被构建叠加第一天采取的捷径式修复几年后会变成指数级昂贵的修复——因为当初那块创可贴式的修复已经深深地交织、烘焙进所有代码库与业务逻辑之中。持续集成让每次变更都被即时验证避免坏味道长期潜伏在代码库深处。工具选型Jenkins、ArgoCD 与 GitHub Actions进入实战环节前先明确一个关键认知并非所有工具都必须同时承担 CI 与 CD 两种职责。Jenkins成熟的 CI/CD 平台可跨多种平台工作既能做 CI 也能做 CDArgoCD专注于CD 元素尤其擅长把软件部署到Kubernetes 集群是 GitOps 理念的代表实现GitHub Actions与 GitHub 仓库深度集成的自动化工作流平台workflow 以 YAML 文件即代码形式存在。原文档在资料Resources一节为以上三款工具附有一批官方文档与入门视频资源可直接在仓库的 day70.md英文版见 day70.md中查看。实战佐证 1用 Helm 在 Kubernetes 上部署 Jenkins本仓库的 2022/Days/CICD/Jenkins/ 目录保存了 Day 71 起 Jenkins 实战的完整部署材料其中 steps.md 记录了端到端部署步骤。下面结合仓库中的真实清单文件逐段讲解第一步准备本地 Kubernetes 环境与命名空间minikube start kubectl create namespace jenkins # 或者使用仓库中的声明式清单 kubectl create -f 2022/Days/CICD/Jenkins/jenkins-namespace.yml kubectl get namespacesjenkins-namespace.yml 非常简单只声明了一个名为jenkins的 Namespace作为 Jenkins 控制器的隔离空间。第二步添加官方 Helm 仓库helm repo list helm repo add jenkinsci https://charts.jenkins.io helm repo update第三步创建持久卷PV与 ServiceAccountRBACkubectl apply -f 2022/Days/CICD/Jenkins/jenkins-volume.yml kubectl apply -f 2022/Days/CICD/Jenkins/jenkins-sa.ymljenkins-volume.yml 定义了一个hostPath类型的 PersistentVolumestorageClassName: jenkins-pv与 Helm values 中persistence.storageClass对应capacity.storage: 20Gi分配 20Gi 容量accessModes: ReadWriteOnce单节点读写persistentVolumeReclaimPolicy: RetainPV 释放后保留数据防止误删 Jenkins 数据hostPath.path: /data/jenkins-volume/宿主机上的数据落盘目录。jenkins-sa.yml 则一次性创建了三个 RBAC 对象ServiceAccountjenkins位于 jenkins 命名空间供 Jenkins 控制器 Pod 使用ClusterRolejenkins授予对statefulsets、services、replicasets、pods、pods/log、pods/exec、persistentvolumes、persistentvolumeclaims、deployments、configmaps、secrets、events等资源执行create/get/watch/delete/list/patch/update的权限也覆盖nodes的读取类权限——这是 Jenkins 以 Kubernetes 为云cloud动态调度代理 Pod 的基础ClusterRoleBindingjenkins将上述 ClusterRole 绑定到system:serviceaccounts:jenkins组使 jenkins 命名空间下的所有 ServiceAccount 都具备该权限。第四步通过 Helm 安装 Jenkins 控制器chartjenkinsci/jenkins helm install jenkins -n jenkins -f 2022/Days/CICD/Jenkins/jenkins-values.yml $chartjenkins-values.yml 是本次安装的核心配置几个关键项值得展开controller.image: jenkins/jenkinstagLabel: jdk11使用官方镜像的 jdk11 变体adminUser: adminadminSecret: true启用 Chart 内置管理员账户初始密码由 Helm 自动生成见下文获取方式servicePort: 8080serviceType: ClusterIP控制器服务端口minikube 环境可改用 NodePort生产环境可用 LoadBalancer 或配合 IngresshealthProbes: true启用 startup/liveness/readiness 三类探针对/login端点做 HTTP 探测配合failureThreshold、periodSeconds等参数保障控制器在插件重启等场景下的健康恢复installPlugins预装四个关键插件——kubernetes:1.31.3Kubernetes 云/动态代理、workflow-aggregator:2.6Pipeline 流水线、git:4.10.2Git 源码管理、configuration-as-code:1.55.1JCasC 配置即代码JCasC.securityRealm以配置即代码方式声明本地安全域使用${chart-admin-username}/${chart-admin-password}占位符注入管理员凭据并设置allowsSignup: false禁止匿名注册、enableCaptcha: falseauthorizationStrategy采用loggedInUsersCanDoAnything登录用户可操作、禁止匿名读取agent默认代理镜像jenkins/inbound-agent:4.11.2-4containerCap: 10限制最多并发 10 个代理 PodpodRetention: Never表示构建完成后立即回收代理 Podpersistence.enabled: truestorageClass: jenkins-pvsize: 8Gi控制器数据持久化到前述 PV 对应的存储类。第五步修正 PV 目录权限并重启控制器minikube ssh sudo chown -R 1000:1000 /data/jenkins-volume kubectl delete pod jenkins-0 -n jenkins kubectl get pods -n jenkins -wJenkins 官方镜像以 UID1000jenkins 用户运行而hostPath卷的宿主机目录默认属主可能是 root因此需要将/data/jenkins-volume递归授权给1000:1000随后删除jenkins-0Pod 让其以正确权限重建。第六步获取管理员密码并登录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用admin与上面取出的密码登录然后执行插件更新即可开始使用。实战佐证 2声明式 Jenkinsfile —— 容器化流水线的完整结构仓库中的 Pipeline/Jenkinsfile 展示了一条完整的声明式DeclarativePipeline是CI 验证 → 镜像构建 → 镜像推送这条自动化链路的直接落地podTemplate用内联 YAML 定义一个一次性运行 Pod包含两个容器——maven:3.8.1-jdk-8构建/测试容器sleep 99d保持存活和gcr.io/kaniko-project/executor:debug镜像构建容器挂载名为kaniko-secret的 Secret 到/kaniko/.docker即把 Docker 凭据以config.json形式提供给 kaniko 使用stage(Clone Repository)在流水线节点上git clone示例应用仓库的main分支对应源码托管仓库中的 HelloWorld 演示项目stage(Build Image)进入maven容器执行构建示例中以echo Tests passed模拟测试通过的验证步骤stage(Test Image)进入kaniko容器执行/kaniko/executor --context \pwd --destination 镜像名: 在无需 Docker Daemon 的情况下完成镜像构建并推送到制品仓库——这正是文档中所描述的测试通过后编译并推送制品仓库的真实实现。配套的 Pipeline/Dockerfile 则是最小可运行应用的构建配方FROM busybox:latest ENV PORT8000 ADD index.html /www/index.html # 健康检查原文指令需结合具体环境修正后使用 HEALTHCHECK nc -z localhost $PORT # 启动内置 httpd监听 $PORT服务 /www 目录直至容器被停止 echo httpd started trap exit 0; TERM INT; httpd -v -p $PORT -h /www -f wait该镜像将index.html放入/www用 busybox 内置的httpd启动一个静态 Web 服务——这正是 CD 阶段将要被拉取、部署到目标环境的最小制品样本。小结与下一步Day 70 从理论到工具为 CI/CD 画出了一张完整的全景图CI 负责把每天多次的代码集成变成自动化的构建与测试CD 负责把测试通过的制品连同配置安全地推进到暂存与生产环境而自动化带来的即时反馈与对技术债的遏制是这套体系长期运转的根本动力。在工具层面本仓库已经为接下来的动手环节准备好了完整的 Jenkins 落地素材CICD 目录后续将依次深入 Jenkins 的更多细节、ArgoCD 在 Kubernetes 上的 GitOps 式持续部署以及 GitHub Actions 的 workflow 编写。下一站是 Day 71。赞分享文档/教程【免费下载链接】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 第 70 天CI/CD 流水线全景——从持续集成到持续部署的完整认知90DaysOfDevOps 第 70 天CI/CD 流水线全景——从持续集成到持续部署的完整认知 导读本文是 90DaysOfDevOps 挑战计划中第文档/教程90DaysOfDevOpsCI/CD 管道全景——从持续集成到持续部署的完整闭环90DaysOfDevOpsCI/CD 管道全景——从持续集成到持续部署的完整闭环 导读 本文是 90DaysOfDevOps 挑战第 70 天的核心内容文档/教程Materialize持续集成/持续部署(CI/CD)实践Materialize持续集成/持续部署 CI/CD 实践 你是否还在为前端框架的测试部署流程繁琐而烦恼Materialize作为基于Google Mater前端UI组件设计系统上一篇PHPStan 错误标识 new.trait 全解析为什么不能 new 一个 Trait以及如何修复下一篇Hive 多智能体生产运行时Multi-Agent Harness完整指南Colony 集群模型、Queen/Worker 架构与零配置快速上手创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表