保持maven部署插件免于部署测试失败

时间:2016-07-20 16:52:10

标签: maven jenkins maven-surefire-plugin maven-deploy-plugin

我是maven-release-plugin的长期用户,如果有单元测试失败,它将不会发布(也就是将jar部署到maven repo)。

出于各种原因,我只想使用maven部署插件,但即使maven-surefire-plugin中存在测试失败,显然仍会部署。

因此而不仅仅是

mvn clean deploy

我必须设置我的CI与(shell)进行两步操作:

mvn clean test && mvn deploy -DskipTests=true

我已经确定肯定没有设置忽略失败。理想情况下,我不想运行两个单独的进程。

当然,测试失败的部署不能是默认的吗?我错过了什么吗?

编辑它似乎是詹金斯问题..无法重现

我不确定Jenkins为什么或如何强制maven构建继续测试失败(我假设这是用于报告)但它没有显示任何传递给它的选项以继续。它似乎只发生在Jenkins说“模块改变了,重新计算依赖图”时。

1 个答案:

答案 0 :(得分:6)

您遇到Jenkins的已知问题(或功能,取决于品味),在Maven构建中(因此从Maven Jenkins作业模板创建)将始终默认-Dmaven.test.failure.ignore=true传递给相关的Maven构建,主要是因为在测试失败的情况下,它会将构建的状态设置为UNSTABLE而不是FAILED

对于某些引用,已在不同的Stack Overflow线程herehere中添加了此行为,并且它在Jenkins JIRA平台上也是open ticket(提供详细说明) ,虽然已经有一段时间了,可能不会修复(或至少在作业配置界面中澄清)。

但是,从自由式Jenkins作业模板创建Maven构建时未提供该行为,即使用尚未为Maven预先配置的模板,因此不会传递maven.test.failure属性默认值。

指南确实是在测试失败的情况下不会部署工件(这是maven-surefire-plugin btw的默认行为),您可以通过不同方式解决这些问题:

  • 使用自由式Jenkins作业模板,因此可以完全控制Maven构建执行,但放弃了一些不错的预配置
  • 保留Maven Jenkins作业并明确传递-Dmaven.test.failure.ignore=false选项作为初始mvn clean deploy命令的一部分
  • 在几个构建步骤中拆分作业,只有在前一个严格成功(并且不成功/不稳定)时才执行下一个作业。第一步是经典的mvn clean install,然后通过Maven(参见下一个)或Jenkins插件(有Artifactory / Nexus Jenkins插件,可以很好地处理这个任务,然后直接利用更快的凭据和存储库管理快照/发布,从而更多CI管理/安全性,消除pom.xml文件或每个开发人员的maven设置中的噪音。

关于仅部署的额外Maven步骤,还有一些考虑因素也可以解决上述评论中的一些问题:

mvn deploymvn deploy:deploy之间存在相关的difference,其中前者正在调用Maven阶段,因此从validate到{deploy级联each phase {1}}(因此,compiletestpackage,例如)以及pom文件中为某个阶段配置的每个潜在插件执行;后者只是调用一个目标deploy maven-deploy-plugin的目标,具有明显的表演直接优势(它只执行一个快速动作而不是整个构建)和关注(它只是在这个阶段执行我们真正想要的东西)。

是的,您可以跳过测试,而maven-jar-plugin不会再次重新打包应用程序,例如,Maven提供的进一步默认优化,但前者会慢得多且不太正确。
但是,由于Maven构建上下文中缺少信息,deploy:deploy不起作用,仅查看target文件夹不足以识别要部署的内容,Maven需要知道哪个工件附加到要部署的当前构建。在这种情况下,额外的jar:jar得到了解决,除了简单地检测它应该打包的内容,将其作为工件附加到构建上下文并使maven-deploy-plugin满意之外,不重新打包任何东西。正如之前在评论中指出的那样,this Stack Overflow答案中也解释了这种机制。