如何设置 SBT 构建以在 Jenkins 测试失败时返回零退出代码?

2024-04-24

当我通过 SBT 在 Jenkins 中运行 Specs2 测试时,一旦一个测试失败,构建就会被标记为失败。由于 Jenkins 通常会区分构建失败和测试失败,所以我想改变这一点。

我知道 Jenkins 中的构建失败是通过调用 SBT 的退出代码来检测的,只要至少一个测试失败,它就会返回 1。

假设我想避免改变我的选择,我有哪些选择build.sbt(或整个项目)只是为了解决这个不便?

不知何故,我认为应该可以将标准 sbt 项目放入标准 Jenkins 安装中并使其按预期工作。


tl;dr Use testResultLogger使用不会抛出异常的自定义测试结果记录器TestsFailedException这反过来又设置了非0退出代码。

刚刚注意到我错过了这个要求“为了避免改变build.sbt。您可以使用任何其他*.sbt文件,说exitcodezero.sbt or ~/.sbt/0.13/default.sbt与习俗testResultLogger.

事实证明,自从sbt0.13.5有一种方法可以实现这种行为 - 请参阅添加了设置“testResultLogger”,允许自定义测试报告 https://github.com/sbt/sbt/pull/1225 where testResultLogger出生于。

> help testResultLogger
Logs results after a test task completes.

因为它可能已被读入TestResultLogger.SilentWhenNoTests 的实现 https://github.com/sbt/sbt/blob/0.13/main/actions/src/main/scala/sbt/TestResultLogger.scala#L95这是默认值testResultLogger:

results.overall match {
  case TestResult.Error | TestResult.Failed => throw new TestsFailedException
  case TestResult.Passed                    =>
}

这意味着当执行测试出现问题时,TestsFailedException抛出异常,然后捕获该异常并报告如下:

[error] Failed: Total 3, Failed 1, Errors 0, Passed 2
[error] Failed tests:
[error]         HelloWorldSpec
[error] (test:test) sbt.TestsFailedException: Tests unsuccessful

我的想法是无论执行测试的结果如何都禁止抛出异常。将以下内容添加到build.sbt并始终保留退出代码0:

testResultLogger in (Test, test) := new TestResultLogger {
    import sbt.Tests._
    def run(log: Logger, results: Output, taskName: String): Unit = {
        println("Exit code always 0...as you wish")
        // uncomment to have the default behaviour back
        // TestResultLogger.SilentWhenNoTests.run(log, results, taskName)
    }
}

取消注释TestResultLogger.SilentWhenNoTests.run恢复默认行为。

➜  failing-tests-dont-break-build  xsbt test; echo $?
JAVA_HOME=/Library/Java/JavaVirtualMachines/java8/Contents/Home
SBT_OPTS= -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -Dfile.encoding=UTF-8
[info] Loading global plugins from /Users/jacek/.sbt/0.13/plugins
[info] Set current project to failing-tests-dont-break-build (in build file:/Users/jacek/sandbox/failing-tests-dont-break-build/)
[info] HelloWorldSpec
[info]
[info] The 'Hello world' string should
[info] x contain 11 characters
[error]    'Hello world' doesn't have size 12 but size 11 (HelloWorldSpec.scala:7)
[info]
[info] + start with 'Hello'
[info] + end with 'world'
[info]
[info] Total for specification HelloWorldSpec
[info] Finished in 15 ms
[info] 3 examples, 1 failure, 0 error
Exit code always 0...as you wish
[success] Total time: 1 s, completed Sep 19, 2014 9:58:09 PM
0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何设置 SBT 构建以在 Jenkins 测试失败时返回零退出代码? 的相关文章

随机推荐

  • MS Access 2003 - 连接表单上相同 ID 的字段类型

    好吧 工作中的一个人有一个小的访问数据库 他用它来跟踪事情 他使用的表单已经查询了他需要的内容并在表单上生成了结果 这确实是他所需要的 有一件事是 他对每条记录都有重复项 这些记录以不同的 类型 作为字段 标识符 我称之为 这是一个例子 I
  • Python Pandas Dataframe,删除任何列中值为“None”的所有行

    我有一个大数据框 创建时 None 用作无法计算数字的值 而不是 nan 如何删除任何列中包含 无 的所有行 我虽然我可以使用df dropna并设置值na 但我似乎做不到 Thanks 我认为这是数据框的一个很好的表示 temp pd D
  • 当输入类型为“文件”时,$dirty 无法按预期工作

    我对 AngularJS 很陌生 问题是我有一个包含两个字段的表单 名称和个人资料图片 如下面的代码所示 我正在使用 ng upload https github com twlson63 ngUpload https github com
  • iphone 的视图变灰了,怎么办?

    我想知道使视图部分变灰的方法是什么 类似于 UIAlertView 将除消息框之外的所有内容变灰的方式 现在我在目标区域顶部使用另一个自定义视图 但它看起来不太好 有任何想法吗 我使用您已经尝试过的方法得到了很好的结果 也许摆弄阿尔法是个好
  • 在 TypeScript 中,如何引用属于联合类型一部分的类型?

    我在 TypeScript 中为操作定义了一个联合类型 type Action type reset type add payload number type minus payload number 在某些函数中 我想引用联合类型的一部分
  • 无法理解调用签名

    如果这是一个有点愚蠢的问题 我深表歉意 我听说过一些有关 Typescript 中的调用签名的信息 但我不明白它们到底是做什么的 Typescript 文档说 在 JavaScript 中 函数除了可调用之外还可以具有属性 但是 函数类型表
  • Java 中将对象与 null 进行比较

    我正在尝试验证一个对象是否是null或不 使用以下语法 void renderSearch Customer c System out println search customer rendering gt try if c equals
  • Access 2010中的TableDef对象需要什么参考

    我正在尝试在新的 Access 2010 Access 安装中使用在 Access 2003 中编写的宏 mdb 文件 打开我的文件时出现编译错误TableDef无法找到对象 当我检查 工具 gt 参考 菜单时 我看到 Microsoft
  • Docker 远程上的 Pycharm 远程解释器:[Errno 2] 没有这样的文件或目录

    正如标题中所指定的 我尝试在 LAN 中的远程服务器上托管的 Docker 计算机中使用 Pycharm Professional 2018 2 和 python 远程解释器 我按照帮助创建了一个非常简单的示例 https www jetb
  • 用任意参数替换 sympy 函数

    这应该是一项简单的任务 但我很难让它在 Sympy 中工作 我想用特定公式替换带有任意参数的未定义函数 例如 from sympy import var a b c f Function f test f a b lin test subs
  • 无法加载文件或程序集

    当我尝试在 Visual Studio 2008 中进行调试时 出现以下错误 我已经清理了 ASP NET 临时文件夹并重新启动了 VS 我还删除了所谓的破坏性参考并将其添加回来 但似乎没有任何作用 有没有人遇到过类似的情况并且有解决方案吗
  • Mac 上的 Google Chrome 开发者工具键盘快捷键自定义

    我使用 Firefox Firebug 进行调试 但如果我可以自定义键盘快捷键 我会切换到 Google Chrome I need to activate and hide the developer tools gt inspect E
  • 在 OWIN 托管的 SignalR 实现中接受 ASP.NET 表单身份验证 cookie?

    我有一个使用 OWIN 的自托管 SignalR 实例 我想实施授权 我的用户已经使用表单身份验证登录到 ASP NET MVC 应用程序 由于两个应用程序可在同一 URL 上使用 因此 cookie 将在两者之间共享 如何在自托管 Sig
  • 将 AWS Lambda 设置为权限策略中的主体

    我有一个非常具体的 AWS Lambda 函数 我想将其作为 AWS Secret Manager 权限策略的主体 以便它可以检索机密 我想专门将此权限授予我的 Lambda 我创建了一个角色并将该角色分配给该策略 然而 我希望能够明确地写
  • 由于 ssl 错误,无法在 python 3.6 中 pip 安装软件包

    我正在远程服务器上工作 当我尝试在虚拟环境中使用 pip 安装任何内容时 出现错误 venv barta bivoj program pip install r requirements txt pip is configured with
  • java方法中的可选参数

    我想制作一个需要 1 个必需参数和 1 个可选参数的方法 但我发现如何制作一个可选数组 方法是在参数 int b 中制作 但这是一个数组 我想制作它只是这个值是 null 或用户输入它 我可以通过创建 2 个同名的方法来实现它 但一个具有单
  • Android:如何将十字图标放在 autocompletetextView 顶部

    我在将十字按钮放在文本视图顶部时遇到问题 我正在使用 LinearLayout 并且它没有出现 而在 Framelayout 上它可以工作 但这并不能解决我的目的 我附上我的 XML 供参考 请帮助我解决这个问题
  • cppreference 使用术语“[对象的]标识”对于 c++11 和 c++17 来说是两种不同的含义吗?

    我以为我已经设法完全理解 在其他 SO 问题的帮助下 谢谢 C 17 关于值类别的更改 但现在我注意到这个问题 这表明我并不真正理解它们 在 C 11 中 对值类别有 具有同一性 可以从其中移动 的解释 并且 同一性 含义的定义仍然存在于参
  • 使用 Gremlin 查询语言获取边属性以及源和目标顶点 ID

    我正在尝试检索边缘属性作为值以及目标和源节点 ID 我当前的数据库如下所示 Edge id label outV inV name ID 0 edge 0 1 E 0 Nodes id label name ID 0 node A 0 1
  • 如何设置 SBT 构建以在 Jenkins 测试失败时返回零退出代码?

    当我通过 SBT 在 Jenkins 中运行 Specs2 测试时 一旦一个测试失败 构建就会被标记为失败 由于 Jenkins 通常会区分构建失败和测试失败 所以我想改变这一点 我知道 Jenkins 中的构建失败是通过调用 SBT 的退