Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jenkins:如何从git存储库构建多个顶级项目?_Git_Maven_Jenkins - Fatal编程技术网

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

Jenkins:如何从git存储库构建多个顶级项目?,git,maven,jenkins,Git,Maven,Jenkins,我有一个Git存储库,其中包含一系列顶级maven项目(每个项目都位于自己的子目录中,并带有pom.xml)。这里的顶层意味着这些项目位于存储库根目录正下方的子目录中。所有这些项目都应该保留在同一个Git存储库中 repo +--- projectA +--- pom.xml +--- projectB +--- pom.xml 它们可以/应该由独立的jenkins jobs建造。所以我们有一份工作给projectA,一份给projectB 以前使用Subversion时,我

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

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

+--- projectB
    +--- pom.xml
它们可以/应该由独立的jenkins jobs建造。所以我们有一份工作给projectA,一份给projectB

以前使用Subversion时,我能够为每个项目设置一个Jenkins作业,该作业只签出项目源代码,并从pom.xml运行Maven构建

对于Git模型(可能与所有DVC相同),这种情况会发生变化,我不确定什么是最佳实践。我看到了一些选项,但没有一个是我真正喜欢的:

  • Jenkins的每项工作都是克隆/提取完整的Git回购和 参考Maven构建的/pom.xml。那么工作呢 拥有所有代码,但只构建其中的一部分
  • Git提供的子模块()似乎 处理起来有点棘手(而且容易断裂)
  • 创建一个maven父级(包含所有项目的聚合器)项目 触发每个项目生成(具有单个jenkins作业)。此pom.xml包含projectA和projectB的元素

  • 你有没有看到更有用的方法(非常典型的设置)。你有什么经验?有什么最佳实践吗?

    嗯,有一个最佳实践就是不要重复你自己。因此,从这个角度来看,拥有一个超级POM将是一件好事

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


    但是3将使部署到新系统更容易,而无需再次设置Jenkins。

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

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


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

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

    repo
    +--- projectA
        +--- pom.xml
    
    +--- projectB
        +--- pom.xml
    
    这样我们就可以确切地知道在哪个版本(hg版本号)下彼此编译。当我说准确的时候,我的意思是我可以验证它是二进制相同的

    使用版本号的粒度太粗。例如,今天我发现了一个只在hg版本3367下可复制的bug,但在hg版本3368中不可复制。使用多个不可复制的hg回购,因为每个项目每天都有几个提交,因此不可能准确确定每个项目使用了哪个版本,只有hg版本是正确的(使用对分查找错误)

    事实证明,我们在其中一个子项目中更改了客户机数据库驱动程序版本,这使得我们的自动dao生成因NPE而失败。当然,如果我们没有编写驱动程序的发布版本,我们只使用供应商提供的版本。调试这个需要几天的时间,但由于我们每小时都使用Jenkins构建,我们知道有10到20个提交要搜索,并且只有3到4个操作了dao生成器,所以这是一个简单的任务


    每个项目都有混合版本,这对我们的后腰来说是一件痛苦的事情,因为我们会有几个不同的dao-generator-3.1.2.jar,它们会有点不同(除非您希望我们在每次提交后更改版本号,或者如果Jenkins/maven/中有一些自动执行此操作的配置,那就太好了…).

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