maven - 防止 Maven 部署插件在测试失败时进行部署

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

我是 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 线程中处理,herehere对于一些引用,它也是 open ticket (提供详细描述)在 Jenkins JIRA 平台上,虽然已经有一段时间了,可能不会被修复(或至少在作业配置 UI 中澄清)。

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

指南确实是在测试失败的情况下不部署 Artifact (这是 maven-surefire-plugin 顺便说一句的默认行为),您可以通过不同的方式解决它:

  • 使用自由风格的 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 步骤,一些注意事项也解决了上述评论中的一些问题:

    有一个相关的difference mvn deploy之间和 mvn deploy:deploy , 前者调用 Maven 阶段,因此在级联 each phase来自 validate直到 deploy (因此, compiletestpackage ,例如)以及在 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/

    相关文章:

    java - 无法将 Java 中的 Azure Function 部署到 Azure 云上

    java - Spring Boot Web 应用程序中的语言翻译

    jenkins - 使用 Quality Gate 插件在 Jenkins 中构建失败

    jenkins - 如何从 Jenkins pipeline Groovy 脚本访问收集的工件?

    jenkins - 在 Jenkins 作业中的 Bash 脚本中引用全局凭据

    maven-surefire-plugin 忽略 pom.xml 中的插件顺序

    maven - 如何丑化代码仅用于maven中的部署

    Maven 自动化版本控制和变更日志生成

    java - Maven编译找不到src/main/resources目录

    eclipse - 升级到 JDK 1.8 后 Maven Surefire 测试失败