小编典典

执行Google Test后,Jenkins Build脚本退出

jenkins

我正在通过Jenkins构建Qt GUI应用程序。我添加了3个构建步骤:

  • 构建测试可执行文件
  • 运行测试可执行文件
  • 用gcovr编制覆盖率报告

由于某种原因,用于运行测试可执行文件的shell任务在执行后会停止。即使是简单的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第一个构建任务末尾的an 会正确打印,而echo第二个任务末尾的an 不会正确打印。因此,尽管可见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

阅读 544

收藏
2020-07-25

共1个答案

小编典典

通常,如果一个 构建步骤 失败,则其余的将不会执行。

请注意日志中的这一行:

[VG5] $ /bin/sh -xe

-x使外壳执行之前在控制台打印每个命令。
-e错误使得外壳退出,如果任何命令失败。

在这种情况下,“失败”将是任何单个命令的返回码都不为0。
您可以通过在计算机上直接运行它来验证这一点:

./Application --gtest_output=xml
echo $?

如果echo $?显示0,则表明上一条命令已成功完成。如果显示任何其他内容,则表明上一个命令(来自./Application)中的错误代码,Jenkins则将其视为错误代码。

现在,这里有几件事在起作用。首先是将第二个构建步骤(基本上是一个临时的shell脚本/tmp/hudson4729703161621217344.sh)设置为在一个命令失败(默认行为)时失败。当构建步骤失败时,Jenkins将停止并使整个工作失败。

您可以通过添加set +e到第二个“构建步骤”的顶部来解决此特定行为。这不会因为单个命令失败而导致脚本(构建步骤)失败(它将显示命令错误,然后继续)。

但是,脚本(构建步骤)的总体结果是最后一条命令的退出代码。由于在您的OP中,脚本中只有2个命令,而最后一个失败,因此尽管+x添加了命令,但仍将导致整个脚本(构建步骤)被视为失败。请注意,如果您将echoas
添加为第三条命令,则该命令实际上将起作用,因为最后一个脚本命令(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. 首先,我们告诉Shell不要在单个命令失败时退出

  2. 然后,我在第二行中添加了基本的错误处理。该&&手段“执行./Application当且仅-如果前面cd是成功的。你永远不知道,也许bin文件夹丢失,或任何其他可能发生。顺便说一句,在&&内部工作在相同的错误代码等于0的原则

  3. 最后,现在对的结果进行了适当的错误处理./Application。如果结果不为0,则表明它已失败,否则表明它已通过。注意,这是因为最后一个命令不是(潜在地)失败./Application,而是echoif-else可能性中的任何一个,脚本的总体结果(构建步骤)将成功(即0),并且下一个构建步骤将被执行。

顺便说一句,您还可以通过适当的错误处理将所有三个构建步骤放到一个构建步骤中。

是的。这个答案可能比要求的要长一些,但是我想让您了解Jenkins和Shell如何处理退出代码。

2020-07-25