当前位置: 首页 > 知识库问答 >
问题:

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

仉臻
2023-03-14

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

出于各种原因,我只想使用maven deploy插件,但显然,即使maven-surefire-plugin中存在测试失败,我仍将部署该插件。

结果而不只是

mvn clean deploy
mvn clean test && mvn deploy -DskipTests=true

编辑它似乎是詹金斯的问题..不能繁殖

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

共有1个答案

司徒瀚
2023-03-14

您遇到了Jenkins的一个已知问题(或特性,取决于品味),在Maven构建(因此是从Maven Jenkins作业模板创建的)中,默认情况下该问题总是将-dmaven.test.failure.ignore=true传递给相关的Maven构建,这主要是因为在测试失败的情况下,它会将构建的状态设置为stabilit,而不是failed

这种行为已经被添加到不同的堆栈溢出线程中,这里和这里提供一些参考,它也是Jenkins JIRA平台上的一个开放的问题(提供详细描述),尽管已经有一段时间了,可能不会被修复(或者至少在作业配置UI中澄清)。

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

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

  • 使用freestyle Jenkins作业模板,从而完全控制Maven构建执行,尽管放弃了一些不错的预配置
  • 保留Maven Jenkins作业并显式传递-dmaven.test.failure.ignore=false选项,作为初始MVN clean deploy命令
  • 的一部分
  • 将作业分成几个构建步骤,只有在上一个步骤严格成功(以及不成功/不稳定)的情况下才执行下一个步骤。第一步是经典的MVN clean install,然后是通过Maven(请参见next)或Jenkins插件进行部署(有ArtiFactory/Nexus Jenkins插件可以很好地处理此任务,其直接优势是为快照/发布提供更容易的凭据和存储库管理,从而在CI端提供更多的治理/安全性,可以消除pom.xml文件或每个开发人员的Maven设置中的干扰)。

关于只部署的额外Maven步骤,一些注意事项也解决了上面注释中的一些问题:

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

是的,您可以跳过测试,并且maven-jar-plugin不会再次重新打包应用程序,例如,Maven提供的进一步默认优化,但前者仍然会慢得多,也不太正确。
但是,deploy:deploy不能工作,因为Maven构建上下文中缺少信息,仅仅查看target文件夹不足以确定要部署什么,Maven需要知道哪个工件附加到要部署的当前构建中。在本例中,附加的jar:jar起到了拯救作用,它不是重新打包任何东西,而是简单地检测应该打包的内容,将其作为工件附加到构建上下文中,并使maven-deploy-plugin变得愉快。正如前面在注释中指出的,这个堆栈溢出回答中也解释了这个机制。

 类似资料:
  • 当战争部署失败时,我想阻止Tomcat。是否有一些钩子或监听器可以用于此? 我知道,通常情况下,当部署失败时不会让容器停止。在我的例子中,我想使用Tomcat实现一个快速失败的错误模型,因为目前没有机会用带有嵌入式Servlet引擎(例如,Spring-Boot)的胖jar替换WAR。

  • 问题内容: 我正在按照Push上的说明进行部署,以使用Jenkins测试和部署以python和Flask编写的Google App Engine应用。 测试位于应用程序的根文件夹中,该文件名为 执行外壳步骤中的命令是 我收到以下错误,由于我对Jenkins相当陌生,因此我不确定如何解决此问题。 问题答案: 这并不是一个真正的Jenkins问题-正如构建输出所指示的那样,您的shell脚本失败了,因

  • 我正在尝试在Heroku上托管Flask web应用程序,同时使用以下步骤来托管我的web应用程序: 在我完成所有这些之后,我的终端绝对没有错误,但是烧瓶应用程序仍然不工作。下面给出了Heroku的日志。 2022-02-12T09:27:20.056100 00:00heroku[router]: at=错误代码=H14 desc="没有web进程运行"方法=GET路径="/"主机=bukkit

  • 问题内容: 我为我们的maven多项目创建了一个hudson作业,其中包含5个模块,以将工件部署到maven存储库。没关系,只要它成功构建且没有测试失败即可。但是,现在我想满足以下要求: 当模块发生测试故障时,构建应继续扩建并测试其他模块,但变为黄色。使用可以完成,但在下一个要求时会失败。 当模块发生测试故障时,不应将任何工件部署到Maven存储库。 其他项目依赖于该项目的快照,而这些项目只想使用

  • 我曾尝试使用Wildfly管理控制台(Wildfly 10.1.0.Final)部署我的应用程序,但由于以下原因/错误,不幸失败: 无法上载部署:{"WFLYCTL0080:失败的服务"= 我使用了控制台上提供的替换部署功能。在此之前,我已经使用相同的函数上传了我的. war应用程序,并成功部署。 我已经在本地测试了我的应用程序,它可以在没有任何错误的情况下部署和执行。

  • 问题内容: 当我尝试部署应用程序时,出现以下错误: 问题答案: 您必须在MAVEN_HOME / conf / settings.xml节服务器中验证您的凭据 id必须与pom.xml中的分发管理中的id匹配