使用功能分支时如何使用 Flyway
Posted
技术标签:
【中文标题】使用功能分支时如何使用 Flyway【英文标题】:How to use Flyway when working with feature branches 【发布时间】:2012-03-18 19:34:46 【问题描述】:我们最近开始为我们处理的每个故事使用功能分支。这些尽可能独立,然后我们的项目经理决定哪些故事将构成一个版本。这意味着我们不知道故事最初投入生产的确切顺序。
在 Flyway 中是否有处理此问题的标准方法?我已阅读常见问题解答,其中讨论了对生产数据库的更改如何是线性的,这是正确的。但是,我不确定团队成员在处理功能分支时如何决定迁移的版本号。此外,当我们在发布前合并到集成分支和 master 时,我们需要手动重命名迁移文件。
【问题讨论】:
您可以为“版本号”使用日期和时间戳。为了简单起见,您可能需要某种脚本支持。 显然,在尝试一次应用所有迁移时可能会发生冲突。您也可能在源代码中存在冲突。因此,当您开始准备发布时,将您的迁移重命名为弄清楚所有这些内容的一部分。见:***.com/questions/888414/… 【参考方案1】:我见过的克服分支之间的版本控制问题以启用 outOfOrder 并使用时间戳作为版本号的最佳方法
默认情况下,大多数迁移框架选择在单个迁移前加上一个整数,如下例所示。当框架遇到尚未应用于当前数据库的迁移时,它会从数据库中不存在前缀的第一个迁移开始,并开始按升序应用它们。
1.0.0.1__add_customers_table.sql 1.0.0.2__add_email_address_column_to_customers_table.sql 1.0.0.3__add_orders_table_with_reference_to_customer_table.sql当每个人都在同一个代码分支上时,这很有效。但是,一旦团队成员开始在自己的分支上工作,前缀冲突的可能性就会急剧增加。
但是,如果您选择使用时间戳而不是整数为迁移添加前缀,那么发生冲突的可能性实际上会消失,即使跨分支也是如此。例如,使用 yyyyMMddHHmmssSSS 之类的模式,上面的迁移现在看起来像……
1.0.0.20130704144750766__add_customers_table.sql 1.0.0.20130706132142244__add_email_address_column_to_customers_table.sql 1.0.0.20130706151409978__add_orders_table_with_reference_to_customer_table.sql上面的时间戳模式精确到毫秒。虽然高度精确的时间戳会导致前缀难以读取,但前缀越精确,冲突的可能性就越小。
为了获得最佳结果,您需要自动创建此时间戳,以便团队的所有成员都使用一致的格式
此外,请注意 Flyway 还将时间戳前缀视为整数。这意味着,如果您最初使用整数开始使用 Flyway,那么您仍然可以随时切换到时间戳。由于时间戳只是非常大的整数,因此第一个时间戳前缀迁移将简单地应用在最后一个整数前缀迁移之后。
取自此处并稍作修改:http://www.jeremyjarrell.com/using-flyway-db-with-distributed-version-control/
【讨论】:
【参考方案2】:您不能拥有与您将获得的版本号相同的迁移脚本:
发现不止一个版本为“x.y.z”的迁移(违规者:SQL ...)
这是我建议的解决方法:多个开发人员正在开发相同的版本,例如 1.0
,但功能不同。我猜你正在使用一些问题跟踪器来为每个问题添加 id,比如FOO-16
。当开发人员处理该问题时,迁移脚本称为V1.0.16__my_greatest_feature.sql
。这样(假设每个功能/分支都有自己的问题)没有冲突。
此外,我假设数据库迁移脚本是独立且不重叠的,但如果不是这种情况,您在将所有内容合并到稳定版本时会遇到问题。
因此,在稳定版本中,您有多个迁移脚本存在差距,例如:V1.0.16
、V1.0.27
、V1.0.101
(如果选择了 FOO-16
、FOO-27
和 FOO-101
)- Flyway 不会关心。所有未进入稳定版本1.0
(例如V1.0.35
)的功能都应重命名为下一个主要版本(例如V1.1.35
)。
【讨论】:
如果这些功能分支在不同时间合并回开发分支会怎样。如果功能 101 被合并回来并在 27 之前应用,那么您将无法再应用 27,因为 flyway 抱怨它的数字较小。 您需要启用乱序处理(请参阅flywaydb.org/documentation/commandline/migrate)。 @JanThomä 乱用有时也很危险。这是 liquibase 的亮点,但我讨厌将 XML 与 liquibase 一起使用。太麻烦了。【参考方案3】:使用时间戳作为版本似乎是个好主意。我看到的唯一问题是当团队遍布全球时。在这种情况下,我们可能不得不选择一个时区作为标准。
【讨论】:
时间戳不易受到时区偏差的影响;它表示自 1970 年 1 月 1 日午夜 UTC 以来的 [毫秒] 秒数。在 java 中,这是一个Instant
,而不是DateTime
,后者将有一个时区。以上是关于使用功能分支时如何使用 Flyway的主要内容,如果未能解决你的问题,请参考以下文章
如何在单元测试中使用 Flyway 时重置 SQLite 自动增量
在 Spring Boot 应用程序上使用 Flyway 时如何在 H2 中加载初始数据?