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