当我在我的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",
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
,但没有显示任何遗漏或异常。
答案 0 :(得分:2)
基于在issue Karma 1.6 breaks Headless support for Chrome上创建的github,它与较慢的机器相关并且发生了,因为它花了>在测试包被Chrome解析并执行之前60秒,因此测试运行已启动并传回Karma服务器。可能需要很长时间的原因各不相同。
有两种处理超时的方法:
调查测试捆绑包加载> 60秒并确保加载速度更快的原因。
基于Derek's评论
有一个连接太快断开了。
他发现在/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配置中。
您需要更改配置文件中的超时配置。
答案 1 :(得分:1)
问题出在詹金的xbmc
显示驱动器上。
我通过切换到Travic-CI进行了修复
before_install: - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start - sleep 3
答案 2 :(得分:1)
在运行 RHEL 7.5 的 Jenkins 上出现了相同的问题“ ChromHeadless在60000毫秒内未捕获”(失败3次)。 。尝试了几种配置,最终添加了-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,用于日常开发工作,我们希望该浏览器处于打开状态,另一种是在Jenkins服务器上构建解决方案时用于CI / CD测试的无头镶边。
在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)来作为Jenkins作业运行时,失败。打印到控制台。
我比较了env变量,经过几次试验和错误后,发现登录到bash shell(无头chrome测试成功的地方)中存在 XDG_DATA_DIRS 环境变量,并且未在詹金斯工作失败的环境。因此,添加它(从shell 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
解决了此类问题答案 3 :(得分:1)
对我来说,我必须将Chrome本地ip /端口明确添加到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进程中。
答案 4 :(得分:1)
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"
此更改后,我的构建成功。
答案 5 :(得分:0)
对我来说,以下工作似乎是版本和配置问题:
在 package.json 中 我正在使用:
"karma": "1.3.0",
"karma-chrome-launcher": "2.2.0"
在 karma conf 中添加此内容:
browsers: ['ChromeHeadlessNoSandbox'],
customLaunchers: {
ChromeHeadlessNoSandbox: {
base: 'ChromeHeadless',
flags: ['--no-sandbox']
}
}
它将起作用。