詹金斯成功,当单元测试失败(Rails)
我几乎没有开始使用詹金斯,这是迄今为止我遇到的第一个问题。基本上,即使在某些测试中发生错误,我的詹金斯工作总是会成功。这是我在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
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。
詹金斯只能看到最后一个命令运行的结果代码,以便它有没有知道什么的rake test:units
结果的方式。
最简单的事情可能是将这些命令的每个命令作为单独的jenkins构建步骤。
另一种解决方案是改变你的第一线以下:
#!/bin/bash -e
这告诉你的脚本,如果任何脚本的命令返回一个错误失败。
你确实是对的,我已经有了“#!/ bin/bash”作为第一行:) – 2012-09-11 06:24:45
如果你添加了'#!/ bin/bash -x'你可以得到Jenkins显示命令的部分在脚本输出中运行。真的,它只是你不希望从Jenkins的默认'-xe'得到的'-e' – ZombieDev 2013-09-13 23:00:41