1

我需要执行大量脚本,每个脚本都在单独的机器上。我正在尝试使用 Jenkins 来做到这一点。我有一个 Python 脚本,它可以执行单个测试并处理时间限制和测试结果的收集,还有一些 Jenkins 作业使用不同的参数运行这个 Python 脚本。当我从命令行运行此脚本时,它工作正常。但是当我通过 Jenkins(使用完全相同的参数)运行脚本时,测试超时。该脚本处理终止测试,因此控制权一直返回给 Jenkins,一切都被清理干净。我该如何调试呢?Python 脚本使用 subprocess.popen 来启动测试。

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

4

2 回答 2

2

我解决了自己的问题,即使它有点极端,我仍然会在这里回答。Jenkins 启动的脚本本身启动了一个使用 ThreadedTCPServer 的线程 Python 服务器,或多或少地从这里实现。那个线程服务器没有正确退出,所以它留下了一些管道打开。尽管服务器进程死亡,但泄漏的管道使 Jenkins 无法正确确定该进程已结束(Jenkins 等待来自子进程的 EOF 以确定该进程是否完成)。解决方案是重新实现正确退出的套接字服务器。希望这对将来的人有所帮助!

于 2013-04-11T16:10:17.397 回答
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(有一个时髦的网络UI,但在修复此安全错误之前不应被任何人使用)、Fabric(如果您还没有 mcollective 或刀,这是一个非常好的选择)等等。

于 2013-03-28T23:06:16.600 回答