【问题标题】:Jenkins: How To Build multiple top-level projects from a git repository?Jenkins:如何从 git 存储库构建多个顶级项目?
【发布时间】:2012-02-13 22:09:39
【问题描述】:

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

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

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

它们可以/应该由独立的 jenkins 工作构建。所以我们有一个项目 A 和一个项目 B 的工作。

在使用 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 父(包含所有项目的聚合器)项目,该项目 触发每个项目构建(有一个詹金斯工作)。这个 pom.xml 包含 projectA 和 projectB 的元素。

您是否看到任何更有用的方法(非常典型的设置)。你的经验是什么?有什么最佳做法吗?

【问题讨论】:

  • 我非常同意 martin.ahrer 的观点,与 Subversion 相比,Git 无法签出 repo 的子项目是一个限制因素。我很好地回答这个问题会很棒。

标签: git maven jenkins


【解决方案1】:

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

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

使用版本号过于粗略。例如,今天我发现了一个仅在 hg 版本 3367 下可重现但在 hg 版本 3368 下不可重现的错误。使用多个无法重现的 hg 存储库,因为每个项目每天都有几个提交,因此它是无法准确确定每个项目使用了哪个版本,只有 hg 版本是正确使用的版本(使用 bisect 查找错误)。

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

每个项目的混合版本都会让下背部感到痛苦,因为我们会有几个不同的 dao-generator-3.1.2.jar,其中一个会有点不同(除非您期望我们在每次提交后更改版本号,或者如果 Jenkins/maven/任何自动执行此操作的配置中有一些配置?那太好了......)。

【讨论】:

    【解决方案2】:

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

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

    通常,您希望给定的 pom 生成单个工件。聚合器 pom 对于将较大工件的各个部分分解为子模块很有用,但前提是这些子模块不是自己发布的。

    【讨论】:

      【解决方案3】:

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

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

      但是 3 会更容易部署到新系统,而无需重新设置 Jenkins。

      【讨论】:

        猜你喜欢
        • 2013-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多