我想知道是否可以同时处理多个功能分支上的maven项目,并避免不断覆盖Nexus中其他功能分支产生的工件。
我正在一个跨国项目中工作,该项目使用gitflow工作流来开发多个组件(30+)。每个组件都有一个git存储库,因此gitflow工作流应用于每个组件。因此每个组件都有一个开发和几个功能分支。通常,每个组分产生至少一种由其GAV识别的人工制品。
假设我们有组件A(具有功能分支功能/ A-foo和功能/ A-bar)和B(具有功能分支功能/ B-foo)
Component A:
A:develop
A:feature/A-foo
A:feature/A-bar
Component B:
B:develop
B:feature/B-foo
A:feature / A-foo和B:feature / B-foo处理同一主题,需要交换快照版本以测试其交互(例如客户端/服务器功能)。组件A和B只能通过Nexus交换工件(其他组件的源代码不可访问)。因此A:feature / A-foo必须部署其快照工件以使其可用于B:feature / B-foo,反之亦然。
但是当A:feature / A-bar(适用于完全不同的主题)之后进行部署时,由于相同的GAV和更新的时间戳以及B:feature / B-foo,它会“覆盖”Nexus中的快照瑕疵将在下一次构建中导入错误的工件。
一种解决方案是使用功能名称扩展GAV(例如foo):
some.company.componentA-1.2.3-foo.jar
some.company.componentA-1.2.3-bar.jar
some.company.componentB-3.2.1-foo.jar
这样你可以避免A:feature / A-foo覆盖A:feature / B-bar的伪像,因为它们有不同的GAV。但是这非常容易出错(当分支关闭时重命名GAV并在合并到重新开发时将其重命名;如果有人忘记重命名它,它会搞乱构建)。
有没有更好的解决方案?或者是否应禁止在功能分支上部署?
答案 0 :(得分:4)
功能分支不应该存在很长时间,因此在许多情况下,您最终根本不会部署。但是,如果您确实要部署(这是一件好事),那么版本字符串中的分支限定符是最好的方法。如果您使用负责版本更改的脚本自动创建分支,那么根本不会出现错误,并且实际上对您的整体策略非常合理。添加特定于功能的CI作业(或其中一些)并可能使用Versions Maven插件,您应该准备好滚动。