Karma Chrome Headless не работает на Дженкинс - PullRequest
0 голосов
/ 25 мая 2018

Когда я запускаю приведенную ниже настройку с Docker локально на моем Mac, все работает нормально.

Но такая же настройка не работает на Jenkins, работающем в Ubuntu 16.04

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, но не показало ничего пропущенного или необычного.

Ответы [ 4 ]

0 голосов
/ 18 сентября 2018

Для меня мне нужно явно добавить локальный ip / порт chrome к 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.

0 голосов
/ 04 августа 2018

Проблема была с драйвером дисплея jenkin xbmc.

Я исправил его, переключившись на Travic-CI

before_install: - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start - sleep 3
0 голосов
/ 16 августа 2018
У

возникла та же проблема: « ChromHeadless не перехватил за 60000 мс » (ошибка после 3 попыток) на Jenkins на RHEL 7.5 .Перепробовал несколько конфигураций и, в конечном итоге, добавил - 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 для повседневной работы, где мы хотим видеть открытый браузер, и безголовый Chrome для тестов CI / CD при построении нашего решения на сервере Jenkins.

Командная строка длязапустите его в Jenkins:

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

В package.json мы добавили пару строк в раздел scripts :

 "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.Однако это не удалось при выполнении задания Jenkins с Невозможно запустить ChromeHeadless Попытка запустить ChromeHeadless снова (1/2). выводится на консоль.

Я сравнил переменные env, и послеВ результате нескольких проб и ошибок было обнаружено, что переменная среды XDG_DATA_DIRS существует при входе в оболочку bash (где успешно выполняются тесты chrome без заголовка), и эта переменная не была определена в невыполненном задании Jenkins env.Таким образом, добавление (скопированное из оболочки 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

0 голосов
/ 04 июня 2018

На основании проблемы Карма 1.6 ломает Поддержка безголового Chrome , созданного на github , это связано с более медленной машиной и происходит, потому что прошло более 60 секунд, прежде чем тестовый пакет был проанализировани выполняется Chrome, поэтому тестовый запуск был запущен и передан обратно на сервер Karma.Причины, по которым это может занять много времени, варьируются.

Существует два способа обработки таймаута:

Узнайте, почему ваш тестовый пакет загружается> 60 секунд, и убедитесь, что он загружается быстрее.

  1. Увеличьте browserNoActivityTimeout до более высокого значения, чтобы у тестового комплекта было достаточно времени для загрузки.
  2. Такое появление тайм-аута, похоже, не является проблемой кармы, а скорее проблемой в проекте.или неверная конфигурация.

Основано на комментариях Дерека

Не удалось установить соединение слишком рано.

Он обнаружил, что в /static / karma.js, когда был создан сокет, было значение тайм-аута, жестко заданное в 2 секунды (см. ниже).Он просто добавил еще 0, чтобы сделать это 20 секунд, и соединение оставалось открытым достаточно долго, чтобы сервер мог ответить на первоначальный запрос.karma / client / main.js

Строки с 14 по 20 в e79463b

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 
 }) 

Следующая проблема, с которой он столкнулся, заключалась в том, что Карма думал, что не было никакой активности, даже несмотря на то, что трафик шел туда-сюда.на розетке.Чтобы исправить это, он просто добавил browserNoActivityTimeout: 60000 в конфигурацию Karma.

Вам нужно изменить конфигурацию тайм-аута больше, чем в файле конфигурации.

...