2012-07-13 83 views
10

我几乎没有开始使用詹金斯,这是迄今为止我遇到的第一个问题。基本上,即使在某些测试中发生错误,我的詹金斯工作总是会成功。这是我在shell配置快到:詹金斯成功,当单元测试失败(Rails)

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

的事是当它失败的任务是最后一个詹金斯只报告失败。例如,如果我把“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 

回答

18

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

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

如果这没有发生在你身上,唯一的原因可能是你已经覆盖了这种行为。您可以通过以下两个字符开始构建步骤的第一行来覆盖它:#!

例如,如果你的构建步骤如下:

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

那么就意味着詹金斯将脚本写入到一个临时文件,它会与/bin/bash执行。当被这样调用时,bash将一个接一个地执行命令,而不关心它们是否成功。 bash进程的退出代码将作为脚本中最后一个命令的退出代码,脚本结束时将由Jenkins看到。

因此,请注意您在Build步骤的第一行放置了什么。如果你不知道shell是如何工作的,那么千万不要使用hash-bang,并让Jenkins决定脚本应该如何运行。

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

+1

你确实是对的,我已经有了“#!/ bin/bash”作为第一行:) – 2012-09-11 06:24:45

+1

如果你添加了'#!/ bin/bash -x'你可以得到Jenkins显示命令的部分在脚本输出中运行。真的,它只是你不希望从Jenkins的默认'-xe'得到的'-e' – ZombieDev 2013-09-13 23:00:41

5

詹金斯只能看到最后一个命令运行的结果代码,以便它有没有知道什么的rake test:units结果的方式。

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

+0

我不知道,它现在有效,thx! – 2012-07-13 08:12:04

+0

这个答案是100%正确的,但我不认为这是一个好主意,让人们认为每个命令作为一个单独的构建步骤是詹金斯的最佳实践。请参阅下面的答案。 – sti 2012-07-13 21:01:17

+0

只要明确每个子步骤是独立运行的,为每个易碎部分分配一个子步骤并不是一个坏主意。另一种选择是检查构建中每个子步骤的结果并在需要时出错并退出。 – Gonen 2012-07-14 00:35:50