Ответ 1
Проблема заключалась в xbmc
дисплея jenkin xbmc
.
Я исправил его, переключившись на Travic-CI
before_install: - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start - sleep 3
Когда я запускаю приведенную ниже настройку с 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
но не показывал ничего отсутствующего или необычного.
Проблема заключалась в xbmc
дисплея jenkin xbmc
.
Я исправил его, переключившись на Travic-CI
before_install: - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start - sleep 3
Основываясь на выпуске Karma 1.6 Breaks Поддержка Chrome для Chrome, созданная на github, связана с более медленной машиной и происходит, потому что потребовалось> 60 секунд до того, как тестовый комплект был разобран и выполнен Chrome, и поэтому был запущен пробный запуск и передан обратно в Karma сервер. Причины, по которым это может занять много времени.
Существует два способа обработки тайм-аута:
Изучите, почему ваш тестовый комплект нагрузок> 60 секунд и убедитесь, что он загружается быстрее.
Основываясь на комментарии Дерека
Была связь, которая слишком рано отключилась.
Он обнаружил, что в /static/karma.js, когда сокет был создан, было значение тайм-аута, жестко запрограммированное на 2 секунды (см. Ниже). Он добавил еще 0, чтобы сделать это 20 секунд, и соединение оставалось открытым достаточно долго, чтобы сервер мог ответить на первоначальный запрос. карма/клиент/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
})
Следующая проблема, с которой он столкнулся, заключалась в том, что Карма считал, что нет активности, хотя в сокете происходит движение. Чтобы исправить это, он просто добавил браузерNoActivityTimeout: 60000 в конфигурацию Karma.
Вам нужно изменить конфигурацию тайм-аута больше, чем в файле конфигурации.
имел ту же проблему: " ChromHeadless не захватили в 60000 мс " (неудача после 3 попыток), на Jenkins, работающем на RHEL 7.5. Пробовал несколько конфигураций и, в конечном итоге, добавлял список -proxy-bypass, и -proxy-server заставлял его работать.
минимальная рабочая конфигурация
browsers: ['HeadlessChrome'],
customLaunchers:{
HeadlessChrome:{
base: 'ChromeHeadless',
flags: [
'--no-sandbox',
'--proxy-bypass-list=*',
'--proxy-server=\'http://<my org proxy server>:8080\''
]
}
},
Ниже вы можете увидеть еще несколько параметров в конфиге, например, тот, который я использовал. У нас есть две конфигурации браузера: Chrome для повседневной работы Dev, где мы хотим видеть браузер открытым, и безголовый хром для тестов CI/CD при построении нашего решения на сервере Jenkins.
Командная строка для запуска в 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). напечатан на консоли.
Я сравнивал переменные env и после нескольких проб и ошибок обнаружил, что переменная среды XDG_DATA_DIRS существует при регистрации в оболочке bash (где успешно выполняются тесты без головок chrome), и эта переменная не была определена в случае неудачной работы Jenkins. Поэтому его добавление (скопированное из оболочки env | grep XDG_DATA_DIRS) окончательно разрешило его. Думаю, я должен проверить, что такое минимальная конфигурация /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
Для меня я должен добавить chrome local ip/port явно к 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.