所以我正在尝试使用 GitLab CI 的管道在带有 Centos 7.5 的 docker 映像上运行 Angular 6 应用程序的 Karma 测试。
问题是
30 08 2018 07:09:55.222:警告[启动器]:ChromeHeadless没有 在60000毫秒内捕获,杀死。 30 08 2018 07:09:55.244:INFO [启动器]:尝试再次启动ChromeHeadless(1/2(。 30 08 2018 07:10:55.264:WARN [启动器]:ChromeHeadless在60000毫秒内没有捕获,杀死。 30 08 2018 07:10:55.277:INFO [启动器]:尝试再次启动ChromeHeadless(2/2(。 30 08 2018 07:11:55.339:WARN [启动器]:ChromeHeadless在60000毫秒内没有捕获,杀死。 30 08 2018 07:11:55.355:错误 [启动器]:ChromeHeadless 失败 2 次(超时(。放弃。 错误:作业失败:退出代码 1
我用ng test --browsers ChromeHeadlessNoSandbox --watch=false --code-coverage
运行测试
业力会议:
browsers: ['Chrome', 'ChromeHeadlessNoSandbox'],
customLaunchers: {
ChromeHeadlessNoSandbox: {
base: 'ChromeHeadless',
flags: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-gpu',
'--remote-debugging-port=9222',
],
},
},
同样在图像上 docker 文件我安装了最新的 chrome 稳定版:
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
RUN yum -y localinstall google-chrome-stable_current_x86_64.rpm && yum clean all
你知道为什么它超时吗?在当地环境中,它可以完美运行。
我已经解决了同样的问题。我的测试套装在我的本地机器中完美运行,但是在 docker 容器中运行这些测试时,由于连接超时而失败。(我也在使用 Gitlab 运行器,我的 docker 镜像基于circleci/node:8.9.2-browsers
(
调查此问题后,我发现 docker 文件中缺少 chrome bin 变量路径。 所以我通过添加以下内容来解决此问题:export CHROME_BIN=/usr/bin/google-chrome
到我的 .gitlab-ci.yml 在before_script
# TESTING
unit_test_client:
stage: test
before_script:
- export CHROME_BIN=/usr/bin/google-chrome
script:
- npm run test:client
您还可以通过将CHROME_BIN设置为process.env.CHROME_BIN='/usr/bin/google-chrome'
在你的业力配置文件的顶部。 在这种情况下,您需要处理在本地机器上运行测试的情况,可能它应该匹配相同的 chrome 路径
我们遇到了同样的问题,并通过在 karma.config 中添加以下标志来解决它.js
headlessChrome: {
base: "ChromeHeadless",
flags: [
"--no-sandbox",
"--no-proxy-server",
"--disable-web-security",
"--disable-gpu",
"--js-flags=--max-old-space-size=8196", // THIS LINE FIXED IT!!!
],
您可能需要在 Karma 尝试启动浏览器之前检查控制台输出。当我的 Angular 应用程序中存在无效的导入路径时,我被困在恒定超时上几个小时。Karma 在控制台中打印此类错误,但继续启动浏览器,就好像错误不重要一样。这有点误导,但在责怪浏览器之前值得检查。
其次,机器性能:每隔一段时间,您可能会在第一次启动尝试时超时,但下一次尝试会成功。Dockerization 可能会降低您的性能,但不会降低太多。即使设置最少,无头 Chrome 也应该运行得很快。
如果您的浏览器无法安装或可寻址,那么也应该有一些与此相关的输出。
嗨,我以这种方式解决了这个问题:
在我的情况下,客户端有一个代理阻止程序来管理网络配置。所以我在customLauncher标志中提供了代理作为服务器并且工作正常,但仅在管道中,本地测试停止。但它只是取下本地运行的代理。
之前:这样测试在本地运行,但在 jenkins 管道中不起作用(npm 运行测试(
browsers: ['MyChromeHeadless'],
customLaunchers: {
MyChromeHeadless: {
base: 'ChromeHeadless',
flags: [
'--no-sandbox',
'--proxy-auto-detect'
]
}
}
之后:这样测试在管道中运行,但在本地不起作用,因为我不在客户端网络下,可以访问提供的代理,如果你是,应该可以工作。
browsers: ['MyChromeHeadless'],
customLaunchers: {
MyChromeHeadless: {
base: 'ChromeHeadless',
flags: [
'--no-sandbox',
'--proxy-bypass-list=*',
'--proxy-server=http://proxy.your.company'
]
}
}