Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Karma Chrome Headless对Jenkins不起作用_Javascript_Docker_Jenkins_Karma Runner - Fatal编程技术网

Javascript Karma Chrome Headless对Jenkins不起作用

Javascript Karma Chrome Headless对Jenkins不起作用,javascript,docker,jenkins,karma-runner,Javascript,Docker,Jenkins,Karma Runner,当我在mac上本地运行Docker的以下设置时,一切正常 但同样的设置在运行Ubuntu 16.04的Jenkins上不起作用 六万毫秒内未捕获铬人头,导致死亡。 以下错误日志来自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

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

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

六万毫秒内未捕获铬人头,导致死亡。

以下错误日志来自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——单次运行”

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
    });
};
 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\''
       ]
      }
    },
我甚至尝试了
logLevel:config.LOG_DEBUG
,但没有显示任何缺失或异常情况。

基于创建的,它与较慢的机器有关,并且会发生,因为Chrome解析和执行测试包花费了>60秒,因此启动测试运行并将其传回Karma服务器。可能需要很长时间的原因各不相同

有两种方法可以处理超时:

调查为什么测试包的加载时间大于60秒,并确保加载速度更快

  • 增加到更高的值,因此测试包 有足够的时间加载
  • 这种特殊的超时现象似乎不是因果报应 问题,而是项目中的问题或错误配置
  • 根据评论,

    有一个连接过早断开

    他发现在/static/karma.js中,当创建套接字时,有一个超时值被硬编码为2秒(见下文)。他只添加了另一个0,使其保持20秒,并且连接保持打开足够长的时间,以便服务器响应初始请求。 karma/client/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认为即使插座上有来往的车辆,也没有任何活动。为了解决这个问题,他刚刚在Karma配置中添加了browserNoActivityTimeout:60000


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

    问题在于jenkin的
    xbmc
    显示驱动程序

    我通过切换到Travic CI解决了这个问题

    before_install: - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start - sleep 3
    
    在运行RHEL 7.5的Jenkins上有相同的问题“ChromHeadless在60000毫秒内未捕获”(尝试3次失败)。尝试了几种配置,并最终添加了--代理绕过列表,而--代理服务器使其正常工作

    最小工作配置

     browsers: ['HeadlessChrome'],
        customLaunchers:{
          HeadlessChrome:{
            base: 'ChromeHeadless',
            flags: [
              '--no-sandbox',
              '--proxy-bypass-list=*',
              '--proxy-server=\'http://<my org proxy server>:8080\''
           ]
          }
        },
    
    package.json中,我们在脚本部分添加了几行内容:

     "test": "ng test",
        "test-dev": "ng test --browser Chrome",
    
    karma.conf.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
        });
    };
    
     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\''
           ]
          }
        },
    
    浏览器:['Chrome','HeadlessChrome'],
    自定义启动器:{
    无头镀铬:{
    碱:“无铬”,
    旗帜:[
    “没有沙箱”,
    //“--远程调试端口=9222”,
    //“--启用日志记录”,
    //“--用户数据目录=。/karma chrome”,
    //“--v=1”,
    //“--禁用后台计时器限制”,
    //“--禁用渲染器背景”,
    “--代理绕过列表=*”,
    “--代理服务器=\'http://:8080\'
    ]
    }
    },
    
    经过上述步骤后,它在詹金斯机器上的外壳上工作。但是,作为Jenkins作业运行时失败,无法启动ChromeHeadless尝试再次启动ChromeHeadless(1/2)。打印到控制台

    我比较了env变量,经过几次尝试和错误后发现,XDG_DATA_DIRS环境变量在登录bash shell时存在(headless chrome测试成功),并且该变量未在失败的Jenkins作业env中定义。因此,添加它(从shellenv|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/
    
    export XDG_DATA_DIRS=/users/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
    
    另一种可能的解决方案

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

    一位朋友告诉我,他很久以前就用

    解决了这样一个问题。对我来说,我必须将chrome本地ip/端口显式添加到
    无代理
    ,以便
    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过程中

    对我来说,以下是有效的版本和配置问题:

    package.json中 我正在使用:

    "karma": "1.3.0",
    "karma-chrome-launcher": "2.2.0"
    
    业力形态中添加以下内容:

        browsers: ['ChromeHeadlessNoSandbox'],
        customLaunchers: {
            ChromeHeadlessNoSandbox: {
                base: 'ChromeHeadless',
                flags: ['--no-sandbox']
            }
        }
    
    它应该可以工作。

    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"
    

    我的构建在这次更改后成功。

    我能够在安装之前使用Travic CI
    解决这个问题:-导出显示=:99.0-sh-e/etc/init.d/xvfb start-sleep 3
    如果您需要xvfb,这意味着您没有在任何时候运行headlessall@TarunLalwani我可能错了,但我在《因果报应》中添加了无头配置<代码>基本:ChromeHeadless我可以看到,但可能是浏览器因某些错误而崩溃,因此我们可能需要获取该进程的输出。我不确定如何获取chrome崩溃的日志。你能给我指一下方向吗![请注意]我们已经决定将团队转移到Travic CI,因为它易于使用且每次操作的Bugsa更少,它与XVFB一起工作,这特别表明浏览器可能在无头模式下崩溃。所以我认为这可能与浏览器启动缓慢无关。如果发射速度慢,在XVFB下会慢also@Kiran谢谢你的回答。但同样的因果报应模式也适用于特拉维斯·西。TarunLalwani感谢
    browserNoActivityTimeout
    我玩了这个属性,运气不好,忘了t