当使用Docker Centos 7.5映像运行GitLab CI管道时,ChromeHeadless给出超时

时间:2018-08-30 08:37:31

标签: docker karma-runner gitlab-ci google-chrome-headless

因此,我尝试使用GitLab CI管道在带有Centos 7.5的Docker映像上针对Angular 6应用程序运行Karma测试。

问题是

  

30 08 2018 07:09:55.222:WARN [启动器]: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:ERROR [启动器]:ChromeHeadless失败2次(超时)。放弃。       错误:作业失败:退出代码1

我使用import React, { Component } from 'react'; class Login extends Component { constructor(props) { super(props); this.state = { username: '' }; this.onChange = this.onChange.bind(this); } onChange(e) { this.setState({ [e.target.name]: e.target.value }); } render() { const { username } = this.state; return ( <input type="text" placeholder="Email" className="form-control" name="username" autoComplete="email" value={username} onChange={this.onChange} /> ); } } export default Login;

运行测试

业力conf:

ng test --browsers ChromeHeadlessNoSandbox --watch=false --code-coverage

还在Image docker文件上,我安装了最新的chrome stable:

browsers: ['Chrome', 'ChromeHeadlessNoSandbox'],
    customLaunchers: {
      ChromeHeadlessNoSandbox: {
        base: 'ChromeHeadless',
        flags: [
          '--no-sandbox',
          '--disable-setuid-sandbox',
          '--disable-gpu',
          '--remote-debugging-port=9222',
        ],
      },
    },

您是否知道为什么会超时?在本地环境中,它运行完美。

4 个答案:

答案 0 :(得分:3)

我已经解决了相同的问题。我的测试服可以在本地计算机上完美运行,但是在docker容器中运行这些测试时,由于连接超时而导致失败。 (我也正在使用Gitlab运行程序,并且我的docker映像基于circleci/node:8.9.2-browsers

在研究了这个问题之后,我发现docker bin文件中缺少chrome bin变量路径。所以我通过添加以下内容解决了该问题: export CHROME_BIN=/usr/bin/google-chromebefore_script

中的.gitlab-ci.yml
# 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'。 在这种情况下,您需要处理在本地计算机上运行测试的情况,可能它应该匹配相同的镶边路径

答案 1 :(得分:0)

您可能想要在Karma尝试启动浏览器之前检查控制台输出。当我的Angular应用程序中存在无效的导入路径时,我在恒定的超时中停留了数小时。业力会在控制台中打印此类错误,但会继续运行浏览器,就像这些错误无关紧要一样。这有点误导,但是在责怪浏览器之前值得检查。

第二,机器性能:偶尔,您可能在第一次启动尝试时会超时,但是下一次尝试会成功。 Dockerization可能会降低您的性能,但影响不大。无头Chrome浏览器即使设置最少也应该可以快速运行。

如果您的浏览器无法安装或无法寻址,那么也应该有与此相关的输出。

答案 2 :(得分:0)

嗨,我以这种方式解决了这个问题:

在我的情况下,客户端具有代理阻止程序来管理网络配置。因此,我在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'
        ]
      }
    }

答案 3 :(得分:0)

我们遇到了同样的问题,并通过在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!!!
   ],