11

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

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
4

3 回答 3

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 是如何工作的,那么根本不要放一个 hash-bang,让 Jenkins 决定脚本应该如何运行。

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

于 2012-07-13T20:58:16.713 回答
5

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

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

于 2012-07-13T07:48:50.400 回答
5

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

#!/bin/bash -e

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

请参阅:出错时自动退出 bash shell 脚本

于 2012-10-03T15:45:18.750 回答