可扩展 CI/CD 流程的技巧和窍门

2025-06-04

可扩展 CI/CD 流程的技巧和窍门

当你规划一个项目时,你并不总是知道它最终会有多大。因此,遵循一些指南来确保开发过程尽可能顺利至关重要。一个特别有用的工具是持续集成/交付流程,简称 CI/CD 流程。

在典型的开发过程开始时,在项目准备发布之前,您的 CI 流程如下所示:

在开发阶段,流程会不断添加更多步骤,直到看起来像下图所示。不过,在某些项目中,您可能会看到比这更多的步骤。原图

在本文中,我将演示一个典型的 CI/CD 流程,并提供一些技巧,帮助您将其扩展到更大的项目。请注意,这些建议是基于您已经使用 Docker 和编排工具(例如 Kubernetes)开发了基础架构设置的前提。

定义您的 VCS 流程

所有现代 CI 工具都依赖于版本控制系统,因此为了保持 CI 流程的高水平,您应该拥有一个合适的版本控制流程。如果您正在寻找灵感,我推荐Git FlowGithub Flow。选择其中一个,并根据您的需求调整您的流程。

建议:

  • 对任何分支中的每次推送都运行测试。这有助于您的开发人员更快地发现错误并加快代码审查流程。
  • 定义将用于触发 Docker 镜像构建过程的分支并部署它们,如上图所示。
  • 如果您的发布具有复杂的手动审批流程,请使用标签来触发生产发布。

指定您的环境

一旦你建立了 Git 流程,就将其与你的构建逻辑集成,并根据你拥有的环境数量进行调整。最初,你可能会在本地环境测试后将所有内容部署到生产环境。之后,你可能会决定进行开发、用户验收测试 (UAT) 和生产环境。

例子:

我们通常使用主分支来启动到开发环境的部署。然后,我们将主分支合并到发布分支。这会触发部署到用户验收测试 (UAT),我们允许少数用户测试新版本。如果一切正常,并且 QA 团队确认发布,我们会从发布分支创建一个标签,从而启动到生产环境的部署。

设置通知

您应该通过您喜欢的通知渠道跟踪所有 CI 流程。我们在项目中使用 Slack。

  • 创建系统通知渠道并使其能够发送有关所有 CI 和基础设施流程的通知。
  • 设置有关成功或失败状态的通知,并在构建开始时提醒您。

保持 Docker 镜像简单

最佳做法是不要将环境变量传递给 Docker 镜像。所有环境变量都应通过 Docker 运行命令或在编排工具级别(例如 Kubernetes)传递。这也有助于保持 CI 配置文件的简洁性。

统一您的管道

如今,越来越多的公司开始使用微服务架构;统一的流水线可以帮助您更快地扩展部署,并在新的微服务中配置持续集成 (CI),从而从中受益。在 Drone CI 或 Travis CI 中,您可以在流水线步骤中使用大量 CI 环境变量(请参阅Travis CI 环境变量Drone CI 环境变量)。以下是一些 CI 环境变量的实际示例:

  • 要标记 Docker 镜像,可以使用构建分支和构建编号的组合。结果会是类似“master-6”的形式。或者,您也可以使用 git 的版本号进行标记。tags: "${DRONE_COMMIT_BRANCH}-${DRONE_BUILD_NUMBER}"

  • 在编排工具中使用仓库名称进行部署。Drone CI 使用环境变量部署到 Kubernetes 集群的示例。

deploy:
   image: peloton/drone-k8s-deployment
   deployment_names: "${DRONE_REPO_NAME}"
   container_names: "${DRONE_REPO_NAME}"
   namespaces: microservices
   docker_image: "62673275295.dkr.ecr.eu-west-1.amazonaws.com/${DRONE_REPO_NAME}:${DRONE_COMMIT_BRANCH}-${DRONE_BUILD_NUMBER}"
   date_label: deployment.drone.io/date-deployed
   secrets: [kubernetes_url, kubernetes_token]
Enter fullscreen mode Exit fullscreen mode

定义 Docker 镜像名称约定

您应该根据环境的具体情况和重要性来制定 Docker 镜像的命名策略。例如,在开发和 UAT 环境中,由于不需要回滚功能,您可以使用分支名称作为标记,以便所有新构建都会覆盖之前的镜像。对于生产环境,最好使用发行版的版本号 (v1.0.0) 来标记镜像,这样可以减小镜像的体积,从而使镜像仓库更加结构化、可读性更强。

使用建造者模式

如果您能够在 CI 级别编译和构建某些内容,那么在将其放入最终镜像之前,将此作为额外步骤会很有帮助。观看此视频以更好地理解。

数据库迁移作为单独的步骤

不要将迁移作为 Dockerfile 的一部分执行;而应将其作为单独的步骤执行。额外的命令(例如资源编译或迁移)应作为单独的步骤运行,而不是在 Docker 启动时执行。您还应尝试在尽可能短的时间内启动并运行 Docker 镜像。

避免使用私有库和子模块

任何额外的依赖项(例如私有 npm 模块或子模块)都可能在 CI 配置设置过程中给您带来麻烦。例如,如果您有一个子模块,而默认情况下您的 CI 只能通过 http 和授权令牌访问您的代码库,那么您通过 git 为本地计算机配置的配置将无法正常工作。您需要覆盖子模块,但并非所有 CI 工具都提供此功能。

无人机 CI 子模块覆盖示例

如果您使用私有 npm 模块,您将面临类似的问题,因为您将需要 Docker 镜像中的密码或已下载的模块。

概括

为新项目配置 CI 时,请花一些时间思考和定义命名约定、潜在的扩展方法以及构建步骤的统一性。这有助于您更快地部署新服务,将这些实践作为新项目的基础,并更快地让员工加入到流程中。

文章来源:https://dev.to/alex_barashkov/tips-and-tricks-for-scalable-cicd-flow--49b7
PREV
在几分钟内为您的数据库创建一个管理面板全栈应用程序。
NEXT
实时 + Postgres =?