当 Visual Studio 测试任务尝试发布结果时,TFS 2017 卡住了

TFS 2017 gets stuck when the Visual Studio Test task tries to publish results

我们有一个 TFS 2017 构建代理执行 Visual Studio 测试任务来执行我们的单元测试。这几年来一直运行良好,但突然之间 - 没有任何代码更改 - 任务卡住了。

所有测试都已完成 运行ning,我们看到了摘要信息,它将位于通常会发布结果的位置……但随后什么也没有发生。我们已经等了 12 个多小时才完成。此步骤通常需要大约 90 分钟。

我已确认正在创建 TRX 文件。它的大小约为 4MB。我们 运行 进行了 3000 多个单元测试。

我也试过在测试任务中禁用代码覆盖和附件上传,但似乎没有什么不同。

下面是步骤卡住时日志输出的屏幕截图。

最后,我们在此服务器上还有许多其他项目,其测试 运行 / 发布正常,以及同样构建的 TFS 版本也 运行 测试(integration/system测试)可以正常工作。

更新:我们运行这个构建在不同的构建服务器上,并且它正确地发布了测试。所以这意味着这个特定的构建服务器有问题......

更新 2:所以我不再确定这里发生了什么。我们遇到问题的原始构建服务器现在可以正常工作,没有任何更改。刚刚又开始工作了。另一个构建服务器正在运行,然后停止了。同样的问题。我将 3000 多个测试分成两个步骤,大约 50/50,这工作了几次,但现在没有了。所以这似乎不是特定于服务器的,也似乎与测试数量无关。调试日志记录没有任何用处,因为一切似乎都很好,直到它在生成 TRX 文件后停止做任何事情。

更新 3:好吧,它又发生了。我不确定如何进行。我什至在 build box 上尝试了 Fiddler,看看我是否能捕捉到看起来很时髦的流量,但我希望看到的大部分流量都没有。这就像 Fiddler 没有捕获大部分工作(例如源代码下载、报告进度或测试结果发布)。还没完HTTP/HTTPS?

建议您放弃此构建并重新触发它。如果可以稳定地重现此问题,则缩小范围。

根据您的描述,所有其他版本都可以正常工作。它工作了好几年。所有测试都通过了,测试报告写好了,只是任务挂了。请仔细检查其他一些进程是否可能无法正常关闭。

另外使用另一个构建代理再次测试。还尝试使用相同的设置创建一个新的构建定义,触发该定义,这可能会成功。

此外,您还可以enable verbose logging解决问题。为此,只需添加一个名为 system.debug 的构建变量并将其值设置为“true”,这将包含更详细的日志信息。

由于我们 运行 的测试数量,这很难弄清楚,但我能够将其缩小到启动 ping.exe:[=12= 的测试]

[ExpectedException(typeof(TimeoutException))]
[TestMethod]
public void ProcessWillTimeout()
{
    const string command = "cmd";
    const string args = "/C ping 127.0.0.1 /t";

    var externalProcessService = new ExternalProcessService();
    externalProcessService.Execute(command, args, TimeSpan.FromMilliseconds(500));
}

无论出于何种原因,此测试将同时留下 conhost.exe 和 ping.exe "orphaned"。由于未知原因,这些进程未终止的事实阻止了测试将其结果发布回 TFS。可能在某个地方等待进程完成,但从未发生过。

确实,我们会在任务管理器和进程资源管理器中看到一堆 conhost.exe 和 ping.exe 进程:

您会注意到那里的工具提示...“[错误打开过程]”。我什至不能使用 Process Explorer 来终止这些进程——尽管任务管理器可以。果然,当我杀掉它们时,TFS构建任务会立即恢复并完成发布结果。

所以我们正在测试的 ExternalProcessService 代码中显然存在某种错误(尽管小心地有一个 finally 块终止了进程),但我们至少能够再次进行构建测试 运行没问题。