我有一个java应用程序,部署在各种平台上(使用ansible)。
这个应用程序使用一个数据库,它有时需要获得模式更新,我用flyway执行和记录/版本(作为软件依赖项)。
我现在需要更新所有平台上的数据,但是根据平台的不同使用不同的值。这不是一个模式更新,但仍然是数据(它连接到的其他应用程序的列表),形成了我的应用程序的主要结构,因此我希望它的版本控制,以类似于flyway的方式。
一开始我想我应该在我的ansible配置中输入不同的数据,这似乎是有意义的,因为ansible知道各种平台。然后我想这些信息会以某种方式传递给flyway,以便它执行所需的更新。但是,如果使用“版本化迁移”来处理这个问题,可能会导致版本冲突,因为一个环境需要更新,而另一个环境不需要(通用版本控制与环境版本控制)。
在flyway的faq中有一点提到这个问题,可以设置 flyway.locations
属性,或者我可以使用由ansible设置的flyway占位符?
我走对了吗?或者我不应该完全使用flyway(它是与dml一起使用,还是应该为ddl保留)?
1条答案
按热度按时间kqqjbcuj1#
flyway可用于模式和数据更新。尽管它的主要目的是对模式更新进行版本控制。
听起来您需要一种只在特定环境中部署某些脚本的方法。flyway提供了支持此工作流的功能。但是,您需要决定最适合您的方法。
这里有一些想法。
使用不同的位置
我能想到的最简单的方法是在它们自己的位置上有特定于环境的脚本。您还可以为“common”脚本设置一个位置。
部署时,可以指定“公共”位置,以及特定于环境的位置。比如:
flyway migration -locations=common/sql, test/sql
flyway migration -locations=common/sql, production/sql
等等。应执行脚本配置占位符(&P)
另一种方法是使用flyway团队功能
shouldExecute
. 让我们定义一个布尔表达式来确定脚本是否应该运行。可以从占位符中插入值。有一篇博文对此做了更多的解释。使用cherrypick配置选项
团队版的另一个特点是
cherryPick
,它允许您精确地指定要部署的脚本。因此,每个环境可能有一个配置文件cherryPick
指定要运行的确切脚本的配置。这个脚本可能很难处理,因为您需要显式地列出每个脚本,但它确实提供了完全的控制。