仅在成功进行单元测试后,Maven多模块才会部署到存储库

时间:2013-08-12 17:04:29

标签: unit-testing maven deployment

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

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

可悲的是,这似乎没有一个简单的答案。我已经将详细信息包含在我到目前为止所遵循的路径中。

我们有以下三个要求:

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

我们从简单的“mvn clean deploy”开始,但是我们注意到了几个问题:

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

这导致“损坏”状态,其中远程存储库可能只有部分部署(如果在构建中稍后有模块出现故障)。

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

  1. 在部署之前暂存工件::对于完全自动化的流程,这被认为太重了。
  2. 使用配置文件覆盖默认生命周期,以便'mvn deploy -Pci-deploy'可以在不调用任何先前目标的情况下运行::这种方法很有效,但很快,但显然是一种非传统方法。
  3. 只需运行'mvn clean package'然后只有成功执行'mvn deploy'::这似乎有效并且在调用目标时似乎只会受到轻微打击(尽管其中一些很聪明,不能重新处理工作空间不变)
  4. 我向社群提出这个问题,并提供我提供的背景详细信息,以确定是否有更好的方法或强烈的意见(可能)提出以下请求之一:

    • 一个新的部署目标,可以与所有其他生命周期目标分开运行,并期望:所有先前的步骤已经运行,并且它将执行与“mvn deploy”相同的部署
    • 部署目标中的一个标志,可以有效地禁用之前的目标。

    开箱即用,绝对违反当前的惯例:

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

    注意:

    • 我们正在使用Jenkins,但出于这个问题的目的,CI环境并不复杂。
    • 我尝试了'mvn deploy:deploy'目标,但它有一些不明确的错误。
    • 我没有考虑将集成测试作为要求的一部分。

    2013年8月20日更新

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

    对于我们的代码库:

    • mvn clean deploy:用于在2:44执行的所有目标
    • mvn clean install'deferred-deploy-plugin':用于15分钟内执行的所有目标
    • mvn clean package; mvn deploy -Pci-deploy自定义构建配置文件,禁用先前执行的目标:
      • 用于所有目标(包括部署):4:30
      • 仅部署:1:45
    • mvn clean package; mvn deploy -Dmaven.test.skip =在同一工作区上执行
      • 用于所有目标(包括部署):4:40
      • 仅部署:1:54

    在部署跳过测试之后,干净的软件包运行得比延迟部署更快,并且在测试成功之前完成了延迟部署的愿望。

    部署生命周期执行并退出前面的每个目标(进程,编译,测试,包等)时,似乎有一点点时间。然而,唯一的选择是破解非标准执行,只能节省10秒。

3 个答案:

答案 0 :(得分:29)

现在有一个新的答案。从maven部署插件的2.8版开始,就可以实现这一目标"本地"。有关详细信息,请参阅the jira issue

基本上你需要强制插件的至少v2.8

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

并使用新参数deployAtEnd。更多信息here。此设置通常与maven-install-plugin

installAtEnd一起使用

答案 1 :(得分:2)

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

  

一个maven插件,它遍历反应堆中的所有项目   在每个项目上单独执行部署。可以用来生产   通过延迟工件部署来实现反应堆的近原子构建   直到安装阶段完成。

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

答案 2 :(得分:1)

两件事。

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

      

    将工件部署到Maven存储库。与之相比   标准的mvn deploy,此功能允许您在之后部署工件   确认整个构建成功。        这可以防止Maven中的典型问题,在某些模块被部署之前,在发现严重故障之前,   呈现存储库状态不一致。        请注意,无论此配置如何,您都可以手动返回Jenkins并将任何过去的工件部署到   事后,您选择的任何存储库。        要使用此功能,您不应停用自动工件存档。

    我从未使用过这个,所以我无法确认它是否有效,我只是知道这个用于特定用例