2012-11-15 32 views
6

我正在通過Jenkins構建一個Qt GUI應用程序。我加了3個構建步驟:Jenkins構建腳本在Google Test執行後退出

  • 構建測試可執行
  • 運行測試可執行
  • 編譯具有gcovr

覆蓋報告出於某種原因,運行測試可執行的殼任務執行後停止。即使是一個簡單的echo也不會運行。測試是使用Google Test編寫的,並輸出xUnit XML文件,這些文件在構建之後進行分析。 一些測試啓動應用程序的用戶界面,所以我安裝了jenkins xvnc插件讓它們運行。

構建任務如下:

構建

cd $WORKSPACE/projectfiles/QMake 
sh createbin.sh 

測試

cd $WORKSPACE/bin 
./Application --gtest_output=xml 

覆蓋率報告

cd $WORKSPACE/projectfiles/QMake/out 
gcovr -x -o coverage.xml 

現在,第一個構建任務結束時的echo已正確打印,但第二個末尾的echo未打印。因此,即使Google Test輸出可見,第三個構建任務也不會運行。我認爲可能問題在於某些Google測試失敗,但爲什麼腳本只是因爲測試失敗而停止執行呢?

也許有人可以給我一個關於爲什麼第二個任務停止的提示。

編輯

控制檯輸出看起來是這樣的:

Updating svn://repo/ to revision '2012-11-15T06:43:15.228 -0800' 
At revision 2053 
no change for svn://repo/ since the previous build 
Starting xvnc 
[VG5] $ vncserver :10 

New 'ubuntu:10 (jenkins)' desktop is ubuntu:10 

Starting applications specified in /var/lib/jenkins/.vnc/xstartup 
Log file is /var/lib/jenkins/.vnc/ubuntu:10.log 

[VG5] $ /bin/sh -xe /tmp/hudson7777833632767565513.sh 
+ cd /var/lib/jenkins/workspace/projectfiles/QMake 
+ sh createbin.sh 
... Compiler output ... 
+ echo Build Done 
Build Done 
[VG5] $ /bin/sh -xe /tmp/hudson4729703161621217344.sh 
+ cd /var/lib/jenkins/workspace/VG5/bin 
+ ./Application --gtest_output=xml 
Xlib: extension "XInputExtension" missing on display ":10". 
[==========] Running 29 tests from 8 test cases. 
... Test output ... 
3 FAILED TESTS 
Build step 'Execute shell' marked build as failure 
Terminating xvnc. 
$ vncserver -kill :10 
Killing Xvnc4 process ID 1953 
Recording test results 
Skipping Cobertura coverage report as build was not UNSTABLE or better ... 
Finished: FAILURE 

回答

22

一般來說,如果一個生成步驟失敗,其餘的將不被執行。

重視這一行從您的日誌:

[VG5] $ /bin/sh -xe 

-x使得外殼打印在執行前控制檯的每個命令。
如果任何命令失敗,-e會使shell退出並顯示錯誤。

在這種情況下,「失敗」將是來自任何單個命令的不爲0的返回碼。
您可以直接在機器上運行此驗證這一點:

./Application --gtest_output=xml 
echo $? 

如果echo $?顯示0時,表示前面的命令成功完成。如果它顯示其他任何內容,則表示上一個命令(來自)的錯誤代碼。/應用程序),而詹金斯就這樣對待它。

現在,有幾件事情在這裏玩。首先,如果一個命令失敗(默認行爲),則將第二個生成步驟(實質上是臨時shell腳本/tmp/hudson4729703161621217344.sh)設置爲失敗。當構建步驟失敗時,詹金斯將停止並失敗整個工作。

您可以通過將set +e添加到第二個生成步驟的頂部來修復此特定行爲。這不會導致腳本(Build Step)由於單個命令失敗而失敗(它將顯示命令錯誤並繼續)。

但是,腳本(構建步驟)的總體結果是最後一個命令的退出代碼。由於在OP中,腳本中只有2個命令,而最後一個失敗,所以儘管已添加+x,但會導致整個腳本(構建步驟)被視爲失敗。請注意,如果您將第三個命令添加爲echo,由於上一個腳本命令(echo)成功,所以這實際上可行,但是此「解決方法」並非您所需。

你需要的是正確的錯誤處理添加到您的腳本。試想一下:

set +e 
cd $WORKSPACE/bin && ./Application --gtest_output=xml 
if ! [ $? -eq 0 ]; then 
    echo "Tests failed, however we are continuing" 
else 
    echo "All tests passed" 
fi 

三件事情都在發生腳本:

  1. 首先,我們告訴外殼不退出對各個命令

  2. 然後我添加了基本的故障第二行中的錯誤處理。 &&的意思是「執行./Application if-and-only - 如果以前的cd成功。你永遠不知道,也許bin文件夾丟失,或其他任何可能發生的順便說一句,&&內部工作在相同的錯誤代碼等於0原則

  3. 最後,現在對./Application的結果進行了適當的錯誤處理,如果結果不是0,那麼表明它失敗了,否則我們顯示它已經通過了。不是(潛在的)失敗./Application,但是既不是一個echo的如果其他的可能性,腳本(內置步驟)的總體結果將是一個成功的(即0),以及接下來的生成步驟將被執行。

順便說一句,你可以如把你的構建步驟3的所有與正確的錯誤處理一個單一的生成步驟。

是的......這個答案可能比需要的時間稍長,但我想讓你瞭解Jenkins和shell如何處理退出代碼。

+1

優秀的答案,我真的沒有想到每個可能的命令可能會停止腳本的可能性。謝謝! – dasmaze

+1

希望我可以upvote你10次。這很多! – nolazybits

+0

@zeflasher,你總是可以給我一個賞金的答案;) – Slav

相關問題