Python 由Jenkins启动时,Shell脚本具有不同的行为

Python 由Jenkins启动时,Shell脚本具有不同的行为,python,testing,jenkins,distributed,Python,Testing,Jenkins,Distributed,我需要执行大量的脚本,每个脚本都在一台单独的机器上执行。我想用詹金斯来做这件事。我有一个Python脚本,它可以执行单个测试并处理时间限制和测试结果的收集,还有一些Jenkins作业,它们使用不同的参数运行这个Python脚本。当我从命令行运行这个脚本时,它工作得很好。但是当我通过Jenkins运行脚本时(使用完全相同的参数),测试超时。脚本处理终止测试,因此控制权会一直返回给Jenkins,所有内容都会被清除。我如何调试这个?Python脚本正在使用subprocess.popen启动测试 顺

我需要执行大量的脚本,每个脚本都在一台单独的机器上执行。我想用詹金斯来做这件事。我有一个Python脚本,它可以执行单个测试并处理时间限制和测试结果的收集,还有一些Jenkins作业,它们使用不同的参数运行这个Python脚本。当我从命令行运行这个脚本时,它工作得很好。但是当我通过Jenkins运行脚本时(使用完全相同的参数),测试超时。脚本处理终止测试,因此控制权会一直返回给Jenkins,所有内容都会被清除。我如何调试这个?Python脚本正在使用subprocess.popen启动测试

顺便说一句,不管有没有Jenkins和我的Python脚本,我都愿意接受关于如何做得更好的建议。我只需要在不同的机器上运行一组脚本,并收集它们的输出。

要调试它:

  • 在shell脚本顶部添加
    set-x
  • 设置一个PS4,它在调用时打印每行的行号:
    PS4='+$BASH\u SOURCE:$FUNCNAME:$LINENO:'
  • 请特别注意脚本假设环境变量的任何位置,这些变量在Hudson运行时未设置
如果Python脚本重定向stderr(其中来自
set-x
的日志被定向),并且没有将其传递给Hudson(因此不记录),则可以将其重定向到脚本中的文件:
exec 2>>logfile


顺便说一句,除了詹金斯之外,还有很多工具可以在许多机器上启动工作;(如果你已经使用了Puppet,它会很好地工作),(如果你使用了Chef,你已经有了它--我不那么谦虚地认为,你应该有!),(它有一个时髦的web UI,但在修复之前不应该被任何人使用),(如果你还没有McCollective或刀子,这是一个非常好的选择),还有更多。

我解决了我自己的问题,尽管这有点小麻烦,我还是会在这里回答。Jenkins自己启动的脚本使用ThreadedTCServer启动了一个线程化Python服务器,该服务器或多或少都是从中实现的。该线程服务器没有正确退出,因此它使一些管道处于打开状态。尽管服务器进程已死亡,但由于管道泄漏,Jenkins无法正确确定进程是否已结束(Jenkins等待子进程的EOF以确定进程是否已完成)。解决方案是重新实现正确退出的套接字服务器。希望这对将来的人有帮助

您可以检查Jenkins在哪个用户下运行,并确保它具有与您的命令行相同的权限和默认环境变量。这适用于Windows和Linux设置,特别是当Jenkins作为服务运行时。谢谢你的提示,我一定会研究这些。实际上,Python子进程正在正确运行和退出,但父进程从未收到通知,因此它超时。这一定和詹金斯用叉子叉的方式有关。有什么想法吗?