16

问题:执行“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 deploy -Dmaven.test.skip=true 在同一个工作区执行:
    • 所有目标(包括部署):4:40
    • 仅部署:1:54

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

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

4

3 回答 3

31

There's a new answer now. Since version 2.8 of the maven deploy plugin there's a way to do this "natively". See the jira issue for details.

Basically you need to force at least v2.8 of the plugin

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

and use the new parameter deployAtEnd. more info here. This setting usually goes along with installAtEnd of the maven-install-plugin

于 2013-10-01T14:37:35.427 回答
2

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

一个 Maven 插件,它遍历反应器中的所有项目并单独在每个项目上执行部署。通过将工件部署推迟到安装阶段完成,可用于为反应堆生成近原子构建。

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

于 2013-08-12T21:51:03.117 回答
1

两件事情。

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

在“构建后操作”中

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

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

于 2013-08-12T21:34:31.820 回答