描述起来有点复杂,但我会尽力而为。基本上我们使用的是 Git 工作流程,这意味着我们有以下分支:
- 生产,这是现场分支。一切都是生产在实时网络环境中运行。
- 集成,其中集成了所有新功能。这个分支每周都会合并到生产环境中。
- 一个或多个功能分支,开发人员或开发团队在其中开发新功能。完成此操作后,开发人员将他们的功能分支合并到集成中。
所以,这里没有什么复杂的。但是,由于我们的应用程序是针对 MySQL 数据库运行的 Web 应用程序,因此新功能通常需要更改数据库方案。为了自动化这个,我们使用 dbdeploy,它允许我们创建改变脚本,给定一个数字。例如 00001.sql、00002.sql 等。在合并到集成分支后,dbdeploy 将检查哪些更改脚本的编号高于该特定数据库上最新执行的脚本,并将执行这些脚本。
现在假设如下。- 集成在 00200.sql 之前有更改脚本。所有这些都在集成数据库上执行。- 开发人员 John 有一个功能分支 featureX,它是在集成仍将 00199.sql 作为最高更改脚本时创建的。
由于一些必需的数据库架构更改,John 创建了 00200.sql。
现在,在某个时候,John 会将他的修改合并回集成分支。John 会遇到合并冲突,并且会看到他的 00200.sql 已经存在于集成中。这意味着他需要打开有冲突的文件,提取他的内容,将该文件重置回“我的”(集成中的原始状态)并将他自己的内容放入一个新文件中。
现在,由于我们与十名开发人员合作,我们每天都会遇到这种情况。虽然我们确实了解这背后的原因,但有时非常麻烦。John 重命名他的脚本,对集成进行合并提交,将更改推送到上游,只是看到其他人已经创建了 00201.sql,要求 John 再次执行这些过程。
肯定会有更多的团队使用 Git 工作流程并使用数据库更改管理工具来自动化数据库架构更改吗?
所以,简而言之,我的问题是:
- 当在不同的功能分支上工作时,如何自动化数据库模式更改,这些分支在同一数据库的不同实例上运行?
- 如何始终防止合并冲突,同时仍然可以选择在执行的更改脚本中具有固定顺序?例如,00199.sql 必须在 00200.sql 之前执行,因为 00200.sql 可能取决于 00199.sql 中所做的某些事情。
当然,任何其他提示都是最受欢迎的。