Shell程序在Jenkins启动时具有不同的行为

时间:2013-03-28 22:53:19

标签: python testing jenkins distributed

我需要执行大量脚本,每个脚本都在一台单独的机器上。我正在尝试使用Jenkins来做这件事。我有一个Python脚本,可以执行单个测试并处理时间限制和测试结果的集合,以及一些使用不同args运行此Python脚本的Jenkins作业。当我从命令行运行此脚本时,它工作正常。但是当我通过Jenkins运行脚本时(使用完全相同的参数),测试会超时。该脚本处理杀死测试,因此控制将一直返回到Jenkins并清除所有内容。我该怎么调试呢? Python脚本使用subprocess.popen来启动测试。

作为旁注,我愿意接受有关如何更好地做到这一点的建议,无论是否有Jenkins和我的Python脚本。我只需要在不同的机器上运行一堆脚本并收集它们的输出。

2 个答案:

答案 0 :(得分:1)

调试:

  • set -x添加到shell脚本的顶部。
  • 设置PS4,在调用时打印每行的行号:PS4='+ $BASH_SOURCE:$FUNCNAME:$LINENO:'
  • 请特别注意您的脚本假设环境变量的任何地方,这些变量在Hudson运行时未设置。

如果您的Python脚本重定向stderr(来自set -x的日志被定向)并且没有将其传递给Hudson(因此不记录它),您可以将其重定向到文件中的文件脚本:exec 2>>logfile

顺便说一句,除了Jenkins之外,还有许多工具可以在多台机器上开展工作; MCollective(如果你已经使用了Puppet,效果很好),knife ssh(如果你使用Chef,那么你已经拥有了 - 这在我不太谦虚的意见中,你应该!), Rundeck(它有一个时髦的网页用户界面,但在this security bug修复之前不应该被任何人使用),Fabric(如果你没有mcollective,这是一个非常好的选择或刀已经)等等。

答案 1 :(得分:1)

我解决了自己的问题,即使这是一个角落的情况,我仍然会在这里回答。 Jenkins启动的脚本使用ThreadedTCPServer启动了一个线程化的Python服务器,该服务器或多或少地完全从here实现。该线程服务器没有正确退出,因此它打开了一些管道。虽然服务器进程已经死亡,但泄漏的管道使Jenkins无法正确确定进程已经结束(Jenkins等待子进程的EOF以确定进程是否完成)。解决方案是正确退出的套接字服务器的重新实现。希望这有助于将来的某个人!