2011-11-24 124 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做同样的事情)。