我是 maven-release-plugin
的长期用户如果单元测试失败,它将不会发布(也就是将 jars 部署到 maven repo)。
由于各种原因,我只想使用 maven 部署插件,但即使 maven-surefire-plugin
中存在测试失败,显然仍会部署。 .
因此,而不仅仅是
mvn clean deploy
我必须将我的 CI 设置为类似于 (shell) 的两步:
mvn clean test && mvn deploy -DskipTests=true
我已确保没有将surefire 设置为忽略失败。理想情况下,我不想运行两个单独的进程。
当然不能默认部署测试失败?我错过了什么吗?
编辑它似乎是 Jenkins 问题.. 无法重现
我不确定 Jenkins 为什么或如何强制 maven 构建在测试失败时继续(我假设这是为了报告),但它没有显示任何传递给它的选项以使其继续。它似乎只发生在 Jenkins 说“模块已更改,重新计算依赖图”时。
最佳答案
您遇到了 Jenkins 的一个已知问题(或功能,取决于口味),在 Maven 构建中(因此从 Maven Jenkins 作业模板创建)将始终默认通过 -Dmaven.test.failure.ignore=true
到相关的 Maven 构建,主要是因为它将构建的状态设置为 UNSTABLE
而不是 FAILED
在测试失败的情况下。
此行为已在不同的 Stack Overflow 线程中处理,here和 here对于一些引用,它也是 open ticket (提供详细描述)在 Jenkins JIRA 平台上,虽然已经有一段时间了,可能不会被修复(或至少在作业配置 UI 中澄清)。
但是,当从自由式 Jenkins 作业模板创建 Maven 构建时不提供该行为,也就是说,使用尚未为 Maven 预先配置的模板,因此没有 maven.test.failure
默认情况下会传递属性。
指南确实是在测试失败的情况下不部署 Artifact (这是 maven-surefire-plugin
顺便说一句的默认行为),您可以通过不同的方式解决它:
-Dmaven.test.failure.ignore=false
选项作为初始 mvn clean deploy
的一部分命令 mvn clean install
,然后下一步是通过 Maven(请参阅下一个)或 Jenkins 插件(有 Artifactory/Nexus Jenkins 插件可以很好地处理此任务,其直接优势是更容易快照/发布的凭据和存储库管理,因此更多CI 方面的治理/安全性,从 pom.xml
文件或每个开发人员的 maven 设置中消除噪音)。 关于仅部署的附加 Maven 步骤,一些注意事项也解决了上述评论中的一些问题:
有一个相关的difference
mvn deploy
之间和 mvn deploy:deploy
, 前者调用 Maven 阶段,因此在级联 each phase来自 validate
直到 deploy
(因此, compile
, test
, package
,例如)以及在 pom 文件中为某个阶段配置的每个潜在插件执行;后者只是调用一个目标,deploy
maven-deploy-plugin
的目标,具有性能的明显直接优势(它只执行一个快速操作,而不是再次执行整个构建)和关注点(它只执行我们在这个阶段真正想要的东西)。是的,您可以跳过测试和
maven-jar-plugin
不会再次重新打包应用程序,例如,以及 Maven 提供的进一步默认优化,但前者仍然会慢得多且不正确。但是,
deploy:deploy
由于 Maven 构建上下文中缺少信息而无法工作,只需查看 target
文件夹不足以识别要部署的内容,Maven 需要知道哪个 Artifact 附加到要部署的当前构建。额外的jar:jar
在这种情况下来救援,不重新打包任何东西,而只是检测它应该打包的内容,将其作为 Artifact 附加到构建上下文并制作maven-deploy-plugin
快乐的。 this 中也解释了这种机制。正如之前在评论中指出的那样,堆栈溢出答案。
关于maven - 防止 Maven 部署插件在测试失败时进行部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38486416/