2012-07-13 174 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