为什么我的gulp / teamcity构建失败"断言失败:0,文件src \ uv-common.c,第103行"?

时间:2015-02-02 17:25:38

标签: node.js teamcity gulp teamcity-9.0

我的TeamCity构建随机失败,显示以下消息:

[16:25:45][Step 1/2] [16:25:45] Build complete!
[16:25:45][Step 1/2] [16:25:45] Finished 'build' after 3.32 min
[16:25:45][Step 1/2] [16:25:45] Starting 'test'...
[16:25:48][Step 1/2] Assertion failed: 0, file src\uv-common.c, line 103
[16:25:48][Step 1/2] Process exited with code 3
[16:25:48][Step 1/2] Step Gulp (Command Line) failed

一些细节:

  1. 我使用命令行runner:call npm install; call gulp ci
  2. 有问题的步骤是在我编译的测试二进制文件上运行NUnit。
  3. 我无法通过命令行重现此问题。
  4. 环境信息:

    • TeamCity v9.0.2(撰写本文时最新)
    • 节点v10.36(撰写本文时最新)
    • Gulp v3.8.10(撰文时最新)
    • NUnit.Runners nuget package 2.6.4(撰写本文时最新)

2 个答案:

答案 0 :(得分:2)

这就说了一切,对吗?

Assertion failed: 0, file src\uv-common.c, line 103
Process exited with code 3

为了调试,有人设置了一个断言。实际上,第103行包括该断言。我猜这里的零值是经过测试的值。

 98 #define UV_ERR_NAME_GEN(name, _) case UV_ ## name: return #name; 
 99 const char* uv_err_name(int err) { 
100   switch (err) { 
101     UV_ERRNO_MAP(UV_ERR_NAME_GEN) 
102     default: 
103       assert(0); // <- Here's the assertion that failed
104       return NULL; 
105   } 
106 } 
107 #undef UV_ERR_NAME_GEN 

有一条比你的断言更高的功能线。它想要捕获一个错误,将其映射到已知的东西。那&#34;默认:&#34;意味着它是一个未知的错误,作者并不知道。那么这个断言就是要死了,因为他不知道如何最好地处理它。

现在,libuv是什么?它是一个网络库。这一切都取决于调用uv_err_name(某事物)时调用的内容。例如,可能是一个getaddrinfo()调用。底层tcp堆栈应该返回可识别的错误号。显然,你的版本没有识别从tcp堆栈返回的内容。

所以,既然我们合理地理解了这个问题,我强烈建议更新与此相关的libuv库。重复测试。如果再次失败,请确认您已连接到以太网(如果您已经关闭了可以关闭的Wi-Fi)。

答案 1 :(得分:2)

Michael指出,这是由于 libuv 网络库。

您的错误很可能来自lib未处理的EHOSTDOWN代码并使您的流程失败。

关于此问题,joyent repolibuv one实际上存在一些问题。

似乎this commit修复了它,现在已经使用了0.12.1版本的Node。