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

时间:2012-01-19 08:13:13

标签: git maven jenkins

我有一个Git存储库,其中包含一堆顶级maven项目(每个项目都位于自己的子目录中,并带有pom.xml)。这里的顶级意味着这些项目位于存储库根目录下的子目录中。所有这些项目都应保留在同一个Git存储库中。

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

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

他们可以/应该由独立的詹金斯工作建立。所以我们有一个projectA的工作和一个projectB的工作。

以前使用Subversion,我能够设置一个Jenkins作业(对于每个项目),只检查项目源并从pom.xml运行Maven构建。

使用Git模型(可能与所有DVCS相同),这会发生变化,我不确定什么是最佳做法。我看到了一些选项,我不喜欢这些选项:

  1. 每个Jenkins的工作都是configured来克隆/拉出完整的Git仓库和 指的是Maven构建的/pom.xml。所以工作 拥有所有代码,但只构建它的一部分。
  2. Git提供了似乎的子模块(http://book.git-scm.com/5_submodules.html) 处理起来有点棘手(并且可以轻松破解)
  3. 创建一个maven父(包含所有项目的聚合器)项目 触发每个项目构建(有一个jenkins工作)。这个pom.xml包含projectA和projectB的元素。
  4. 您是否看到了更有用的方法(非常典型的设置)。你有什么经历?任何最佳做法?

3 个答案:

答案 0 :(得分:4)

我认为你在这里反对粮食。如果这些项目作为版本化单元发布,您确实应该创建父POM。但是你应该只有一个CI工作。如果您希望快速构建该构建,则可以将其配置为仅构建自上次构建以来已更改的模块(构建部分中的高级按钮 - “增量构建 - 仅构建已更改的模块”)。您还可以告诉Jenkins“必要时执行并发构建”以一次测试多个提交。

但我很好奇为什么你认为你想要多个CI工作?如果你认为这两个项目有不同的生命周期,也许它们应该单独编辑,因此应该在单独的git存储库中。不保存git存储库,它们很便宜。事实上,几乎在每种情况下越多越好。

通常,您希望给定的pom生成单个工件。聚合器poms可用于将较大的工件的一部分拆分为子模块,但仅限于这些子模块不能自行释放。

答案 1 :(得分:1)

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

这样我们确切地知道在哪个版本(hg版本号)下,彼此编译。当我准确地说,我的意思是我可以验证它是二进制相同的。

使用版本号太粗糙了。例如,今天我发现了一个只能在hg版本3367下重现但在hg版本3368中不能重现的错误。使用多个hg repos本来是不可重现的,因为每天每个项目中有几个提交,因此它是不可能确切地确定每个项目的使用版本,只有hg版本是正确使用的(使用bisect来查找错误)。

事实证明,我们更改了其中一个子项目中的客户端数据库驱动程序版本,这使得我们的自动化dao-generation因NPE而失败。驱动程序当然如果是我们不写的发布版本,我们只需使用供应商提供的版本。我们需要几天的时间来调试它,但由于我们每小时使用Jenkins进行构建,我们知道有10到20个提交进行搜索,只有3或4次触及dao-generator,所以这是一项简单的任务。

每个项目的混合版本都会让后排的后背变得很痛苦,因为我们会有几个不同的dao-generator-3.1.2.jar,它们彼此之间有点不同(除非你期望我们在每次提交后更改版本号,或者如果在Jenkins / maven中有一些配置/自动执行此操作的任何配置?那就太棒了......)。

答案 2 :(得分:0)

有最好的做法就是不要重复自己。因此,从这个角度来看,拥有超级POM会很好。

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

但是,如果不再重新设置Jenkins,3可以更容易部署到新系统。