当前位置: 首页 > 知识库问答 >
问题:

Maven多模块仅在成功的单元测试后部署到存储库

鲜于河
2023-03-14

问题:执行“mvn部署”的最佳解决方案是什么?这样,部署部分只能在所有单元测试成功且没有重复处理步骤后运行?

我希望简单的答案是:执行maven命令'x'(或使用标志),这样部署就可以在默认生命周期中不调用先前的目标而运行。

遗憾的是,这似乎没有一个简单的答案。我已经在下面列出了我一直遵循的路径的细节。

我们有以下三个要求:

  • 执行maven部署目标,将所有多模块工件部署到远程存储库
  • 仅当所有项目中的所有单元测试都通过时才部署
  • 不要重复任何处理

我们从简单的“mvn清洁部署”开始,但我们注意到了几个问题:

  • 构建将在完成所有单元测试之前停止:: 所以我们添加了--faul-at-end标志
  • 部署目标将针对任何成功的模块执行。

这将导致损坏状态,其中远程存储库可能只有部分部署(如果在构建的后期有失败的模块)。

我们研究了3种不同的解决方案:

  1. 在部署之前暂存工件:: 这对于完全自动化的过程来说太重了。
  2. 使用配置文件来覆盖默认的生命周期,这样mvn部署-pci-部署将在不调用任何先前目标的情况下运行:: 这很有效,而且速度很快,但显然是一种非常规的方法
  3. 简单地运行mvn清洁包,然后只有iff成功地执行mvn部署:: 这似乎是有效的,并且似乎只在调用目标时受到轻微的打击(尽管其中一些足够聪明,不会重新处理不变的工作区)

我向社区提出了这个问题,并提供了背景细节,以确定是否有更好的方法或对(可能)提出以下请求之一的强烈意见:

  • 一个新的部署目标,可以独立于所有其他生命周期目标运行,并期望:之前的所有步骤都已经运行,并且它将以与“mvn部署”相同的方式执行部署。

还有一点是开箱即用的,而且绝对不符合当前的惯例:

  • 一个标志,告诉maven在继续之前为所有模块运行[unit]测试目标

笔记:

  • 我们使用的是Jenkins,但是对于这个问题,CI环境不是并发症。
  • 我尝试了mvn部署:部署目标,但它有一些不清楚的错误。
  • 我没有考虑集成测试作为需求的一部分。

更新8/20/2013

我测试了延迟部署插件,并确定该工具按预期工作,但花了很长时间。

对于我们的代码库:

  • mvn清洁部署:对于在2:44执行的所有目标
  • mvn清洁安装延迟部署插件:所有目标在15分钟内执行
  • mvn清洁包;mvn部署-pci-部署自定义构建配置文件,禁用执行的早期目标:
    • 所有目标(包括部署):4:30
    • 仅部署:1:45
    • 所有目标(包括部署):4:40

    干净的包,然后是跳过测试的部署,比延迟部署运行得更快,实现了我们将部署延迟到测试成功之后的愿望。

    当部署生命周期执行并退出前面的每个目标(流程、编译、测试、包等)时,时间似乎受到了较小的影响。然而,唯一的替代方法是破解非标准执行,这只会节省10秒。

共有3个答案

麻宜春
2023-03-14

两件事。

  1. 禁用所有以前的阶段,我不认为这是一个选项。这是maven的一个基本功能,你会改变标准的生命周期,所以我非常怀疑有人会在插件中实现一些东西来允许这个
  2. 既然你说你用Jenkins,那在jenkins里面有一个设置,专门针对最后部署的情况,保证回购不处于腐败/中间状态

在“构建后操作”中

将工件部署到Maven存储库。与标准的mvn部署相比,此功能允许您在整个构建被确认成功后部署工件。这避免了Maven中的一个典型问题,即在以后发现关键故障之前部署一些模块,从而导致存储库状态不一致。请注意,无论这种配置如何,您都可以在事后手动html" target="_blank">返回Jenkins并将过去的任何工件部署到您选择的任何存储库中。要使用此功能,不应停用自动工件归档。

我从来没有用过这个所以我不能确认它是否工作我只知道它是有这个特定的用例

张智
2023-03-14

作为替代,我也发现了这一点http://code.google.com/p/maven-deferred-deploy-plugin/

一个maven插件,它遍历一个reactor中的所有项目,并对每个项目分别执行部署。可以通过将工件部署推迟到安装阶段完成,来为Reactor生成近似原子的构建。

听起来很像你想要的。我仍然认为我的另一个答案更容易实现,因为你使用jenkins,只需选中一个复选框

严兴言
2023-03-14

现在有了新的答案。自maven部署插件的2.8版本以来,有一种方法可以“本机”实现这一点。有关详细信息,请参阅jira问题。

基本上,你需要强制至少v2。插件的第8部分

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-deploy-plugin</artifactId>
   <version>2.8</version>
</plugin>

并使用新的参数部署Atend。此设置通常与maven-Instet-plugin的InstAtend一起使用

 类似资料:
  • 公用 模型 存储库 服务 网站 我们搜索了一下,没有找到一个解决方案,当项目具有这种结构时,如何制作一个可执行的jar。 下面是父pom.xml: 有人使用Spring Boot、Maven插件和Maven模块项目结构创建了可执行的fat jar吗?

  • 对于集成测试,它更棘手,我们使用failsafe和集成测试生成文件,该文件由Sonar扫描。我的问题是,集成测试位于中,它只显示了对控制器内部的类的集成测试的测试覆盖范围,而不显示对另一个模块(如service module)中的类的集成测试的测试覆盖范围。因此,集成测试的总体测试覆盖率增加到21%,而不是35%+。 如果集成测试在中,那么是否可以配置sonar和jacoco来测量所有类的集成测试

  • 我有maven surefire插件pom.xml: 现在我希望maven只在部署目标上执行测试,因此: 当执行mvn部署测试应该运行 当执行mvn包或mvn安装时,测试不应该运行,因为目标在部署之前

  • 我刚刚使用Maven,我需要从一个Ant项目上传一些库。为了开发这个任务,我有一个文件夹,其中包含许多“pom.xml”文件,这些文件引用了我希望使用Maven在Eclipse中添加到我的项目中的jar,还有另一个xml文件,即Ant项目本身。 欢迎所有想法。谢谢

  • 我希望通过在所有模块构建和单元测试完成后从所有模块运行集成测试来加快对“简单”构建失败(编译错误和单元测试失败)的反馈。 你能提出一个实现这一点的好方法吗?

  • 我有一个父pom和两个子pom,用于jar和war文件。war文件将jar文件作为pom中的依赖项。因此,构建顺序定义如下 家长 儿童罐 儿童战争 在父pom中,模块如下所示。 要部署到Jboss的最后一个工件位于父/工作区/子war/目标/项目文件夹下。战争 当我从父工作区文件夹调用maven目标时,部署失败。 mvn清理编译安装jboss为:deploy-Dmaven。测验跳过=真 我尝试在父