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

Ada*_*ent 4 maven maven-deploy-plugin jenkins maven-surefire-plugin

maven-release-plugin如果有单元测试失败,我很长时间不会发布(也就是将jar部署到maven repo).

出于各种原因,我想只使用maven部署插件,但显然即使在测试失败的情况下仍会部署maven-surefire-plugin.

因此而不仅仅是

mvn clean deploy
Run Code Online (Sandbox Code Playgroud)

我必须设置我的CI与(shell)做两步:

mvn clean test && mvn deploy -DskipTests=true
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

A_D*_*teo 6

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

这种行为已经在不同的Stack Overflow线程中得到了解决,这里这里有一些参考,它也是Jenkins JIRA平台上的一个开放票(提供详细描述),虽然已经有一段时间了,可能不会被修复(或者至少在作业配置UI中澄清).

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

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

  • 使用自由式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,其中前者被调用一个Maven相位,并因此在级联的每个阶段validate直到deploy(因此,compile,test,package,例如),并且每个和在POM文件配置某种相位每一个潜在的插件执行; 后者只是调用一个目标,这个deploy目标maven-deploy-plugin明显具有表演的直接优势(它只执行一个快速动作而不是整个构建)和关注点(它只执行我们在这个阶段真正想要的) .

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

  • 很好的答案——供新版本的 Jenkins(maven 集成插件?)参考,有一个构建后操作“部署到 Maven 存储库”可以工作,但需要在插件或 pom 中显式配置存储库,所以它不是与添加构建后部署:部署步骤一样好,该步骤遵循 settings.xml 等:/ (3认同)