ChromeHeadless在管道内部失败,但在本地失败

时间:2018-12-31 11:20:11

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

我有一个使用karma进行测试的角度应用程序。我还使用gitlab-ci自动构建和部署应用程序。

最近,我们想使用我们自己的带有chrome的图片向管道添加测试。

在管道中运行它会产生与无法连接到chrome进程有关的错误:

31 12 2018 10:58:36.116:INFO [karma]: Karma v1.7.1 server started at http://0.0.0.0:9877/
31 12 2018 10:58:36.121:INFO [launcher]: Launching browser ChromeKarma with unlimited concurrency
31 12 2018 10:58:36.134:INFO [launcher]: Starting browser ChromeHeadless
31 12 2018 10:59:36.146:WARN [launcher]: ChromeHeadless have not captured in 60000 ms, killing.
31 12 2018 10:59:36.163:INFO [launcher]: Trying to start ChromeHeadless again (1/2).
31 12 2018 11:00:36.223:WARN [launcher]: ChromeHeadless have not captured in 60000 ms, killing.
31 12 2018 11:00:36.236:INFO [launcher]: Trying to start ChromeHeadless again (2/2).
31 12 2018 11:01:36.296:WARN [launcher]: ChromeHeadless have not captured in 60000 ms, killing.
31 12 2018 11:01:36.310:ERROR [launcher]: ChromeHeadless failed 2 times (timeout). Giving up.

在本地相同的docker映像中运行相同的命令(使用相同的映像和相同的命令启动容器),我没有得到相同的错误,并且测试运行正常。

经过一些搜索,我尝试添加--no-sandbox之外的其他标志。这是我当前的浏览器配置:

customLaunchers: {
        ChromeKarma: {
            base: 'ChromeHeadless',
            // We must disable the Chrome sandbox when running Chrome inside Docker (Chrome's sandbox needs
            // more permissions than Docker allows by default)
            flags: [
                '--disable-web-security',
                '--disable-gpu',
                '--no-sandbox',
                '--remote-debugging-port=9222'
            ]
        }
    },

我还尝试过将睡眠添加到管道中的命令列表中,然后连接到容器并手动运行测试。这不会产生错误,并且测试运行正常。

Docker版本为:Docker版本17.05.0-ce,内部版本89658be

我还应该提到,在容器内时,我运行了ps ax,看到镀铬过程开始并一直持续到因果报应杀死它们为止。

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。在我们的网络内部,我们使用代理访问互联网。原来,这阻止了chrome连接到业力Web服务器。我必须取消设置代理才能使其正常工作。解决此问题的另一种方法,而不必删除代理,可以在业力中添加以下标志。

public static BundleEntry<Boolean> ofBoolean(String key, Boolean value) {
    return new SimpleBundleEntry<>(key, value,
            Bundle::putBoolean, // <------------------- PROBLEM HERE
            (bundle, k) -> bundle.getBoolean(k));
}