当前位置: 首页 > 面试题库 >

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

西门庆
2023-03-14
问题内容

我正在通过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

问题答案:

通常,如果一个 构建步骤 失败,则其余的将不会html" target="_blank">执行。

请注意日志中的这一行:

[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如何处理退出代码。



 类似资料:
  • 问题内容: 从数据库表和solr中读取数据后,我编写了一个脚本来更新数据库表。我正在使用asyn.waterfall模块。问题在于,成功完成所有操作后,脚本不会退出。我使用过的数据库连接池也认为可能正在创建脚本以无限期等待。我想将此脚本放在crontab中,如果无法正确退出,它将不必要地创建大量实例。 问题答案: 我刚刚经历了这个问题。 仅仅使用的问题是我正在处理的程序正在创建句柄,但从未销毁它们

  • 问题内容: 我使用jQuery的.load函数将一些HTML代码加载到div中,其中包含要执行的一些代码; 加载ajax请求后,alert(); 函数起作用,但是someFunction无法起作用。 如何从Ajax调用执行此功能 执行的功能也不起作用。 问题答案: 可能您应该使用jQuery.getScript从服务器加载一些javascript并执行它。 更新: 在大多数情况下,仅加载纯HTML

  • 本文向大家介绍python脚本后台执行方式,包括了python脚本后台执行方式的使用技巧和注意事项,需要的朋友参考一下 在Linux中,可以使用nohup将脚本放置后台运行,如下: 1 但直接使用上面代码,无法在程序运行过程中查看Python中的print "computing" 输出结果,比如在每次循环中使用print语句等。原因是python的输出有缓冲,导致nohup.out不能够马上看到输

  • 为什么我的 Docker 在执行我的 shell 脚本后退出?谢谢。 Docker版本: 我的图片: 运行后: 我检查了:< code>docker ps -a 以下是run.sh: 我得到了日志: 之后,我的码头集装箱出口: 但是,当我使用时: 我的容器工作得很好。为什么?

  • 我们使用的是katalon studio版本7.8。

  • 问题内容: 我想从PHP脚本执行系统上存在的Bash脚本。我的系统上有两个脚本。其中一个是称为at at 的PHP脚本,另一个是称为at at 的Bash脚本。 我的client.php脚本看起来像 我的睾丸看起来像 当我在终端上执行以下操作时 我在终端上得到以下输出 但是当我在打开页面时 我得到以下输出 即使执行了chmod + x testscript,我仍然收到此错误。 我如何从浏览器中获取