12、构建 Telnet - Server 应用的 CI/CD 管道

构建 Telnet - Server 应用的 CI/CD 管道

1. CI/CD 概述

在现代应用开发中,持续集成(CI)和持续部署(CD)是至关重要的软件开发方法。CI 涵盖代码和配置更改的测试与构建,CD 则实现新代码的自动化部署。

  • CI 阶段 :软件工程师通过版本控制系统(如 Git)引入新特性或修复漏洞。代码经过一系列构建和测试后,生成如容器镜像这样的工件。测试步骤通常包括单元测试、集成测试和安全扫描,确保应用按预期运行,并检查软件依赖和基础容器镜像的已知漏洞。测试通过后,新工件被构建并推送到共享仓库。
  • CD 阶段 :从仓库获取工件并部署到生产环境。常见的部署策略有金丝雀发布、滚动发布和蓝绿发布,具体如下表所示:
    | 名称 | 描述 |
    | ---- | ---- |
    | 金丝雀发布 | 仅让一小部分用户访问新代码,若无误则逐步向更多用户推广。 |
    | 蓝绿发布 | 生产服务(蓝色)处理流量,同时测试新服务(绿色)。若绿色代码运行正常,绿色服务将替换蓝色服务。 |
    | 滚动发布 | 逐个部署新代码,与生产中的现有代码并行,直至完全发布。 |

部署成功后,需进行监控,确保无问题漏过 CI 阶段。若发现问题,可轻松回滚到之前的安全版本,这是 Kubernetes 等容器编排器的优势之一。

2. 搭建管道所需工具

在创建管道前,需安装以下两个开源工具:
- Skaffold :助力 Kubernetes 原生应用的持续开发,简化向本地 k8s 集群设置 CI/CD 管道的过程。若未安装,可根据操作系统,按 此链接 的说明完成安装。
- container - structure - test :命令行应用,用于验证构建后的容器镜像结构。可通过验证特定文件是否存在、执行命令并验证输出,或检查元数据(如 Dockerfile 中的端口和环境变量)来测试镜像。安装说明见 此链接

3. 审查 skaffold.yaml 文件

skaffold.yaml 文件位于克隆仓库(https://github.com/bradleyd/devops_for_the_desperate/)的 telnet - server/ 目录下,它描述了应用的构建、测试和部署方式,重点关注三个主要部分:

kind: Config
build:
  local: {}
  artifacts:
  - image: dftd/telnet-server
test:
- image: dftd/telnet-server
  custom:
  - command: go test ./... -v
  structureTests:
  - ./container-tests/command-and-metadata-test.yaml
deploy:
  kubectl:
    manifests:
    - kubernetes/*
  • build 部分 :使用默认的 docker build 命令在本地创建容器镜像,镜像名为 dftd/telnet - server。Skaffold 会根据当前 Git 提交哈希预计算容器镜像标签,并自动追加到镜像名后,还会将其设置为环境变量 $IMAGE
  • test 部分 :可对应用和容器镜像运行测试。这里使用为 telnet - server 应用提供的单元测试,通过 go test 命令运行所有测试文件,此步骤需要安装 Go 语言。若未安装,可按 此链接 的说明进行安装。此外,还会运行 structureTests 检查最终容器镜像的缺陷。
  • deploy 部分 :使用 kubernetes/ 目录下的 Kubernetes 清单文件部署 telnet - server 应用。Skaffold 会对正在运行的部署进行补丁操作,用新生成的容器镜像和标签替换当前的。
4. 审查容器测试

容器测试位于 telnet - server/ 目录下的 container - tests/ 子目录中,包含一个测试文件 command - and - metadata - test.yaml。

commandTests:
  - name: "telnet-server"
    command: "./telnet-server"
    args: ["-i"]
    expectedOutput: ["telnet port :2323\nMetrics Port: :9000"]
metadataTest:
  env:
    - key: TELNET_PORT
      value: 2323
    - key: METRIC_PORT
      value: 9000
  cmd: ["./telnet-server"]
  workdir: "/app
  • commandTests :执行 telnet - server 二进制文件,传递 -i 标志输出应用监听的端口。输出应与 expectedOutput 匹配,以确保二进制文件在容器构建阶段编译正确。
  • metadataTest :检查容器镜像是否按照 Dockerfile 中的预期指令构建,验证环境变量、命令和工作目录。
5. 模拟开发管道

可使用 skaffold 命令的 run dev 子命令启动管道。
- run 子命令:一次性构建、测试和部署应用后退出,不监控代码更改。
- dev 命令:执行 run 的所有操作,并监控源文件的更改。一旦检测到更改,将触发 skaffold.yaml 文件中描述的构建、测试和部署步骤。

为模拟开发管道,使用 dev 子命令,并添加 --cleanup=false 标志,避免退出时清理 telnet - server 部署和服务。在 telnet - server/ 目录下,且 Kubernetes 集群运行时,执行以下命令:

$ skaffold dev --cleanup=false

命令执行过程如下:
1. 设置容器标签,构建 Docker 镜像。
2. 触发测试部分,运行单元测试和容器基础设施测试。
3. 若所有测试通过,尝试将容器部署到 Kubernetes。

若容器镜像和标签已存在,Skaffold 将跳过构建和测试部分,直接进入部署步骤。若仓库有未提交的更改,标签后会添加 -dirty 标识。

graph LR
    A[开始] --> B[设置容器标签]
    B --> C[构建 Docker 镜像]
    C --> D[触发测试]
    D --> E{测试是否通过}
    E -- 是 --> F[部署到 Kubernetes]
    E -- 否 --> G[报错]
    F --> H[监控]
    G --> I[排查问题]
    I --> B
6. 进行代码更改

管道设置完成后,可进行代码更改以测试工作流。例如,更改连接到 telnet - server 时显示的 DFTD 横幅颜色。
1. 在运行 skaffold dev 命令的不同终端中,使用编辑器打开 telnet/ 子目录下的 banner.go 文件。
2. 在第 26 行,将 colorGreen 替换为 colorYellow

// 原代码
return fmt.Sprintf("%s%s%s", colorGreen, b, colorReset)
// 修改后
return fmt.Sprintf("%s%s%s", colorYellow, b, colorReset)
  1. 保存并关闭文件。回到运行 skaffold dev 命令的终端,应看到类似首次运行的输出,所有步骤将再次触发。
7. 测试代码更改

为确保新代码已部署到 Kubernetes 集群,需验证 DFTD 横幅颜色是否从绿色变为黄色。
1. 若 minikube tunnel 命令未运行,在新终端中运行该命令。
2. 获取 telnet - server 服务的 IP 地址:

$ minikube kubectl -- get services telnet-server
  1. 使用 telnet 客户端命令访问应用:
$ telnet <EXTERNAL - IP> 2323

若横幅颜色未变为黄色,需检查代码更改是否正确保存,并查看 skaffold dev 命令的输出以排查错误。

构建 Telnet - Server 应用的 CI/CD 管道

8. 部署策略的深入理解

在前面提到了三种常见的部署策略:金丝雀、滚动和蓝绿,下面进一步详细了解它们的优缺点和适用场景。

部署策略 优点 缺点 适用场景
金丝雀 - 能以最小风险测试新代码,仅影响少量用户。
- 可快速收集反馈,若有问题能及时停止推广。
- 推广过程相对较慢,需要多次验证。
- 对监控系统要求较高,需精准捕捉少量用户的问题。
- 新功能发布初期,不确定是否稳定时。
- 对用户体验要求高,不希望大量用户受影响的情况。
滚动 - 部署过程平滑,对现有服务影响小。
- 可逐步替换旧版本,降低风险。
- 部署时间相对较长。
- 若新版本有问题,可能已影响部分用户。
- 对服务可用性要求高,不能长时间中断的场景。
- 代码更新频繁,但每次更改较小的情况。
蓝绿 - 切换迅速,可快速回滚。
- 测试环境与生产环境完全一致,测试结果更可靠。
- 需要双倍资源,成本较高。
- 切换过程中可能出现短暂服务中断。
- 对系统稳定性要求极高,需要严格测试的重大版本更新。
- 对服务中断时间有严格限制的场景。
9. 监控与回滚机制

部署成功后,监控是确保系统稳定运行的关键环节。Kubernetes 提供了丰富的监控工具,如 Prometheus 和 Grafana 等。通过监控指标,如响应时间、错误率、资源利用率等,可以及时发现潜在问题。

当监控到异常情况,如高延迟、错误率突然增加等,需要及时进行回滚操作。Kubernetes 使得回滚操作变得简单,只需要将部署的容器镜像和标签切换回之前的安全版本即可。以下是一个简单的回滚命令示例:

$ kubectl rollout undo deployment/telnet-server
graph LR
    A[部署成功] --> B[监控指标]
    B --> C{指标是否正常}
    C -- 是 --> D[继续运行]
    C -- 否 --> E[触发回滚]
    E --> F[切换镜像和标签]
    F --> G[验证回滚结果]
    G --> H{回滚是否成功}
    H -- 是 --> D
    H -- 否 --> I[排查回滚问题]
    I --> E
10. 持续集成与持续部署的最佳实践

为了确保 CI/CD 管道的高效运行,以下是一些最佳实践:
- 自动化测试 :编写全面的单元测试、集成测试和安全扫描,确保代码质量。测试应覆盖各种边界情况,减少潜在的错误。
- 版本控制 :使用 Git 等版本控制系统,确保代码的可追溯性和协作性。遵循良好的分支管理策略,如 GitFlow 或 GitHub Flow。
- 环境一致性 :确保开发、测试和生产环境的一致性,避免“在我机器上能运行”的问题。可以使用容器化技术,如 Docker,来保证环境的一致性。
- 监控与日志 :建立完善的监控和日志系统,及时发现和解决问题。监控指标应包括性能指标、业务指标等,日志应详细记录系统的运行状态。
- 自动化部署 :使用自动化工具,如 Skaffold,减少人工干预,提高部署效率和准确性。

11. 总结与展望

通过搭建 Telnet - Server 应用的 CI/CD 管道,我们了解了持续集成和持续部署的基本概念和操作步骤。CI/CD 不仅提高了软件开发的效率和质量,还降低了部署风险,使得开发团队能够更快地响应市场需求。

在未来的开发中,可以进一步优化 CI/CD 管道,如引入更多的自动化测试工具、优化部署策略、加强监控和日志系统等。同时,随着技术的不断发展,如人工智能和机器学习的应用,CI/CD 也将迎来更多的创新和变革。

希望本文能帮助你更好地理解和应用 CI/CD 技术,提升软件开发的能力和水平。

graph LR
    A[开始 CI/CD 之旅] --> B[搭建管道]
    B --> C[代码更改与测试]
    C --> D[部署与监控]
    D --> E[优化与创新]
    E --> F[持续改进]
    F --> G[实现高效开发]
本系统旨在构建一套面向高等院校的综合性教务管理平台,涵盖学生、教师及教务处三个核心角色的业务需求。系统设计着重于实现教学流程的规范化与数据处理的自动化,以提升日常教学管理工作的效率与准确性。 在面向学生的功能模块中,系统提供了课程选修服务,学生可依据培养方案选择相应课程,并生成个人专属的课表。成绩查询功能支持学生查阅个人各科目成绩,同时系统可自动计算并展示该课程的全班最高分、平均分、最低分以及学生在班级内的成绩排名。 教师端功能主要围绕课程与成绩管理展开。教师可发起课程设置申请,提交包括课程编码、课程名称、学分学时、课程概述在内的新课程信息,亦可对已开设课程的信息进行更新或撤销。在课程管理方面,教师具备录入所授课程期末考试成绩的权限,并可导出选修该课程的学生名单。 教务处作为管理中枢,拥有课程审批与教学统筹两大核心职能。课程设置审批模块负责处理教师提交的课程申请,管理员可根据教学计划与资源情况进行审核批复。教学安排模块则负责全局管控,包括管理所有学生的选课最终结果、生成包含学号、姓名、课程及成绩的正式成绩单,并能基于选课与成绩数据,统计各门课程的实际选课人数、最高分、最低分、平均分以及成绩合格的学生数量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值