web-dev-qa-db-ja.com

Karma Chrome Jenkinsで動作しないヘッドレス

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しかし、不足しているものや異常なものは表示されませんでした。

16
STEEL

問題はjenkinのxbmcディスプレイドライバーにありました。

Travic-CIに切り替えて修正しました

before_install: - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start - sleep 3
1
STEEL

問題Karma 1.6がChromeのヘッドレスサポートを中断する で作成された github に基づいて、テストバンドルが解析され、 Chromeによって実行されたため、テスト実行が開始され、Karmaサーバーに通信されました。時間がかかる理由は異なります。

タイムアウトを処理するには2つの方法があります。

テストバンドルが60秒以上読み込まれる理由を調査し、より速く読み込まれることを確認します。

  1. browserNoActivityTimeout をより高い値に増やすと、テストバンドルに十分なロード時間がかかります。
  2. タイムアウトのこの特定の外観はKarmaの問題ではなく、プロジェクトの問題または設定ミスのようです。

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構成に追加しただけです。

構成ファイルにある値よりも多くのタイムアウト構成を変更する必要があります。

4
Kiran Shahi

私にとっては、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プロセスである必要があります。

1
LeOn - Han Li

同じ問題「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 を使ってそのような問題をずっと前に解決したと言った

1
drordk