当单元测试失败时,Jenkins成功(Rails)

时间:2012-07-13 05:53:32

标签: ruby-on-rails-3 jenkins

我几乎没有开始使用Jenkins,这是我迄今为止遇到的第一个问题。基本上我的jenkins工作总是成功,即使在某些测试中发生了错误。这就是我在shell配置中运行的内容:

bundle install 
rake db:migrate:reset
rake test:units
rake spec:models

事情是Jenkins只报告失败的任务是最后一个失败。例如,如果我将“rake test:units”放在最后一个任务中,它会在出现问题时通知错误。使用此配置我只会获得rspec测试的错误报告,但不会获得单元测试的错误报告。

有人想知道为什么我不仅使用rspec或单元测试,我们目前正在迁移到rspec,但这个问题仍然很痛苦。

这是来自Jenkinsm的日志的一部分,因为您可以看到其中一个单元测试失败但jenkins仍然成功完成。

314 tests, 1781 assertions, 1 failures, 0 errors, 0 skips
rake aborted!
Command failed with status (1): [/var/lib/jenkins/.rvm/rubies/ruby-1.9.3-p1...]

Tasks: TOP => test:units
(See full trace by running task with --trace)
Lot of rspec tests here....
Finished in 3.84 seconds
88 examples, 0 failures, 42 pending
Pushing HEAD to branch master of origin repository
Pushing HEAD to branch master at repo origin
Finished: SUCCESS

3 个答案:

答案 0 :(得分:18)

Jenkins通过将命令写入临时文件然后使用/bin/sh -xe运行脚本来执行您在“构建步骤”框中键入的命令。

通常这会产生预期效果:命令按顺序执行(并打印),当命令失败时脚本立即中止,即以非零退出代码退出。

如果您没有这样做,唯一的原因可能是您已覆盖此行为。您可以通过使用以下两个字符开始构建步骤的第一行来覆盖它:#!

例如,如果您的构建步骤如下所示:

#!/bin/bash
bundle install
rake db:migrate:reset
rake test:units
rake spec:models

然后它意味着Jenkins会将脚本写入临时文件,并将使用/bin/bash执行。当像这样调用时,bash会逐个执行命令,而不管它们是否成功。 bash进程的退出代码将是脚本中最后一个命令的退出代码,当脚本结束时,Jenkins将会看到该代码。

所以,请注意你在构建步骤的第一行放置的内容。如果你不知道shell是如何工作的,那就不要放哈希,让詹金斯决定如何运行脚本。

如果您需要更多地控制Build Step的执行方式,您应该研究您使用的shell的手册页,以了解如何使其按照您想要的方式运行。詹金斯在这里没有太大的作用。它只是按照你想要的方式执行shell。

答案 1 :(得分:5)

Jenkins只能查看最后一个命令运行的结果代码,因此无法知道rake test:units的结果是什么。

最简单的事情可能是将这些命令的每个命令作为单独的jenkins构建步骤。

答案 2 :(得分:5)

另一种解决方案是将您的第一行更改为以下内容:

#!/bin/bash -e

如果脚本中的任何命令返回错误,这将告诉您的脚本失败。

请参阅:Automatic exit from bash shell script on error