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

Jar*_*red 13 deployment unit-testing maven

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

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

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

我们有以下三个要求:

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

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

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

这导致"损坏"状态,其中远程存储库可能仅具有部分部署(如果在构建中稍后存在具有故障的模块).

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

  1. 在部署之前暂存工件::这被认为对于完全自动化的过程来说太重了.
  2. 使用配置文件覆盖默认生命周期,以便'mvn deploy -Pci-deploy'可以在不调用任何先前目标的情况下运行::这种方法很有效,而且速度很快,但显然是一种非传统的方法.
  3. 只需运行'mvn clean package',然后只有成功执行'mvn deploy'::这似乎有效,并且在调用目标时似乎只会受到轻微打击(尽管其中一些非常聪明,不能重新处理未更改的工作空间) )

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

  • 一个新的部署目标,可以与所有其他生命周期目标分开运行,并期望:所有先前的步骤已经运行,并且它将执行与"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清洁包; mvn deploy -Pci-deploy自定义构建配置文件,禁用先前执行的目标:
    • 所有目标(包括部署):4:30
    • 仅部署:1:45
  • mvn清洁包; mvn在执行的同一工作区上部署-Dmaven.test.skip = true:
    • 所有目标(包括部署):4:40
    • 仅部署:1:54

除了延迟部署之后,部署跳过测试的干净程序包运行得更快,并且在测试成功之后实现了延迟部署的愿望.

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

Hil*_*kus 31

现在有一个新的答案.从maven部署插件的2.8版开始,有一种方法可以"本地"执行此操作.有关详细信息,请参阅jira问题.

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

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-deploy-plugin</artifactId>
   <version>2.8</version>
</plugin>
Run Code Online (Sandbox Code Playgroud)

并使用新参数deployAtEnd.更多信息在这里.此设置通常与installAtEndmaven-install-plugin一起使用