繁体   English   中英

当相同的测试运行并通过命令行时,在 Jenkins 中运行 pytest 时出现“(核心转储)python -m pytest”错误

[英]Getting a "(core dumped) python -m pytest" error running pytest in Jenkins when same test runs and passes on the command line

我正在 Jenkins 中使用 Python 3 代码运行一些测试,并且出现(核心转储) python -m pytest 错误,但是当我在命令行上运行相同的测试时,测试通过了。

这是我的设置。

  • 蟒蛇:3.6
  • pytest 5.3.4
  • Jenkins 服务器上的操作系统:Ubuntu 18.04

我的测试脚本内容如下:

#!/bin/bash
. venv/bin/activate
whoami
python -m pytest

从命令行运行测试脚本时,我得到以下信息:

(venv) [Wed Mar 04 15:48:20] bill@billc-dev:~/PycharmProjects/SLAM-ER_STE$ ./regtest.sh
bill
======================================================================================================================= test session starts ========================================================================================================================
platform linux -- Python 3.6.9, pytest-5.3.4, py-1.8.1, pluggy-0.13.1
PyQt5 5.13.2 -- Qt runtime 5.13.2 -- Qt compiled 5.13.2
rootdir: /home/bill/PycharmProjects/SLAM-ER_STE
plugins: shutil-1.7.0, qt-3.3.0
collected 6 items                                                                                                                                                                                                                                                  

Scripting/steps2py_test.py ...                                                                                                                                                                                                                               [ 50%]
UserInterface/login_test.py ...                                                                                                                                                                                                                              [100%]

======================================================================================================================== 6 passed in 0.74s =========================================================================================================================
(venv) [Wed Mar 04 15:48:39] bill@billc-dev:~/PycharmProjects/SLAM-ER_STE$ 

但是当我在 Jenkins 中运行相同的测试脚本时,我得到以下信息:

15:13:20 [test1] $ /bin/sh -xe /tmp/jenkins7917398407283219031.sh
15:13:20 + ./regtest.sh
15:13:20 jenkins
15:13:20 ============================= test session starts ==============================
15:13:20 platform linux -- Python 3.6.9, pytest-5.3.4, py-1.8.1, pluggy-0.13.1
15:13:20 rootdir: /var/lib/jenkins/workspace/test1
15:13:21 ./regtest.sh: line 4: 19362 Aborted                 (core dumped) python -m pytest
15:13:21 Build step 'Execute shell' marked build as failure
15:13:21 Finished: FAILURE

我确定这是 Jenkins 服务器上的某种配置问题,但我不知道它可能是什么。 任何帮助将不胜感激。

快速:为了解决 Ubuntu 20.04 特定问题,它似乎涉及缺少的 xinerama 库,可以通过以下方式修复:

须藤 apt-get 安装 libxcb-xinerama0

背景:就其价值而言,我通过在 python 调用前放置“strace”发现了上述内容。 大量输出,其尾端是最终异常报告的令人讨厌的每日志行一个字符的日志。 但是如果你向上滚动到上面并环顾四周,你会看到系统非常努力地寻找 xcb-xinerama 库。 后来通过谷歌搜索,我得到了我需要的细节。 PyQt5 的 pip 安装信息显然没有列出 xcb-xinerama 要求,因为它“一直存在”,但较新的 Ubuntu 可能已将其删除。

附加:我刚刚发现了 Jenkins 的 Xvfb 插件,它可以帮助解决这个问题。 它消除了(或可以消除)导出 DISPLAY 和整理 xhost 问题的需要,如果您有多个项目、多个执行程序等,它可能会更好地工作。

  1. 添加 Xvfb 插件
  2. 安装 Xvfb(Debian/Ubuntu/Mint 的“sudo apt-get install xfvb”)
  3. 为插件添加一个工具,指定安装目录(任何你想要的名字,“默认”显然很常见)。 它为我安装在 /usr/bin 中。
  4. 在项目的配置中,在“构建环境”中,您可以为构建打开 Xvfb,高级按钮为您提供其他选项。 您可以向 Xvfb 添加“-ac”附加选项以禁用访问控制,这可以简化初始设置。

以上允许我在构建中运行其他简单的基于 X 的应用程序,但是(在 Ubuntu 20.04 * Python3.8.5 * pytest-6.1.2 上)我仍然在尝试运行需要 Qt 工作的测试的核心转储. 尝试过 QT_DEBUG_PLUGINS=1 没有提供任何附加信息。 所以,最终,我遇到了同样的问题。 这适用于 Ubuntu 18.04,但在升级到 Ubuntu 20.04 后突然停止工作(我不是说这是 Ubuntu 问题,只是那是触发时间点......)

事实上,我们知道发生了什么。 正在测试的软件使用 PyQt5,因此尝试绘制 GUI 图像,但 Jenkins 不知道在哪里绘制它们,导致核心转储问题。

解决这个问题的是做以下两件事:

  1. 通过运行$>sudo xhost +si:localuser:jenkins授予 jenkins 用户访问 x11 服务器的权限
  2. 在 bash 脚本中添加export DISPLAY=:0.0来告诉 jenkins 在哪里寻找 Xserver。 Bash 脚本现在看起来像这样:
#!/bin/bash
. venv/bin/activate
whoami
export DISPLAY=:0.0
python -m pytest

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM