6

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

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

因此,而不仅仅是

mvn clean deploy

我必须将我的 CI 设置为类似于 (shell) 的两步:

mvn clean test && mvn deploy -DskipTests=true

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

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

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

我不确定 Jenkins 为什么或如何强制 maven 构建在测试失败时继续(我假设这是为了报告),但它没有显示任何传递给它的选项以使其继续。它似乎只发生在 Jenkins 说“模块已更改,重新计算依赖图”时。

4

1 回答 1

11

您遇到 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 步骤,一些注意事项也解决了上述评论中的一些问题:

和之间有一个相关的区别,前者调用 Maven 阶段,因此级联每个阶段从直到(因此,,,,,例如)和在 pom 文件中为某个阶段配置的每个潜在插件执行;相反,后者只是调用一个目标,即 的目标,具有性能的明显直接优势(它只执行一个快速操作,而不是再次执行整个构建)和关注点(它只执行我们在这个阶段真正想要的) .mvn deploymvn deploy:deployvalidatedeploycompiletestpackagedeploymaven-deploy-plugin

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

于 2016-07-20T22:21:28.163 回答