问题:执行“mvn deploy”的最佳解决方案是什么,以便部署部分仅在所有单元测试成功且不重复处理步骤后运行?
我希望简单的答案是:执行 maven 命令“x”(或使用标志),以便可以在不调用默认生命周期中的先前目标的情况下运行部署。
可悲的是,这似乎没有一个简单的答案。我已经在下面列出了到目前为止我所遵循的路径的详细信息。
我们有以下三个要求:
- 执行 Maven 部署目标,将所有多模块工件部署到远程存储库。
- 只有在所有项目的所有单元测试都通过时才部署。
- 不要重复任何处理。
我们从简单的“mvn clean deploy”开始,但是我们注意到了几个问题:
- 构建将在完成所有单元测试之前停止 :: 所以我们添加了 --fail-at-end 标志
- 部署目标将针对任何成功的模块执行。
这会导致远程存储库可能只有部分部署的“损坏”状态(如果在构建后期有模块出现故障)。
我们研究了 3 种不同的解决方案:
- 在部署之前暂存工件:这被确定为对于完全自动化的过程来说太重了。
- 使用配置文件覆盖默认生命周期,这样“mvn deploy -Pci-deploy”就可以在不调用任何先前目标的情况下运行:这很有效并且速度很快,但显然是一种非常规的方法。
- 只需运行“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 秒。