前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CI/CD 改进方案设计

CI/CD 改进方案设计

原创
作者头像
行者深蓝
修改2024-03-12 20:37:49
2410
修改2024-03-12 20:37:49
举报
文章被收录于专栏:云原生应用工坊

在面对不同环境(例如虚拟机、容器、集群)时,选择适合的 CI/CD 工作流程是至关重要的。以下是针对不同环境的一些常见的 CI/CD 工作流程选择:

  • 虚拟机环境(VM Environment):

使用 Jenkins 等 CI 工具结合 Ansible 或其他配置管理工具,通过 Jenkinsfile 或类似的配置文件来定义工作流程。这种方式适合于需要在虚拟机上执行复杂部署和配置任务的情况。

  • 容器环境(Container Environment):

使用 GitOps 工具(如 Argo CD)结合 Kubernetes,将应用程序的部署和配置管理交给 Git 仓库和 Kubernetes 来管理。这种方式适合于基于容器的应用程序,可以实现自动化部署和版本控制。

容器集群环境(Container Cluster Environment):

使用 CI 工具(如 Jenkins、GitLab CI)结合 Helm 和 Kubernetes,通过 Helm charts 来定义和管理应用程序的部署。这种方式适合于在容器集群中部署和管理多个微服务应用程序。

通用选择原则:

  • 对于简单的部署需求,可以选择轻量级的 CI 工具(如 GitHub Actions、GitLab CI)结合简单的部署脚本或命令来实现。 0 对于复杂的部署需求,可以选择功能更强大的 CI 工具(如 Jenkins)结合配置管理工具(如 Ansible、Chef、Puppet)来实现。
  • 在选择 CI/CD 工作流程时,需要考虑到实际的部署需求、团队的技术栈和经验水平,以及工具的易用性和可维护性等因素。

使用 GitOps 改进 CI/CD 可以显著降低部署的时间和资源消耗,并提高发布频率和系统稳定性。这主要是通过以下方式实现的:

自动化部署和回滚: GitOps 将应用程序的部署和配置管理集中到 Git 仓库中,利用版本控制和自动化流程实现自动部署和回滚。这减少了手动操作的需要,提高了部署的速度和准确性。

基础设施即代码: GitOps 将基础设施的配置也纳入到 Git 仓库管理,通过 CI/CD 流水线自动化基础设施的创建和更新。这样可以确保环境的一致性,避免手动配置错误。

增量部署和蓝绿部署: GitOps 支持增量部署和蓝绿部署等部署策略,可以在不中断服务的情况下发布新版本,降低发布风险,提高发布频率。

资源利用率提高: GitOps 通过精细的资源管理和自动化流程,提高了资源的利用率,减少了资源的浪费。

频繁发布和快速反馈: 结合流水线的 CI/CD 和 GitOps 可以实现频繁的发布和快速的反馈循环,加速功能的交付和修复。

基于流水线的 CI/CD 和 GitOps 结合的方式如下:

CI/CD 流水线触发 GitOps 流程: CI/CD 流水线负责构建、测试和打包应用程序,并将构建好的应用程序镜像和配置文件推送到镜像仓库和 Git 仓库。GitOps 控制器监听 Git 仓库的变化,一旦检测到变化,就会自动触发部署流程。

流水线中集成 GitOps 工具: 在 CI/CD 流水线中集成 GitOps 工具,如 Argo CD,可以直接通过流水线触发部署流程,实现自动化的部署和配置管理。

使用 GitOps 管理流水线配置: 将流水线的配置也纳入到 Git 仓库管理,利用 GitOps 的自动化流程管理流水线的配置,实现流水线的版本控制和自动化更新。

综上所述,通过结合流水线的 CI/CD 和 GitOps,可以实现更加高效、稳定和可靠的软件交付流程,降低部署的时间和资源消耗,提高发布频率和系统的可靠性。

1. 环境支持

  • K8s 环境: 使用 helmfile 部署应用程序。
  • VM 环境: 使用 Ansible playbook 部署应用程序。

2. CI 工具

  • GitHub Actions 和 Jenkins 用于实现 CI 流程。

3. CD 工具

  • GitHub Actions 和 Jenkins 用于实现 CD 流程。

4. CI 阶段检查

  1. 代码检查 (code lint & code sec check): 使用适合项目的代码静态分析工具进行代码规范和安全检查。
  2. 构建镜像 (build image): 将应用程序打包成容器镜像以供部署使用。
  3. 构建图表 (build chart): 使用 helmfile 构建 K8s 应用程序的 Helm 图表。
  4. 单元测试 (unit test): 运行应用程序的单元测试,确保基本功能正常。
  5. 集成测试 (integration test): 运行应用程序的集成测试,确保组件之间的交互正常。

5. CD 阶段检查

  1. 部署配置检查: 检查部署配置文件是否正确。
  2. 部署状态检查: 检查部署是否成功完成。
  3. 运行状态检查: 检查应用程序在部署环境中的运行状态。
  4. 监控配置项目检查: 检查监控配置是否正确,包括资源监控、日志监控和业务监控覆盖。
  5. 备份/回滚检查: 检查备份和回滚机制是否正常工作。

6. 分支模型和 Docker 镜像标签策略

  • 非主分支无 tag 构建的镜像标签: dev + git commit_id_前7位 + build num。
  • 非主分支 + tag 构建的镜像标签: stage + git commit_id_前7位 + build num。
  • 主分支 + cannary 构建的镜像标签: cannary + git commit_id_前7位 + build num。
  • 主分支 + V_Release_ID 构建的镜像标签: V_Release_ID + build num。

阶段

Checkpoint 阶段

Build 阶段

Test 阶段

交付阶段

监控阶段

使用情况

检查代码库状态、是否有新提交

编译代码、构建镜像

执行各种测试

部署应用程序、发布新版本

监控应用程序运行状态、收集指标数据

示例 Job

Checkout

Build

Test

Deploy

Monitor

Job 实例

Git checkout

Docker build

Unit tests

Kubernetes deployment

Prometheus metrics collection

实际命令

git checkout

docker build

npm test

kubectl apply

Prometheus exporter

工具/插件

Git plugin

Docker plugin

Test framework

Kubernetes plugin

Prometheus plugin

7. GitOps Workflow 分支示意图

  • 初始化阶段 (Init stage): 包括代码提交、PR、CI 作业和 CD 作业。
  • 循环阶段 (Loop stage): 持续处理代码提交、PR、CI 作业和 GitOps 配置同步。

PlantUML 绘制的 GitOps Workflow 分支示意图,包括初始化阶段和循环阶段:

plantuml

Copy code

@startuml

title GitOps Workflow 分支示意图

* --> Init

Init --> CodeCommit : 提交代码

CodeCommit --> PR : 创建 PR

PR --> CIJob : 运行 CI 作业

CIJob --> CDJob : 运行 CD 作业

CDJob --> ArgoCD : 初始化 ArgoCD CRD for APP

ArgoCD --> *

state Loop {

* --> CodeCommitLoop : 提交代码

CodeCommitLoop --> PRLoop : 创建 PR

PRLoop --> CIJobLoop : 运行 CI 作业

CIJobLoop --> GitOpsConfigRepo : 更新 GitOps 配置

GitOpsConfigRepo --> ArgoCD : 同步配置

ArgoCD --> CodeCommitLoop

}

Init --> Loop : 进入循环阶段

Loop --> Loop : 持续处理代码提交、PR、CI 作业和 GitOps 配置同步

@enduml

这个图表描述了 GitOps Workflow 的两个阶段:初始化阶段和循环阶段。在初始化阶段,包括代码提交、PR、CI 作业和 CD 作业。在循环阶段,持续处理代码提交、PR、CI 作业和 GitOps 配置同步。

8. CI Runner 镜像

  • 为不同任务 (代码检查、测试、构建镜像/图表、运行 Ansible) 使用特定的 CI Runner 镜像,以提高效率和可靠性。

这个设计提供了一个全面的框架,但具体的实现细节和工具选择应根据您的项目需求和环境来确定。

使用 PlantUML 绘制的 GitHub 分支模型图表:

代码语言:javascript
复制
plantumlCopy code@startuml
title GitHub 分支模型

[*] --> NonMaster : 非主分支
NonMaster --> NonMasterNoTag : 无 tag 构建的镜像
NonMasterNoTag --> dev : dev + commit_id_前7位 + build num

NonMaster --> NonMasterWithTag : 有 tag 构建的镜像
NonMasterWithTag --> stage : stage + commit_id_前7位 + build num

[*] --> Master : 主分支
Master --> Cannary : cannary 构建的镜像
Cannary --> VRelease : V_Release_ID + build num

@enduml

这个图表描述了 GitHub 分支模型,包括非主分支和主分支的不同情况下镜像标签的命名方式。

CI Runner Image 容器化原因和通用设计

容器化原因

环境隔离和一致性: 使用容器可以确保每个 CI runner 都在相同的环境中运行,避免了因为环境差异导致的问题。

易于管理和部署: 容器化使得 CI runner 的管理和部署变得更加简单和灵活,可以轻松地扩展或更新 runner。

资源隔离和利用率提高: 每个容器化的 CI runner 可以独立分配资源,提高资源的利用率并避免资源争夺。

通用设计

基于 Alpine 镜像: 使用 Alpine Linux 作为基础镜像,因为它轻量且安全,适合作为 CI runner 的基础环境。

模块化设计: 每个 CI runner 镜像应该尽量保持单一职责,例如一个镜像只负责代码 lint,另一个负责构建镜像等,以便于维护和更新。

灵活性和可配置性: 可以通过环境变量或配置文件来配置 CI runner 的行为,以适应不同的项目需求和环境。

日志和监控: 需要将 CI runner 的日志和监控集成到整个 CI/CD 系统中,以便实时监控和诊断问题。

GitHub Actions Workflows

workflows-call-build-image.yaml: 用于构建镜像的工作流程。可能包括从源代码中构建镜像并将其推送到容器仓库。

workflows-call-build-charts.yaml: 用于构建图表的工作流程。可能包括使用 Helm 构建 Kubernetes 应用程序的 Helm 图表。

workflows-call-deploy-charts.yaml: 用于部署图表的工作流程。可能包括将构建好的 Helm 图表部署到 Kubernetes 集群。

workflows-call-setup-gitops.yaml: 用于设置 GitOps 的工作流程。可能包括配置 GitOps 工具,如 Argo CD,以管理应用程序的部署。

workflows-call-run-chaos-mesh.yaml: 用于运行 Chaos Mesh 的工作流程。可能包括在 Kubernetes 集群中引入故障,并验证应用程序的可靠性和弹性。

Jenkinsfile

workflows-call-run-ansible.yaml: 用于在虚拟机中运行 Ansible 的工作流程。可能包括使用 Ansible 自动化配置和管理虚拟机环境。

这些设计原则和工作流程可以帮助您构建更加灵活和可靠的 CI/CD 系统,提高开发和部署的效率和质量。

CI/CD Workflow Pipeline (CI/CD 工作流程管道)

GitHub Actions 工作流程文件 (GitHub Actions Workflow Files)

  1. workflows-call-build-image.yaml: 构建镜像的工作流程。
  2. workflows-call-build-charts.yaml: 构建图表的工作流程。
  3. workflows-call-deploy-charts.yaml: 部署图表的工作流程。
  4. workflows-call-setup-gitops.yaml: 设置 GitOps 的工作流程。
  5. workflows-call-run-chaos-mesh.yaml: 运行 Chaos Mesh 的工作流程。

Jenkinsfile

  1. workflows-call-run-ansible.yaml: 用于在虚拟机中运行 Ansible 的工作流程。

CI Runner Images (CI 运行器镜像)

CI Runner Image

描述

alpine-code-lint/Dockerfile

用于代码检查

alpine-test-tools/Dockerfile

用于测试代码和构建产物

alpine-image-builder/Dockerfile

用于构建 K8s/APP 镜像

alpine-chart-builder/Dockerfile

用于构建 K8s/APP 图表

alpine-ansible-runner/Dockerfile

用于在虚拟机中运行 Ansible

这些翻译将您提供的详细信息转换为中文,以便更好地理解 CI/CD 工作流程和 CI 运行器镜像。

编写一个 CICD improve 方案包括一下要点:

  1. 需要支持 k8s 环境容器应用,使用helmfile 部署应用
  2. 需要支持 VM 环境 应用,使用 ansible playbook部署应用
  3. 需要支持Pipeline Github Action,Jenkinsfile

| ENV | method | CI | CD |

| K8s-Stage | helmfile | Github Action | Github Action |

| K8s-Prod | helmfile | Github Action | Jenkinsfile |

| VM-Prod | ansible playbook | Github Action | Jenkinsfile |

列举下 CI 可能包含的check 阶段

  1. code lint & code sec check
  2. build image
  3. build chart
  4. 单元测试 5 集成测试

CD 可能包含的check 阶段

  1. 部署配置检查
  2. 部署状态
  3. 运行状态
  4. 监控配置项目检查(资源监控 日志监控,业务监控覆盖)
  5. 备份/回滚检查

提供下github branch 分支模型

  1. 非主分支 无tag 构建的镜像tag: dev+git commit_id_前7位+ build num
  2. 非主分支 + tag PickUp branch 构建的镜像tag: stage+git commit_id_前7位+ build num
  3. 主分支 + cannary 构建的镜像tag: cannary +git commit_id_前7位+ build num
  4. 主分支 + V_Realse_ID 构建的镜像 tag:V_Realse_ID+build num

基于GitOPS 的workflow 分支示意图:

  1. Init stage: code commit -> PR -> CI Jobs -> CD job -> Init ArgoCD CRD for APP
  2. Loop stage: code commit -> PR -> CI Jobs -> GitOPS Config Repo: | ArgoCD 控制器 ( watch GitOPS Config Repo) -> Syncd Stats

CI runner Image:

  • alpine-code-lint/Dockerfile For Code
  • alpine-test-tools/Dockerfile For Code & artifact
  • alpine-image-builder/Dockerfile for K8S/APP
  • alpine-chart-builder/Dockerfile K8S/APP
  • alpine-ansible-runner/Dockerfile VM/APP

genneral helm chart:

  1. App-frontend 2.APp-backend

CI/CD workflow

Github action workflow-call:

  1. workflows-call-build-image.yaml
  2. workflows-call-build-charts.yaml
  3. workflows-call-deploy-charts.yaml
  4. workflows-call-setup-gitops.yaml
  5. workflows-call-run-choas-mesh.yaml

Jenkinffile

  1. workflows-call-run-ansible.yaml for VM

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 环境支持
  • 2. CI 工具
  • 3. CD 工具
  • 4. CI 阶段检查
  • 5. CD 阶段检查
  • 6. 分支模型和 Docker 镜像标签策略
  • 7. GitOps Workflow 分支示意图
  • 8. CI Runner 镜像
  • CI/CD Workflow Pipeline (CI/CD 工作流程管道)
    • GitHub Actions 工作流程文件 (GitHub Actions Workflow Files)
      • Jenkinsfile
      • CI Runner Images (CI 运行器镜像)
      • 基于GitOPS 的workflow 分支示意图:
      • CI runner Image:
      • genneral helm chart:
      • CI/CD workflow
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档