Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Karma Chrome Headless not working on Jenkins

Tags:

When I run the below setup with Docker locally on my mac everything works fine.

But same setup does not work on Jenkins running on Ubuntu 16.04

ChromiumHeadless have not captured in 60000 ms, killing.

Following error log is from 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     }); }; 

I even tried with logLevel: config.LOG_DEBUG but did not show anything missing or unusual.

like image 633
STEEL Avatar asked May 25 '18 10:05

STEEL


People also ask

How do I run Chrome in headless mode?

As we have already seen, you just have to add the flag –headless when you launch the browser to be in headless mode. With CLI (Command Line Interface), just write: chrome \<br> – headless \ # Runs Chrome in headless mode. <br> – disable-gpu \ # Temporarily needed if running on Windows.

Can headless Chrome be detected?

Nonetheless, instrumenting Headless Chrome with a framework such as Puppeteer will still leave traces that make it possible to detect it as a non-human user.

What does running Chrome headless mean?

A headless browser is a web browser without a graphical user interface. Headless browsers provide automated control of a web page in an environment similar to popular web browsers, but they are executed via a command-line interface or using network communication.

Is Chromium a headless browser?

Headless Chromium allows running Chromium in a headless/server environment. Expected use cases include loading web pages, extracting metadata (e.g., the DOM) and generating bitmaps from page contents -- using all the modern web platform features provided by Chromium and Blink.


2 Answers

Based on issue Karma 1.6 breaks Headless support for Chrome created on github, it is related to the slower machine and happens, because it took > 60 seconds before test bundle was parsed and executed by Chrome and therefore test run was started and communicated back to Karma server. Reasons why it may take long vary.

There are 2 ways to handle timeout:

Investigate why your test bundle loads >60 seconds and make sure it loads faster.

  1. Increase browserNoActivityTimeout to highter value, so test bundle has enough time to load.
  2. This particular appearance of timeout does not seem to be a Karma issue, but rather problem in the project or misconfiguration.

Based on the Derek's comment

There was a connection that was disconnecting too soon.

He found that in /static/karma.js, when the socket was created, there was a timeout value that is hardcoded to 2 seconds (see below). He just added another 0 to make it 20 seconds and the connection stayed open long enough for the server to respond to the initial request. karma/client/main.js

Lines 14 to 20 in 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   })  

The next problem he faced was that Karma thought there was no activity even though there was traffic going back and forth on the socket. To fix that he just added browserNoActivityTimeout: 60000 to the Karma configuration.

You need to change the timeout configuration more then that is in the configuration file.

like image 177
Kiran Shahi Avatar answered Oct 09 '22 00:10

Kiran Shahi


package.json

"karma": "~1.7.1", "karma-chrome-launcher": "~2.2.0", 

karma.conf.js

browsers: ['ChromeHeadlessNoSandbox'], customLaunchers: {     ChromeHeadlessNoSandbox: {         base: 'ChromeHeadless',         flags: ['--no-sandbox']     } }, 

and need to use the below command with --source-map=false

"qa-test": "ng test --watch=false --progress=false --browsers=ChromeHeadless --code-coverage --source-map=false" 

my build got succeeded after this change.

like image 34
Abdul Rahim Avatar answered Oct 08 '22 23:10

Abdul Rahim