持续集成/部署和数据库

Continuous Integration / Deployment and Databases

我有一个 Laravel 项目(API 用于 iOS 应用程序),目前正在设置持续集成服务器 (Jenkins) 来处理对 AWS 的部署。我正在使用 Capistrano、Packer 和 Terraform 等工具来完成这项工作。

目前,该应用程序有两个环境:登台和生产。

但是,我正在尝试找到一种在此系统中使用数据库的好方法。

基本上,我设想管道是这样的:

  1. 检查代码
  2. 运行 测试
  3. 部署暂存 AMI 并建立新的基础设施
  4. QA 并将 AMI 部署到生产环境

但是,在第 3 步和第 4 步之间,我想做一个 "dry run" 生产部署——也就是说,尝试迁移,并访问潜在的大数据集生产会有。

所以我看到了 2 个选项:

1) 当我们准备好进行质量检查时,导出生产数据库并将其导入到暂存中。然后 运行 "the process"(迁移、terraform、打包程序等)。如果一切顺利,转到生产

优点:

缺点

2) 不是从生产环境中导入,而是为所有数据库模型和 运行 根据 QA 的需要编写可配置的播种机。

优点

缺点

人们一般如何处理这个过程?

您的暂存环境希望看起来尽可能像生产环境,否则它就失去了拥有它的意义,因为很难对其进行质量检查或将其用于实际测试您不会破坏生产.

因此,您的数据库迁移应与代码一起移动,并且您对基础架构所做的任何更改都应与使用这些更改的代码同时提交,从而通过您的 CI 管道传播同时。

至于实际数据,我们会定期为我们的数据库拍摄快照(运行ning on RDS in AWS),然后将它们恢复到我们的 "like live" 环境中。这意味着我们的测试环境具有与生产环境相似的数据量,因此我们可以看到诸如数据库迁移之类的影响以及在它进入生产环境之前执行所需的时间。

我们还有一些更精简的环境,用于 运行 广泛的自动化测试套件,但这些生成的数据最少,刚好足以 运行 测试。

在我们的例子中,我们还处理个人身份信息,因此我们的快照过程实际上稍微复杂一些,因为我们还随机化任何潜在的敏感数据,生成新的姓名和联系方式等。

对您来说,这可能归结为从生产环境中真正恢复数据有多痛苦。我会说从这样做开始,当它变得太痛苦或太慢时,然后考虑转向生成数据集,并确保它的大小足以模拟生产或让您对现实世界有一个很好的理解。

所以在你的情况下,我会这样开始:

  1. Jenkins 获取代码更改(例如在 Git 中合并到 master)。
  2. 单元测试 运行 在 Jenkins 的内存中。
  3. 然后,绿色构建会触发 AMI 的 Packer 构建,然后对其进行适当标记。
  4. Jenkins 然后让 Terraform 使用来自生产的最新(必要时经过清理)快照和使用 aws_ami 数据源自动获取的新 AMI 构建您的暂存环境。
  5. 如果您的测试通过了这个阶段,那么您可以触发生产部署,其中 Terraform 将旧 AMI 替换为新 AMI。

我建议使用 blue/green 部署来使用概述的策略推出新的 AMI here 但这本身就是一个单独的问题(其他地方有大量资源)。