2011-11-24 96 views
2

我剛剛試驗Jenkins並設置了一些項目。一個特別調用一個shell腳本,並從該腳本退出代碼正確拾取,產生通過/失敗。然而,當我從命令行調用Scala時,無論發生什麼,它都會通過。Jenkins在Scala失敗時報告成功

在執行殼箱:

/opt/scala/2.9.1/bin/scala sdfsdfsd 
Exception in thread "main" java.lang.RuntimeException: 
Cannot figure out how to run target: sdfsdfsd 
... (stack trace removed) 
Finished: SUCCESS 

然而這樣做與Java等效產生一個錯誤:

/opt/java/jdk1.7.0/bin/java sdfdfsd 
Error: Could not find or load main class sdfdfsd 
Finished: FAILURE 

運行時,從bash的(與回聲這兩個產生的1的退出代碼$?)

我錯過了什麼,或者這是一個錯誤?

編輯:

有趣的是,我用螞蟻Exec時我看到了同樣的現象 - 當我調用包含Scala的無效電話,我得到預期的錯誤代碼的shell腳本,而是通過螞蟻(與failonerror =」真')我看到零,並建立成功。

由於

+2

那些'...'表示其他命令正在執行嗎?如果我沒有完全誤導,Jenkins只會選擇最後執行的命令的退出代碼,所以如果腳本中有另一個命令在scala失敗後執行,並且此命令成功,Jenkins仍會認爲這是成功的。 – pushy

+0

對不起,它只是來自java/scala的附加堆棧跟蹤/其他輸出。 – David

+0

你有沒有試過'echo $?'從詹金斯的腳本內?如果你是從bash而不是Jenkins做的話,可能會有些不同。你也可能想嘗試像'if $? == 1 exit 1'(< - 這只是僞代碼,當然;-)) – pushy

回答

6

這是一個已知的錯誤Scala eats exit code when piping stdin,固定在行李箱中。

要修補系統,修復是很容易的,在$ SCALA_HOME /斌/斯卡拉腳本,行25ish

function onExit() { 
    if [[ "$saved_stty" != "" ]]; then 
    restoreSttySettings 
    exit $scala_exit_status 
    fi 
} 

移動退出外,如果:

function onExit() { 
    if [[ "$saved_stty" != "" ]]; then 
    restoreSttySettings 
    fi 
    exit $scala_exit_status 
} 

這將解決你的問題(實際上在ant中,但你將不得不爲scalac做同樣的事情)。