我们有一个相当大的java应用程序,它包含大量的maven工件。每个子系统在subversion树中都有自己的文件夹,包含trunk /,branches /和tags /子文件夹,并托管多个工件。 Maven POM的层次结构有多个层次。甚至依赖管理也被分成不同的模块。该应用程序部署为多个WAR和其他Zip / JAR内容。
在构建和部署它的过程中,我经常需要将应用程序视为一个单元。我遇到了一些我想在这里分享的困难。
Subversion布局:首先,我不能只用一个命令检查整个代码库。当我从顶层开始并检查所有子项目的所有分支时,它太大了并且需要太长时间。我想减少工件的数量目前不是一个选择,因为它会导致太多的基本变化。但可能是一个不同的subversion布局与聚合分支文件夹确实会有所帮助。我尝试过的一个解决方法是创建一个包含许多subversion外部的单独文件夹,它们将正确的子文件夹聚集在一起。然后,我可以使用来自顶级多模块工件的一个maven命令构建整个事物。
发布:在整个代码库中完成发布。首先,我创建了一个巨大的依赖图,我使用专门为项目编写的自定义工具,因为不可能直接使用Maven。然后我必须在依赖树中逐步释放一层工件,从底部开始,没有任何进一步依赖的工件,构建它们,如果成功调整父POM与新版本,然后继续下一层。有时我觉得要做两次版本控制工作,一次是在颠覆中,一次是在所有的POM中。发布插件似乎也无法自动调整依赖关系管理。
Hudson :在Hudson中,我们为所有父工件设置了20个作业。对于每个工件,有3个活动分支。这就像60个工作。每次分支更改时,都会导致浏览器中的大量鼠标单击工作。至少自动构建触发依赖作业是有效的。但是,如果将模块拆分为编译作业和报告作业,则会再次导致问题。通常编译生成报告的频率要高得多,而后者不应该减慢前者的速度。但是,只要报表作业运行,它也会触发所有编译作业。如果实际部署了工件,Hudson似乎不能仅触发依赖作业。我还尝试为整个项目制作一个巨大的多模块构建,但增量构建功能无法正常工作。没有它,构建需要太长时间。但是需要构建依赖的工件,因为您永远无法确定一个工件导致的更改。
汇总报告:我还没有弄清楚如何为每个级别的父POM生成单元测试,测试覆盖率,检查样式等的汇总报告。有些插件甚至不支持聚合选项。对于其他人,我必须为层次结构中的每个级别再次进行构建。 Maven站点报告没问题,但它们似乎相当静态,浏览时只能使用有限。也许这里更好的选择是使用像Sonar Source或其他一些源代码分析工具。此外,将这些报告整合到Hudson对我来说似乎并不理想。
从我的角度来看,我希望只有一个大型存储库,我可以在其中签出一个目录,从源代码构建所有内容,为发布制作一个标记/版本,不依赖任何外部存储库并在Hudson中配置一个作业。但这可能远离不同的开发团队需要的东西。它似乎很难找到一种可管理的方式。
答案 0 :(得分:1)
我不知道这是否是一个简单的答案,但我有一个类似的项目(代码):2个大应用程序,一个有大约10个模块,一个有15个模块。我们拥有一个subversion存储库中的所有东西(例如svn / trunk / app1和svn / trunk / app02)。在根文件夹(svn / trunk)中,我们有一个非常简单的pom,它将版本和两个应用程序定义为子模块。
通过此设置,我们可以完成您提到的大部分内容。甚至与每个开发团队分离,因为每个团队都会提交不同的文件夹/项目。我们甚至存储其他工件,例如文档和设计(svn / trunk / documentation),因此我们可以跟踪我们为特定版本提供的文档。
我知道这不能解决您的第一个问题(您无法检查所有代码库),但为什么需要“检查所有子项目的所有分支”?这听起来不对。你有与svn服务器的快速连接吗?
注意:我们不会生成合并报告,因为我们对每个应用程序的报告更感兴趣,因为它们完全不同。