Karma Chrome Headless没有在Jenkins工作

时间:2018-05-25 10:07:20

标签: javascript docker jenkins karma-runner

当我在我的Mac上本地使用Docker运行以下设置时,一切正常。

但是同样的设置对于在Ubuntu 16.04上运行的Jenkins不起作用

ChromiumHeadless没有在60000毫秒内捕获,造成死亡。

以下错误日志来自 Jenkins控制台:

25 05 2018 06:35:09.076:INFO [karma]: Karma v2.0.2 server started at http://0.0.0.0:9222/
25 05 2018 06:35:09.079:INFO [launcher]: Launching browser Chromium_no_sandbox with unlimited concurrency
25 05 2018 06:35:09.090:INFO [launcher]: Starting browser ChromiumHeadless
25 05 2018 06:36:09.128:WARN [launcher]: ChromiumHeadless have not captured in 60000 ms, killing.
25 05 2018 06:36:09.139:INFO [launcher]: Trying to start ChromiumHeadless again (1/2).
25 05 2018 06:37:09.140:WARN [launcher]: ChromiumHeadless have not captured in 60000 ms, killing.
25 05 2018 06:37:09.147:INFO [launcher]: Trying to start ChromiumHeadless again (2/2).

Package.json ... "testProd": "./node_modules/karma/bin/karma start karma.conf-prod.js --single-run",

Dockerfile

FROM zenika/alpine-node:latest
LABEL name="product-web"

# Update apk repositories
RUN echo "http://dl-2.alpinelinux.org/alpine/edge/main" > /etc/apk/repositories
RUN echo "http://dl-2.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories
RUN echo "http://dl-2.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories

# Install chromium
RUN apk -U --no-cache \
    --allow-untrusted add \
    zlib-dev \
    chromium \
    xvfb \
    wait4ports \
    xorg-server \
    dbus \
    ttf-freefont \
    mesa-dri-swrast \
    grep \
    udev \
    && apk del --purge --force linux-headers binutils-gold gnupg zlib-dev libc-utils \
    && rm -rf /var/lib/apt/lists/* \
    /var/cache/apk/* \
    /usr/share/man \
    /tmp/* \
    /usr/lib/node_modules/npm/man \
    /usr/lib/node_modules/npm/doc \
    /usr/lib/node_modules/npm/html \
    /usr/lib/node_modules/npm/scripts

WORKDIR /home/dev/code
COPY . .

#RUN rm -rf node_modules && npm cache clear --force

ENV CHROME_BIN=/usr/bin/chromium-browser
ENV CHROME_PATH=/usr/lib/chromium/

RUN npm install
RUN npm run testProd && npm run buildProd

karma.conf-prod.js

const path = require('path');
module.exports = function(config) {
    config.set({
        basePath: '',
        browsers: ['ChromeHeadlessNoSandbox'],
    customLaunchers: {
        ChromeHeadlessNoSandbox: {
            base: 'ChromeHeadless',
            flags: [
                '--no-sandbox',
                '--user-data-dir=/tmp/chrome-test-profile',
                '--disable-web-security'
            ]
        }
    },
        frameworks: ['mocha', 'chai'],
        captureConsole: true,
        files: [
            'node_modules/babel-polyfill/dist/polyfill.js',
            'test/root.js'
        ],
        preprocessors: {
            'src/index.js': ['webpack', 'sourcemap'],
            'test/root.js': ['webpack']
        },
        webpack: {
            devtool: 'inline-source-map',
            module: {
                loaders: [
                    {
                        test: /\.js$/,
                        loader: 'babel-loader',
                        exclude: path.resolve(__dirname, 'node_modules'),
                        query: {
                            plugins: ['transform-decorators-legacy', 'transform-regenerator'],
                            presets: ['env', 'stage-1', 'react']
                        }
                    },
                    {
                        test: /\.json$/,
                        loader: 'json-loader',
                    },
                ]
            },
            externals: {
                'react/addons': true,
                'react/lib/ExecutionEnvironment': true,
                'react/lib/ReactContext': true
            }
        },
        webpackServer: {
            noInfo: true
        },
        reporters: ['spec'],
        port: 9222,
        logLevel: config.LOG_INFO
    });
};

我甚至尝试使用logLevel: config.LOG_DEBUG,但没有显示任何遗漏或异常。

6 个答案:

答案 0 :(得分:2)

基于在issue Karma 1.6 breaks Headless support for Chrome上创建的github,它与较慢的机器相关并且发生了,因为它花了>在测试包被Chrome解析并执行之前60秒,因此测试运行已启动并传回Karma服务器。可能需要很长时间的原因各不相同。

有两种处理超时的方法:

调查测试捆绑包加载> 60秒并确保加载速度更快的原因。

  1. browserNoActivityTimeout增加到更高的值,因此测试捆绑 有足够的时间加载。
  2. 超时的这种特殊外观似乎不是一个业力 问题,而是项目中的问题或配置错误。
  3. 基于Derek's评论

    有一个连接太快断开了。

    他发现在/static/karma.js中,当创建套接字时,有一个超时值硬编码为2秒(见下文)。他刚刚添加了另外一个0来使其持续20秒并且连接保持打开足够长的时间以便服务器响应初始请求。 业力/客户端/ main.js

    e79463b中的第14至20行

    var socket = io(location.host, { 
       reconnectionDelay: 500, 
       reconnectionDelayMax: Infinity, 
       timeout: 2000, 
       path: KARMA_PROXY_PATH + KARMA_URL_ROOT.substr(1) + 'socket.io', 
       'sync disconnect on unload': true 
     }) 
    

    他面临的下一个问题是,Karma认为即使在插座上有来回的流量也没有任何活动。为了解决这个问题,他刚刚将browserNoActivityTimeout:60000添加到了Karma配置中。

    您需要更改配置文件中的超时配置。

答案 1 :(得分:1)

问题出在詹金的xbmc显示驱动器上。

我通过切换到Travic-CI进行了修复

before_install: - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start - sleep 3

答案 2 :(得分:1)

在运行 RHEL 7.5 Jenkins 上出现了相同的问题“ ChromHeadless在60000毫秒内未捕获”(失败3次)。 。尝试了几种配置,最终添加了-proxy-bypass-list -proxy-server 使其正常工作。

最低工作配置

 browsers: ['HeadlessChrome'],
    customLaunchers:{
      HeadlessChrome:{
        base: 'ChromeHeadless',
        flags: [
          '--no-sandbox',
          '--proxy-bypass-list=*',
          '--proxy-server=\'http://<my org proxy server>:8080\''
       ]
      }
    },

在下面,您可以在配置中看到一些其他选项,例如我所使用的选项。我们有两种浏览器配置,一种是Chrome,用于日常开发工作,我们希望该浏览器处于打开状态,另一种是在Jenkins服务器上构建解决方案时用于CI / CD测试的无头镶边。

在Jenkins中运行它的命令行:

npm run test -- -cc -sr --browser HeadlessChrome

package.json 中,我们在脚本部分中添加了几行:

 "test": "ng test",
    "test-dev": "ng test --browser Chrome",

karma.conf.js

 browsers: ['Chrome', 'HeadlessChrome'],
    customLaunchers:{
      HeadlessChrome:{
        base: 'ChromeHeadless',
        flags: [
          '--no-sandbox',
       //   '--remote-debugging-port=9222',
       //   '--enable-logging',
       //   '--user-data-dir=./karma-chrome',
       //   '--v=1',
       //   '--disable-background-timer-throttling',
       //   '--disable-renderer-backgrounding',
          '--proxy-bypass-list=*',
          '--proxy-server=\'http://<my org proxy server>:8080\''
       ]
      }
    },

完成上述步骤后,它就可以在Jenkins机器上的外壳上运行了。但是,当使用无法启动ChromeHeadless并尝试再次启动ChromeHeadless(1/2)来作为Jenkins作业运行时,失败。打印到控制台。

我比较了env变量,经过几次试验和错误后,发现登录到bash shell(无头chrome测试成功的地方)中存在 XDG_DATA_DIRS 环境变量,并且未在詹金斯工作失败的环境。因此,添加它(从shell env | grep XDG_DATA_DIRS 复制)最终解决了它。我想我应该检查应该在其中放置的最小配置/目录是什么,以及根本原因是什么,但是它现在可以正常工作了:-)

在运行测试之前将以下内容添加到jenkins作业中

export XDG_DATA_DIRS=/users/<jenkins user e.g. jk1003>/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/

另一种可能的解决方案

一个朋友告诉我,他很早以前使用Xvfb

解决了此类问题

答案 3 :(得分:1)

对我来说,我必须将Chrome本地ip /端口明确添加到NO_PROXY中,以便Karma可以捕获浏览器。

karma.conf.js中:

process.env.NO_PROXY = 'localhost, 0.0.0.0/4201, 0.0.0.0/9876';
process.env.no_proxy = 'localhost, 0.0.0.0/4201, 0.0.0.0/9876';

注意,即使我将其导出到我们的jenkinsfile中,它也不起作用,必须处于js进程中。

答案 4 :(得分:1)

package.json

"karma": "~1.7.1",
"karma-chrome-launcher": "~2.2.0",

karma.conf.js

browsers: ['ChromeHeadlessNoSandbox'],
customLaunchers: {
    ChromeHeadlessNoSandbox: {
        base: 'ChromeHeadless',
        flags: ['--no-sandbox']
    }
},

,并且需要将以下命令与--source-map = false

一起使用
"qa-test": "ng test --watch=false --progress=false --browsers=ChromeHeadless --code-coverage --source-map=false"

此更改后,我的构建成功。

答案 5 :(得分:0)

对我来说,以下工作似乎是版本和配置问题:

package.json 中 我正在使用:

"karma": "1.3.0",
"karma-chrome-launcher": "2.2.0"

karma conf 中添加此内容:

    browsers: ['ChromeHeadlessNoSandbox'],
    customLaunchers: {
        ChromeHeadlessNoSandbox: {
            base: 'ChromeHeadless',
            flags: ['--no-sandbox']
        }
    }

它将起作用。