我是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说“模块改变了,重新计算依赖图”时。
答案 0 :(得分:6)
您遇到Jenkins的已知问题(或功能,取决于品味),在Maven构建中(因此从Maven Jenkins作业模板创建)将始终默认-Dmaven.test.failure.ignore=true
传递给相关的Maven构建,主要是因为在测试失败的情况下,它会将构建的状态设置为UNSTABLE
而不是FAILED
。
对于某些引用,已在不同的Stack Overflow线程here和here中添加了此行为,并且它在Jenkins JIRA平台上也是open ticket(提供详细说明) ,虽然已经有一段时间了,可能不会修复(或至少在作业配置界面中澄清)。
但是,从自由式Jenkins作业模板创建Maven构建时未提供该行为,即使用尚未为Maven预先配置的模板,因此不会传递maven.test.failure
属性默认值。
指南确实是在测试失败的情况下不会部署工件(这是maven-surefire-plugin
btw的默认行为),您可以通过不同方式解决这些问题:
-Dmaven.test.failure.ignore=false
选项作为初始mvn clean deploy
命令的一部分mvn clean install
,然后通过Maven(参见下一个)或Jenkins插件(有Artifactory / Nexus Jenkins插件,可以很好地处理这个任务,然后直接利用更快的凭据和存储库管理快照/发布,从而更多CI管理/安全性,消除pom.xml
文件或每个开发人员的maven设置中的噪音。关于仅部署的额外Maven步骤,还有一些考虑因素也可以解决上述评论中的一些问题:
mvn deploy
和mvn deploy:deploy
之间存在相关的difference,其中前者正在调用Maven阶段,因此从validate
到{deploy
级联each phase {1}}(因此,compile
,test
,package
,例如)以及pom文件中为某个阶段配置的每个潜在插件执行;后者只是调用一个目标deploy
maven-deploy-plugin
的目标,具有明显的表演直接优势(它只执行一个快速动作而不是整个构建)和关注(它只是在这个阶段执行我们真正想要的东西)。
是的,您可以跳过测试,而maven-jar-plugin
不会再次重新打包应用程序,例如,Maven提供的进一步默认优化,但前者会慢得多且不太正确。
但是,由于Maven构建上下文中缺少信息,deploy:deploy
不起作用,仅查看target
文件夹不足以识别要部署的内容,Maven需要知道哪个工件附加到要部署的当前构建。在这种情况下,额外的jar:jar
得到了解决,除了简单地检测它应该打包的内容,将其作为工件附加到构建上下文并使maven-deploy-plugin
满意之外,不重新打包任何东西。正如之前在评论中指出的那样,this Stack Overflow答案中也解释了这种机制。