CircleCi在运行Karma规范时随机断开与浏览器的连接



我有一个用Angularjs编写的大型程序,正在迁移到Angular 7(即将迁移到8(。我们有9000多个规格,其中大约1/4是Angular 7。现在有一段时间,CircleCI偶尔会让整个套件失败,并显示以下错误消息:

HeadlessChrome 78.0.3904 (Linux 0.0.0) ERROR
Disconnectedreconnect failed before timeout of 2000ms (transport close)
HeadlessChrome 78.0.3904 (Linux 0.0.0): Executed 8962 of 9075 DISCONNECTED (6 mins 29.171 secs / 6 mins 7.538 secs)
error Command failed with exit code 1.

执行的规范有点随机,规范在8900到9050之间失败。

几周前,它开始在一个分支上总是失败,迫使主分支重新运行也出现了同样的错误。

所有规范都使用类似的构建、相同的Headless Chrome版本、相同的测试运行程序在本地干净地执行。主要区别在于报告程序不同(我们在CircleCI上使用dots报告程序,更多的是在本地进行摘要(。

我在CircleCI的"知识库"中搜索了"断开连接"one_answers"片状",但没有可用的结果。谷歌上出现的大多数关于这一点的搜索结果都来自古代版本。。。HeadlessChrome、Karma、Jasmine等。例如,我尝试过在没有沙盒的情况下设置一个自定义的"HeadlessCchrome",但没有成功。

问题出在哪里?你对如何诊断有什么建议吗?

客户支持已经回复我,并通知我已经为一个进程使用了所有可用内存。此时,Circle Ci只允许容器使用高达4GB的RAM,使用Container OS、Angular和angularjs框架、Jasmine和Karma库,以及我们所有的生产和测试代码,我们的空间都用完了。

显然,我们已经在4GB的内存上徘徊了一段时间,所以我们遇到了间歇性的故障,但我的新分支最终还是把它推了过来。我们努力确保没有内存泄漏,但在某些情况下,代码太多了。

所以我的解决方案是分开测试。我们有几个懒惰加载的模块,但目前,我们最好的拆分是Angular和angularjs(因为它允许更好的转换设置(。因此,在我的jasmine配置中,当选择要包含的文件时,我更新了第二行:

_requireContext(require.context('../lib/fixtures', true, /.js$/););
_requireContext(require.context('./app', true, /.spec.[j|t]s$/));
function _requireContext(context: any) {
context.keys().forEach((path: string) => {
try {
context(path);
} catch (err) {
/* tslint:disable */
console.error(`[ERROR] REQUIRING FILE: ${path}`);
console.error(err);
/* tslint:enable */
throw err;
}
});
}

包括或排除typescript/javascript文件,我很乐意去。它看起来有点像这样:

_requireContext(require.context('./app', true, /.spec.js$/));

_requireContext(require.context('./app', true, /.spec.ts$/));

它增加了复杂性(现在我基本上有两个测试套件(,但它起作用了,总体而言,我的规范在CircleCI上运行得更快。

最后一点需要注意的是,我的开发计算机上没有任何问题,显然我有超过4GB的RAM,查看您的测试套件在CircleCI上使用了多少RAM的唯一方法是直接询问他们。这个统计数据在网站上找不到。

最新更新