Ruby的线程#退出不退出Travis中的当前线程

时间:2017-05-26 13:21:40

标签: ruby travis-ci

我在Node.js的一个学校项目上工作,为此我们(我的队友和我自己)添加了一系列由Ruby脚本运行的集成测试。如标题中所提到的,我们使用Travis在每次推送时运行此测试。

我们正在开发一个分散的应用程序,要求我们启动3台服务器来运行我们的测试。为此,我们在一个线程中启动每个服务器,一旦所有服务器都启动,我们在三个线程之一(服务器的一个线程)中运行测试(使用Postman' newman CLI)是开始时间最长的。)

运行测试后退出脚本意味着停止服务器并退出其线程。为此,我将杀死每个服务器的进程并退出所有线程,以运行测试的线程结束。

不幸的是,同一个线程总是无法退出,导致Travis构建超时并进入errored状态。这很奇怪,因为它在我的笔记本电脑上运行良好。

可以在GitHub上找到Ruby脚本:https://github.com/JosephCaillet/vinimay/blob/friends/run_tests.rb

为什么Travis未能退出我的线程,我该如何解决?

更新

为了澄清初始帖子中一些不清楚的部分,这里是Ruby脚本中线程的生命周期:

  1. 创建了三个线程。在每个端口中,服务器都在不同的端口上启动。
  2. 在每个线程上调用thr.join时,脚本会监视每个服务器的输出,等待包含"运行于"的服务器的字符串。在stdout中输出(因此它知道服务器何时实际运行)。每次找到此字符串时,计数器都会递增。
  3. 当计数器变为三(意味着所有服务器都已启动)时,它会运行测试。这意味着测试是在服务器启动最长的线程中运行的。
  4. 仍在此线程中,在运行测试后,脚本会终止每个服务器进程。它还在其线程上调用exit,除了正在运行测试的线程,现在正在退出线程(因为我们不能让这个线程退出其他线程,否则它会让它们处于永久运行状态,脚本永远不会结束。)
  5. 脚本在最后一个线程上调用exit并结束。
  6. 这是特拉维斯似乎遇到麻烦的第五步。

0 个答案:

没有答案