CI/CD:自动化我们的构建和部署流程
TLDR
为每个 Git 代码库设置持续集成/持续交付 (CI/CD) 流水线是 Mage 软件开发生命周期的重要组成部分。它使我们能够在不牺牲质量保证的前提下,大幅加快应用程序的测试、构建和部署流程。
大纲
- CI/CD 简介
- CI/CD 在软件开发中的重要性
- CircleCI 及其替代方案
- Mage 如何使用 CircleCI 作为我们的 CI/CD 管道
- CircleCI 配置
CI/CD 简介
“CI”代表“持续集成”,是指每次代码变更合并到主分支后,定期构建和测试代码的实践。根据代码提交到主分支还是次分支,可以运行不同的测试。
“CD”代表“持续交付”或“持续部署”。持续交付和持续部署都建立在持续集成的基础上,并支持将代码更改自动部署到测试/预发布环境和生产环境中。
但是,持续交付在部署到生产环境之前需要手动步骤(例如批准),而持续部署则假设所有测试和构建都已成功完成,无需批准步骤即可自动完成生产部署。
CI/CD 在软件开发中的重要性
使用 CI/CD 流水线可以自动频繁地测试新的代码提交,以便在部署到生产环境之前快速发现并纠正错误或重大更改。一旦 CI/CD 流水线设置完毕,发布流程就会变得更快、更轻松、更安全,从而显著提高团队软件开发生命周期的效率。
CircleCI 及其替代方案
CircleCI 流程(来源: https: //circleci.com/docs/2.0/about-circleci/)
CircleCI是目前市面上最受欢迎的 CI/CD 工具之一,支持多种常用编程语言,包括 Python、JavaScript、Java、Go 和 Ruby on Rails,并支持与GitHub和Bitbucket集成。
虽然 CircleCI 是 Mage 使用的工具,并且我们将在本文的其余部分对其进行更详细的介绍,但还有其他几个合适的 CI/CD 工具可用,例如Jenkins、TeamCity或Travis CI。
正如我们在《Startup 技术栈》文章中所述,我们之前使用过 Travis CI,但将我们的 CI/CD 管道迁移到了 CircleCI,因为它允许更好地控制管道配置(例如,在下一个作业运行之前为某些作业设置手动批准),在并发作业和用户数量方面的限制更少,并且对我们来说更有价值(最终成本比 Travis CI 低五倍)。
Mage 如何使用 CircleCI 作为我们的 CI/CD 管道
我们的 CircleCI 后端工作流程
我们为每项服务提供了不同的 CircleCI工作流程,但下文将讨论后端工作流程的不同部分。工作流程定义了一系列作业及其运行顺序,而作业则是一系列步骤的集合。作业中的所有步骤都在单个Docker 容器或虚拟机(VM)中执行。
Github 集成
我们所有的代码库都托管在 GitHub 上,因此我们将 CircleCI与除前端服务(前端服务使用 Vercel)之外的所有服务集成。我们将在技术栈文章的“基础设施”部分讨论如何使用Vercel。
在二级分支上工作时,推送到 GitHub 远程分支的代码提交只会在 Docker 容器中构建开发环境并运行测试,但不会进行任何部署。
测试/调试
除了 CircleCI 对推送到远程分支的每个代码提交提供的自动测试之外,CircleCI 还允许我们通过 SSH 进入测试实例来检查我们的代码或测试环境以进行调试。

可以通过单击 CircleCI 作业页面右上角的“重新运行”按钮并选择“使用 SSH 重新运行作业”来找到此 SSH 功能:
数据库迁移
在主分支上,所有测试成功通过后,CircleCI 会针对托管在Amazon Relational Database Service ( RDS ) 上的MySQL数据库运行数据库迁移。这会将生产数据库状态与Django后端的任何更新模型同步。
暂存环境
成功运行数据库迁移后,CircleCI 会将我们的后端应用程序部署到 Amazon Elastic Beanstalk 的暂存环境中,并自动运行一些冒烟测试。部署暂存环境后,我们可以运行其他手动测试,确认所有新增或更新的 API 均正常运行。
通知
无论工作流程成功或失败,CircleCI 都可以向 CircleCI 项目团队成员发送电子邮件。此外,它还集成了 Slack,可以在工作流程的任何步骤发送 Slack 消息。每当需要手动审批时,我们都会向特定的 Mage Slack 频道发送消息,提醒我们返回 CircleCI 用户界面。
手动批准
我们需要在 CircleCI 中手动批准才能启动任何生产部署。这使我们能够先在预发布环境中进行任何额外的自定义测试,并且还能让我们控制部署的时间。
手动批准实际上需要团队成员进入 CircleCI UI 并单击“批准”按钮,如下面的屏幕截图所示:
构建 Docker 镜像
作为 CircleCI工作流程的一部分,我们还可以使用自己的 Dockerfiles 创建自定义 Docker 镜像。
我们使用 AWS Lambda 异步执行并快速完成复杂的数据处理任务。为了配置我们的AWS Lambda函数,我们需要构建自定义 Docker 镜像并将其推送到 Amazon Elastic Container Registry ( ECR )。在手动审核通过后,此操作会在 CircleCI 中自动完成。
生产部署
除了更新 AWS Lambda 函数之外,还将同时运行CircleCI作业,以将我们的应用程序和后端工作人员部署到Amazon Elastic Beanstalk 中的生产环境中。
部署回滚
在某些情况下,我们可能需要回滚部署。例如,如果我们已经将应用程序部署到生产环境,但由于发现了未捕获的 Bug 而想要恢复到以前的版本,我们可以使用 CircleCI 来实现。
CircleCI 没有提供明确的 UI 功能,允许我们在工作流中重新运行已成功完成的单个作业。不过,我们可以使用“使用 SSH 重新运行作业”功能,就像上面“测试/调试”部分中提到的那样。我们只需返回到该特定代码提交的工作流,然后重新运行单个部署作业即可。
请注意,如果作业使用 Docker 容器部署应用程序,则重新运行部署作业应该能够引用具有唯一版本标签(例如提交 SHA 哈希值)的相关 Docker 镜像,我们的API 服务就是这种情况。
CircleCI 配置
CircleCI 中需要使用YAML 语法创建一个config.yml文件来定义步骤、作业和工作流。我们将介绍 config.yml 文件的各个部分,但要详细了解各个配置键,最佳途径是参阅CircleCI 文档。
版本
几个不同的功能需要 CircleCI 的最低版本为 2.1,因此不建议使用低于该版本的版本。
version: 2.1
球体
Orbs是CircleCI 提供的便捷配置元素包(例如jobs、command、executors )。CircleCI 的orbs registry中提供了许多可用的 orbs 。
Mage 使用的一些 orb 包括 Slack、AWS Elastic Beanstalk、AWS CLI 和 AWS ECR orb。Slack orb 允许 CircleCI 向我们的某个 Slack 频道发送消息,而 AWS orb 则允许我们轻松运行 CLI 或其他特定于这些工具的命令。
orbs:
slack: circleci/slack@4.3.1
aws-elastic-beanstalk: circleci/aws-elastic-beanstalk@1.0.2
aws-cli: circleci/aws-cli@1.4.0
aws-ecr: circleci/aws-ecr@6.15.3
工作
上文“Mage 如何使用 CircleCI 构建我们的 CI/CD 流水线”下的大部分章节都代表了 Mage 后端工作流中的单个作业。例如,有一个用于运行测试的作业、一个用于部署到暂存环境的作业、一个用于构建 AWS Lambda Docker 镜像并将其部署到 AWS ECR 的作业等等。
每个作业都包含多个步骤,这些步骤在单个 Docker 容器或虚拟机中执行。在我们的 CircleCI 作业中,我们通常尽可能使用 Docker 容器,因为它们的启动速度比启动虚拟机更快,而且我们的作业不需要在虚拟机中运行,因此资源占用不高。
如果您的作业仅需要最少量的 CPU 和内存,则小型 Docker 容器使用的资源比中型 VM(CircleCI 中可用的最小尺寸)要少,从而导致每分钟使用的CircleCI 信用较少。
CircleCI orb提供slack/on-hold job
的步骤如下:
CircleCI文档有几个示例,说明了作业的 config.yml 文件中的配置应该是什么样子。
工作流程
CircleCI工作流的运行方式有很多自定义选项。除了定义作业的运行顺序外,我们还可以指定特定作业在哪些分支上运行,也可以通过扇出模式同时运行多个作业以节省时间,或者要求多个作业成功完成后才能继续执行特定作业。
我们在文章开头“Mage 如何将 CircleCI 用于我们的 CI/CD 流水线”部分展示了 Mage 后端工作流程的图表。这只是利用 CircleCI 工作流程的众多方法之一。
总结
无论你决定使用哪种 CI/CD 工具,重要的是首先建立一个 CI/CD 流水线,然后在此基础上进行构建。如果绝对必要,以后可以随时迁移到其他平台。
文章来源:https://dev.to/mage_ai/ci-cd-automating-our-build-and-deploy-process-2i91