CI/CD的概述
良好的CI/CD应该拥有哪些功能
自动化构建
- 自动化构建触发:每次代码提交、合并请求、或其他触发事件时,自动启动构建过程。
- 依赖管理:自动处理项目依赖,确保构建环境的一致性。
- 可复用的构建脚本:使用脚本或配置文件(如Makefile、Gradle、Maven等)来定义构建过程,确保构建步骤的一致性和可复用性。
- 版本控制:构建过程中自动生成版本号或构建标签,以便于版本管理和追踪。
自动化测试
自动化测试是CI/CD系统确保代码质量的重要功能,通过自动化测试,开发团队可以快速发现和修复问题。
- 单元测试:每次构建后自动运行单元测试,确保代码功能的正确性。
- 集成测试:在代码合并到主分支前运行集成测试,验证不同模块的协同工作。
- 端到端测试:模拟用户行为,验证应用的整体功能和性能。
- 代码覆盖率:生成代码覆盖率报告,确保测试覆盖了足够的代码。
自动化部署
自动化部署功能使应用能够快速、安全地部署到各种环境(如开发、测试、生产环境)。
- 多环境部署:支持将应用部署到不同的环境(开发、测试、UAT、生产),每个环境有独立的配置。
- 蓝绿部署/金丝雀发布:在生产环境中进行蓝绿部署或金丝雀发布,以降低部署风险。
- 配置管理:通过配置文件或环境变量管理不同环境的配置。
- 基础设施即代码:使用工具(如Terraform、Ansible等)自动化管理和部署基础设施。
监控与反馈
监控与反馈功能确保开发团队能够及时了解系统的健康状态和性能,并迅速响应问题。
- 实时监控:监控应用的性能、日志和资源使用情况,及时发现和响应问题。
- 报警系统:设置监控报警,及时通知相关人员处理异常情况。
- 反馈循环:将监控和测试结果反馈给开发团队,持续改进代码质量。
- 可视化仪表板:提供可视化的监控和报告仪表板,便于快速查看系统状态和构建结果。
回滚机制
回滚机制确保在出现问题时能够快速恢复到稳定状态,减少对业务的影响。
- 自动回滚:在新版本部署失败或出现严重问题时,自动回滚到上一个稳定版本。
- 手动回滚:提供手动触发回滚的能力,确保在自动回滚失效时能够人工干预。
- 版本管理:保存所有发布版本的记录,便于快速回滚和问题排查。
- 数据库迁移回滚:在回滚应用代码时,能够同时回滚数据库迁移,确保数据一致性。
CI/CD在Kubernetes中的最佳实践方案梳理
根据前期提到的优秀的CICD的功能,结合网络上的方案
梳理出如下最佳方案
Gitlab CI/CD
简介
GitLab CI/CD 是一个内置于 GitLab 中的持续集成和持续交付/部署解决方案.
它通过 GitLab Runner 执行定义在 .gitlab-ci.yml 文件中的任务(如构建、测试和部署).
GitLab CI/CD 提供了一个强大的框架,用于自动化软件开发生命周期中的各个阶段,从代码提交到生产环境的部署。
先决条件
- 需要配置Kubernetes集群的访问权限
- 需要配置aws权限
流程
流程如图所示
详细解释:
- 开发人员提交代码
- 开发人员将代码推送到 GitLab 代码库(GitLab Code Repo)。代码库包含源代码、Dockerfile 和 GitLab CI 配置文件(.gitlab-ci.yml)。
- 测试代码:运行代码测试,确保代码逻辑正确。
- 单元测试(UT):执行单元测试,验证各个模块的功能。
- Lint 检查:运行代码风格检查(Lint),确保代码符合规范。
- 在通过初始测试后,GitLab CI 管道继续执行以下步骤:
- 构建镜像:使用 Dockerfile 构建 Docker 镜像。
- 扫描镜像:对构建的镜像进行安全扫描,检查潜在的漏洞。
- 推送到AWS ECR:将通过扫描的镜像推送到 ECR。
- 部署阶段,部署deployment 到kubernetes集群
example
根据上述流程完成了一个CI/CD流程
.gitlab-ci.yml示例
1 |
|
执行部署
部署成功
Gitlab CI + ArgoCD
简介
先决条件
- 需要ArgoCD搭建
- 需要在ArgoCD配置gitlab的校验
流程
流程如图所示
详细解释:
- 开发者将代码推送到GitLab代码库(GitLab Code Repo),代码库包含源码、Dockerfile和GitLab-CI配置文件(.gitlab-ci.yml)
- 进行代码测试(Test Code)、单元测试(UT)和代码风格检查(Lint Check)。
- 构建Docker镜像(Build Image)、扫描镜像(Scan Image)、将镜像推送到镜像仓库(Push to Registry),并更新清单文件(Update Manifest)。
- 构建的Docker镜像被推送到ECR镜像仓库(ECR Registry)。
- 在GitLab中进行部署更新,更新清单文件(Update Manifest)。
- 使用ArgoCD同步GitLab代码库中的清单文件(Sync Repo),将更新部署到Kubernetes集群中(Deploy to Cluster)。
- Kubernetes从ECR镜像仓库中拉取最新的镜像(Pull Image),部署应用。
example
job如下
手动部署deployment
修改deployment.yml的内容
argocd自动部署
Gitlab + jenkins
简介
先决条件
- 需要jenkins搭建在内网(已经搭建完毕)
- 需要在jenkins上安装多个插件 (gitlab,cicd,k8s,pipline)
- 需要kubernetes提供token
- 需要在kubernetes上部署代理,连接jenkins
- 需要aws权限
- 需要gitlab的token权限
流程
- 开发者将代码推送到GitLab代码库(GitLab Code Repo)
- 代码推送到GitLab后,通过Webhook触发Jenkins任务
- Jenkins收到Webhook触发的任务后,开始构建Docker镜像 (通过Docker插件)
- 构建完成的Docker镜像通过docker插件推送到ECR镜像仓库(ECR Registry)
- Kubernetes插件从ECR镜像仓库中拉取最新的镜像,部署应用
example
设定一个Jenkins的webhook
编写jenkinsfile
设置好jenkins pipline(步骤较为麻烦,这里不再论述)
点击部署
部署成功
CI/CD的方案对比
方案对比表
优缺点梳理
Gitlab
优点
- 完整的平台,可以自定义所有的CI/CD流程
- 内置的CI/CD功能适合大部分的部署场景
- 管理比较简单,所有的功能都在Gitlab上
缺点
- 扩展性比较差,没有插件系统
- 对于复杂的CI\CD流程还是需要外部工具帮忙
Gitlab + ArgoCD
优点
- 通过 Argo CD 实现声明式配置管理和自动化同步
- 专注Kubernetes管理,提供强大的 Kubernetes 部署和监控功能
- 自动化同步,持续监控 Git 仓库的配置文件,发现修改及时更新
- 和gitlab的集成,结合gitlab的代码托管,形成完整的CI/CD流程
缺点
- 需要对项目进行配置,项目越多,配置越多
- 专注支持Kubernetes管理,其他环境支持比较弱
Gitlab + Jenkins
优点
- 插件系统强,插件多,可以覆盖所有CI/CD需求
- 通过编写pipline code,进行自定制pipline
- 和gitlab的集成非常方便
缺点
- 过于复杂,维护成本高
- 配置复杂,k8s的配置token比较复杂
- 学习成本较高,需要花费大量时间学习。
推荐方案
推荐Gitlab + ArgoCD
推荐原因
- 此次需求定义的项目全是EKS项目,正好符合ArgoCD的专属kubernetes
- 已经配置好了ArgoCD,编写pipline只需要基础的GITLAB支持
- GitOps 模型使得变更记录清晰可追溯,方便审计和回滚
- Argo CD 可以持续监控 Git 仓库中的配置文件,当检测到配置变更时,自动将这些更改应用到 Kubernetes 集群
- 结合 GitLab 的代码托管和 CI/CD 功能,形成完整的 DevOps 工作流,提升了开发和运维的效率
设计job
job梳理
test
运行Golang项目的单元测试和集成测试,以确保代码的质量和正确性
1 | test: |
security_check
进行安全扫描和检查,以发现代码中的潜在安全漏洞和问题
1 | security_check: |
build
构建Docker镜像,并且上传到AWS ECR
1 | build: |
deploy
修改deployment.yml文件,并且提交修改,这里为手动触发
1 | deploy: |