Karma Chrome Headless 不适用于 Jenkins

新手上路,请多包涵

当我在我的 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",

文件

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 但没有显示任何缺失或异常。

原文由 STEEL 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 552
2 个回答

问题出在 jenkin 的 xbmc 显示驱动程序上。

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

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

原文由 STEEL 发布,翻译遵循 CC BY-SA 4.0 许可协议

基于 问题 Karma 1.6 breaks Headless support for Chrome created on github ,它与较慢的机器有关并且发生了,因为在 Chrome 解析和执行测试包之前花费了 > 60 秒,因此测试运行开始并传回 Karma服务器。可能需要很长时间的原因各不相同。

有两种处理超时的方法:

调查为什么您的测试包加载时间超过 60 秒,并确保加载速度更快。

  1. browserNoActivityTimeout 增加到更高的值,以便测试包有足够的时间加载。
  2. 这种超时的特殊表现似乎不是 Karma 问题,而是项目中的问题或配置错误。

根据 德里克的 评论

有一个连接断开得太快。

他发现在 /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 配置中。

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

原文由 Kiran Shahi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏