MacでローカルにDockerを使用して以下のセットアップを実行すると、すべて正常に動作します。
ただし、Ubuntu 16.04で実行されているJenkinsでは同じセットアップは機能しません。
ChromiumHeadlessは60000ミリ秒でキャプチャできませんでした。殺しています。
次のエラーログはJenkins console:からのものです
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
しかし、不足しているものや異常なものは表示されませんでした。
問題はjenkinのxbmc
ディスプレイドライバーにありました。
Travic-CIに切り替えて修正しました
before_install: - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start - sleep 3
問題Karma 1.6がChromeのヘッドレスサポートを中断する で作成された github に基づいて、テストバンドルが解析され、 Chromeによって実行されたため、テスト実行が開始され、Karmaサーバーに通信されました。時間がかかる理由は異なります。
タイムアウトを処理するには2つの方法があります。
テストバンドルが60秒以上読み込まれる理由を調査し、より速く読み込まれることを確認します。
Derek's コメントに基づく
接続がすぐに切断されていました。
彼は、/ 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
})
彼が直面した次の問題は、ソケット上でトラフィックが行き来しているにも関わらず、カルマが活動はないと考えていたことでした。それを修正するために、彼はbrowserNoActivityTimeout:60000をKarma構成に追加しただけです。
構成ファイルにある値よりも多くのタイムアウト構成を変更する必要があります。
私にとっては、Karma
がブラウザをキャプチャできるように、chrome local ip/portをNO_PROXY
に明示的に追加する必要があります。
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プロセスである必要があります。
同じ問題「ChromHeadlessは60000ミリ秒でキャプチャされませんでした」(3回の試行後に失敗)、onJenkinson runningRHEL 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\''
]
}
},
以下に、私が使用したもののような設定のいくつかのオプションを見ることができます。 2つのブラウザー構成があります。ブラウザーを開いて見たい日々の開発作業用のChromeと、Jenkinsサーバーでソリューションを構築する際のCI/CDテスト用のヘッドレスchromeです。
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マシンのシェルから機能しました。ただし、ChromeHeadlessを起動できないJenkinsジョブとして実行すると失敗しました(ChromeHeadlessを再起動しようとしています(1/2)。コンソールに出力されました。).
Env変数を比較し、いくつかの試行錯誤の後、bashシェル(ヘッドレスchromeテストが成功した場合)にログインしたときにXDG_DATA_DIRS環境変数が存在することがわかりました。この変数は、失敗したJenkinsジョブenvで定義されていません。それを追加して(シェルからコピーenv | grep XDG_DATA_DIRS)最終的にそれを解決しました。私はそこに置くべき最小の構成/ディレクトリは何か、根本的な原因は何かを確認する必要があると思いますが、今は動作しています:-)
テストを実行する直前にジェンキンスジョブに以下を追加しました
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 を使ってそのような問題をずっと前に解決したと言った