持续集成/部署和数据库
Continuous Integration / Deployment and Databases
我有一个 Laravel 项目(API 用于 iOS 应用程序),目前正在设置持续集成服务器 (Jenkins) 来处理对 AWS 的部署。我正在使用 Capistrano、Packer 和 Terraform 等工具来完成这项工作。
目前,该应用程序有两个环境:登台和生产。
但是,我正在尝试找到一种在此系统中使用数据库的好方法。
基本上,我设想管道是这样的:
- 检查代码
- 运行 测试
- 部署暂存 AMI 并建立新的基础设施
- QA 并将 AMI 部署到生产环境
但是,在第 3 步和第 4 步之间,我想做一个 "dry run" 生产部署——也就是说,尝试迁移,并访问潜在的大数据集生产会有。
所以我看到了 2 个选项:
1) 当我们准备好进行质量检查时,导出生产数据库并将其导入到暂存中。然后 运行 "the process"(迁移、terraform、打包程序等)。如果一切顺利,转到生产
优点:
- 您可以在文字生产数据集上尝试一切,因此您有信心事情会成功
- 您可以使用大型数据集,看看是否存在任何瓶颈,因为与典型的暂存环境相比,存在大量记录
缺点:
- 最终,生产数据库可能会变得非常大,并且导出
每天,或一天几次,可能会变得很慢
- 与上一点类似,这使得持续集成非常缓慢
2) 不是从生产环境中导入,而是为所有数据库模型和 运行 根据 QA 的需要编写可配置的播种机。
优点:
- 您可以使用小型或大型数据集作为数据库种子,具体取决于您对特定部署的需求
- 播种器只是一个简单的脚本,可以运行非常快
缺点:
您必须让您的播种机与您所做的任何模型更改保持同步。
一般来说,这个过程似乎更容易出现人为错误,而不是从生产中导出实际数据集。
人们一般如何处理这个过程?
您的暂存环境希望看起来尽可能像生产环境,否则它就失去了拥有它的意义,因为很难对其进行质量检查或将其用于实际测试您不会破坏生产.
因此,您的数据库迁移应与代码一起移动,并且您对基础架构所做的任何更改都应与使用这些更改的代码同时提交,从而通过您的 CI 管道传播同时。
至于实际数据,我们会定期为我们的数据库拍摄快照(运行ning on RDS in AWS),然后将它们恢复到我们的 "like live" 环境中。这意味着我们的测试环境具有与生产环境相似的数据量,因此我们可以看到诸如数据库迁移之类的影响以及在它进入生产环境之前执行所需的时间。
我们还有一些更精简的环境,用于 运行 广泛的自动化测试套件,但这些生成的数据最少,刚好足以 运行 测试。
在我们的例子中,我们还处理个人身份信息,因此我们的快照过程实际上稍微复杂一些,因为我们还随机化任何潜在的敏感数据,生成新的姓名和联系方式等。
对您来说,这可能归结为从生产环境中真正恢复数据有多痛苦。我会说从这样做开始,当它变得太痛苦或太慢时,然后考虑转向生成数据集,并确保它的大小足以模拟生产或让您对现实世界有一个很好的理解。
所以在你的情况下,我会这样开始:
- Jenkins 获取代码更改(例如在 Git 中合并到 master)。
- 单元测试 运行 在 Jenkins 的内存中。
- 然后,绿色构建会触发 AMI 的 Packer 构建,然后对其进行适当标记。
- Jenkins 然后让 Terraform 使用来自生产的最新(必要时经过清理)快照和使用
aws_ami
数据源自动获取的新 AMI 构建您的暂存环境。
- 如果您的测试通过了这个阶段,那么您可以触发生产部署,其中 Terraform 将旧 AMI 替换为新 AMI。
我建议使用 blue/green 部署来使用概述的策略推出新的 AMI here 但这本身就是一个单独的问题(其他地方有大量资源)。
我有一个 Laravel 项目(API 用于 iOS 应用程序),目前正在设置持续集成服务器 (Jenkins) 来处理对 AWS 的部署。我正在使用 Capistrano、Packer 和 Terraform 等工具来完成这项工作。
目前,该应用程序有两个环境:登台和生产。
但是,我正在尝试找到一种在此系统中使用数据库的好方法。
基本上,我设想管道是这样的:
- 检查代码
- 运行 测试
- 部署暂存 AMI 并建立新的基础设施
- QA 并将 AMI 部署到生产环境
但是,在第 3 步和第 4 步之间,我想做一个 "dry run" 生产部署——也就是说,尝试迁移,并访问潜在的大数据集生产会有。
所以我看到了 2 个选项:
1) 当我们准备好进行质量检查时,导出生产数据库并将其导入到暂存中。然后 运行 "the process"(迁移、terraform、打包程序等)。如果一切顺利,转到生产
优点:
- 您可以在文字生产数据集上尝试一切,因此您有信心事情会成功
- 您可以使用大型数据集,看看是否存在任何瓶颈,因为与典型的暂存环境相比,存在大量记录
缺点:
- 最终,生产数据库可能会变得非常大,并且导出 每天,或一天几次,可能会变得很慢
- 与上一点类似,这使得持续集成非常缓慢
2) 不是从生产环境中导入,而是为所有数据库模型和 运行 根据 QA 的需要编写可配置的播种机。
优点:
- 您可以使用小型或大型数据集作为数据库种子,具体取决于您对特定部署的需求
- 播种器只是一个简单的脚本,可以运行非常快
缺点:
您必须让您的播种机与您所做的任何模型更改保持同步。
一般来说,这个过程似乎更容易出现人为错误,而不是从生产中导出实际数据集。
人们一般如何处理这个过程?
您的暂存环境希望看起来尽可能像生产环境,否则它就失去了拥有它的意义,因为很难对其进行质量检查或将其用于实际测试您不会破坏生产.
因此,您的数据库迁移应与代码一起移动,并且您对基础架构所做的任何更改都应与使用这些更改的代码同时提交,从而通过您的 CI 管道传播同时。
至于实际数据,我们会定期为我们的数据库拍摄快照(运行ning on RDS in AWS),然后将它们恢复到我们的 "like live" 环境中。这意味着我们的测试环境具有与生产环境相似的数据量,因此我们可以看到诸如数据库迁移之类的影响以及在它进入生产环境之前执行所需的时间。
我们还有一些更精简的环境,用于 运行 广泛的自动化测试套件,但这些生成的数据最少,刚好足以 运行 测试。
在我们的例子中,我们还处理个人身份信息,因此我们的快照过程实际上稍微复杂一些,因为我们还随机化任何潜在的敏感数据,生成新的姓名和联系方式等。
对您来说,这可能归结为从生产环境中真正恢复数据有多痛苦。我会说从这样做开始,当它变得太痛苦或太慢时,然后考虑转向生成数据集,并确保它的大小足以模拟生产或让您对现实世界有一个很好的理解。
所以在你的情况下,我会这样开始:
- Jenkins 获取代码更改(例如在 Git 中合并到 master)。
- 单元测试 运行 在 Jenkins 的内存中。
- 然后,绿色构建会触发 AMI 的 Packer 构建,然后对其进行适当标记。
- Jenkins 然后让 Terraform 使用来自生产的最新(必要时经过清理)快照和使用
aws_ami
数据源自动获取的新 AMI 构建您的暂存环境。 - 如果您的测试通过了这个阶段,那么您可以触发生产部署,其中 Terraform 将旧 AMI 替换为新 AMI。
我建议使用 blue/green 部署来使用概述的策略推出新的 AMI here 但这本身就是一个单独的问题(其他地方有大量资源)。