防止 Maven 部署插件在测试失败时部署

Keeping the maven deploy plugin from deploying on test failures

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

出于各种原因,我只想使用 maven 部署插件,但即使 maven-surefire-plugin.

中存在测试失败,显然仍会部署

因此而不仅仅是

mvn clean deploy

我必须设置我的 CI 来执行类似于 (shell) 的两步操作:

mvn clean test && mvn deploy -DskipTests=true

我已确保 surefire 未设置为忽略失败。理想情况下,我不希望 运行 两个单独的进程。

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

编辑它似乎是 Jenkins 问题。无法重现

我不确定 Jenkins 为什么或如何强制 maven 构建在测试失败时继续(我假设这是为了报告)但它没有显示传递给它的任何选项以使其继续。它似乎只在 Jenkins 说 "Modules changed, recalculating dependency graph".

时才会发生

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

Jenkins JIRA 平台上的不同 Stack Overflow 线程 and here for some references, and it is also an open ticket(提供详细说明)已经解决了此行为,尽管已经有一段时间并且可能不会修复(或至少在作业配置 UI).

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

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

  • 使用自由式 Jenkins 作业模板并因此完全控制 Maven 构建执行,尽管放弃了一些不错的预配置
  • 保留 Maven Jenkins 作业并显式传递 -Dmaven.test.failure.ignore=false 选项作为初始 mvn clean deploy 命令的一部分
  • 将作业拆分为多个构建步骤,只有在前一个完全成功的情况下才执行下一个(而不是 successful/unstable)。第一步是经典的 mvn clean install,然后下一步是通过 Maven(见下文)或 Jenkins 插件(有 Artifactory/Nexus Jenkins 插件可以很好地处理这个任务,直接snapshot/releases 的凭据和存储库管理更简单,因此 CI 端有更多 governance/security,消除了 pom.xml 文件或每个开发人员的 Maven 设置中的噪音)。

关于只会部署的额外 Maven 步骤,一些注意事项也解决了上面评论中的一些要点:

validatedeploy 有一个相关的 difference between mvn deploy and mvn deploy:deploy, where the former is invoking a Maven phase and hence in cascade each phase(因此,例如 compiletestpackage)和在特定阶段的 pom 文件中配置的每个潜在插件执行;后者只是调用一个目标,maven-deploy-plugindeploy 目标,具有明显的直接性能优势(它只执行一个快速动作,而不是再次执行整个构建)和关注点(它只是在这个阶段执行我们真正想要的。

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