Jenkins:如何从git仓库构建多个顶级项目?

23

我有一个Git仓库,其中包含一堆顶级的Maven项目(每个项目都在自己的子目录中,带有一个pom.xml文件)。这里的顶级指的是这些项目直接位于仓库根目录下的子目录中。所有这些项目都应该留在同一个Git仓库中。

repo
+--- projectA
    +--- pom.xml

+--- projectB
    +--- pom.xml

可以/应该使用独立的Jenkins任务进行构建。因此,我们为projectA和projectB各自创建一个任务。

以前在Subversion中,我能够设置一个Jenkins任务(针对每个项目),仅检出项目源代码,并从pom.xml运行Maven构建。

使用Git模型(可能与所有DVCS一样),这种方式发生了变化,我不确定什么是最佳实践。有几个选项可以考虑,但都不太理想:

  1. 每个Jenkins任务配置克隆/拉取完整的Git repo,并引用/pom.xml进行Maven构建。因此,任务具有所有代码,但仅构建其中的一部分。
  2. Git提供子模块(http://book.git-scm.com/5_submodules.html),似乎有点棘手(而且容易出错)
  3. 创建一个包含所有项目的maven父级(聚合)项目,触发每个项目的构建(只需要单个Jenkins任务)。此pom.xml包含projectA和projectB的元素。

您是否知道更有用的方法来处理此类(非常典型的)设置。你有什么经验?有什么最佳实践吗?


我非常赞同martin.ahrer的观点,与Subversion相比,Git无法检出存储库的子项目是一个限制因素。如果能给出一个好的答案就太棒了。 - djangofan
3个回答

4
我认为你的做法是逆向思考的。如果这些项目作为版本化单元发布,确实需要创建一个父POM。但是你可能只需要一个CI工作。如果你想快速构建,可以配置它仅构建自上次构建以来发生更改的模块(构建部分中的高级按钮 - “增量构建 - 仅构建已更改的模块”)。您还可以告诉Jenkins“必要时执行并行构建”以同时测试多个提交。

但我很好奇为什么你觉得需要多个CI工作?如果你认为这两个项目有不同的生命周期,也许它们应该被分别版本化,并因此位于单独的git存储库中。不要保留git存储库,它们很便宜。事实上,在几乎所有情况下,越多越好。

通常,你希望给定的pom生成单个artifact。汇聚pom用于将大型artifact的部分拆分成子模块,但前提是这些子模块不能独立发布。


1

@recampbell,我有相同的问题。我们在一个Hg仓库中有几个相互关联的项目。

这样我们就知道每个编译所处的确切版本(hg版本号)。当我说“确切”时,我的意思是我可以验证它是二进制相同的。

使用发布版本号太粗略了。例如,今天我发现一个错误只能在hg版本3367下重现,但在hg版本3368下无法重现。使用多个hg仓库将无法重现该问题,因为每天每个项目都有多个提交,因此不可能确定每个单独项目的确切版本,只有hg版本是正确的(使用二分法查找错误)。

事实证明,我们在一个子项目中更改了客户端数据库驱动程序版本,这使我们自动dao生成失败并出现NPE。驱动程序当然是发布版本,我们不写,只是使用供应商提供的版本。如果没有Jenkins每小时构建的记录,我们需要花费数天来调试,但我们知道要搜索10到20个提交,并且只有3或4个提交涉及dao生成器,因此这是一个简单的任务。

拥有每个项目的混合版本将会是一件很麻烦的事情,因为我们会有几个不同的dao-generator-3.1.2.jar文件,它们之间可能会略有不同(除非您希望我们在每次提交后更改版本号,或者在Jenkins/maven/任何其他配置中自动执行此操作?那将会很棒...)。

0

好的编程实践通常是不要重复自己。因此,从这个角度来看,拥有一个超级POM会很不错。

我可能会选择选项1。磁盘空间通常很便宜。

但选项3会使在新系统上部署变得更容易,而无需再次设置Jenkins。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接