web-dev-qa-db-fra.com

Karma Chrome Headless ne fonctionne pas sur Jenkins

Lorsque je lance la configuration ci-dessous avec Docker localement sur mon mac, tout fonctionne correctement.

Mais la même configuration ne fonctionne pas sur Jenkins fonctionnant sous Ubuntu 16.04

ChromiumHeadless n'a pas capturé en 60000 ms, la mise à mort.

Le journal des erreurs suivant provient de Console 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
    });
};

J'ai même essayé avec logLevel: config.LOG_DEBUG mais je n'ai rien montré qui manque ou qui soit inhabituel.

13
STEEL

Le problème concernait le pilote d'affichage xbmc du jenkin.

Je l'ai corrigé en passant à Travic-CI

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

Basé sur issue Karma 1.6 rompt le support sans tête pour Chrome créé sur github , il est lié à la machine plus lente et se produit car il a fallu plus de 60 secondes avant que l’ensemble de tests ne soit analysé et exécuté par Chrome et, par conséquent, teste. run a été démarré et renvoyé au serveur Karma. Les raisons pour lesquelles cela peut prendre longtemps varient.

Il y a 2 façons de gérer le délai d'attente:

Recherchez pourquoi votre groupe de tests charge plus de 60 secondes et assurez-vous qu'il se charge plus rapidement.

  1. Augmentez browserNoActivityTimeout à une valeur plus élevée, ainsi le groupe de tests A suffisamment de temps pour se charger.
  2. Cette apparence particulière de timeout ne semble pas être un problème de Karma , Mais plutôt un problème dans le projet ou une mauvaise configuration.

Basé sur le Derek's comment

Il y avait une connexion qui se déconnectait trop tôt.

Il a constaté que dans /static/karma.js, lors de la création du socket, il existait une valeur de délai d'attente codée en dur sur 2 secondes (voir ci-dessous). Il a juste ajouté un autre 0 pour qu'il reste 20 secondes et la connexion est restée ouverte suffisamment longtemps pour que le serveur réponde à la demande initiale . Karma/client/main.js

Lignes 14 à 20 de 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 
 }) 

Le problème suivant qu'il rencontra fut que Karma pensait qu'il n'y avait aucune activité même s'il y avait du trafic dans les deux sens. Pour résoudre ce problème, il a simplement ajouté browserNoActivityTimeout: 60000 à la configuration de Karma.

Vous devez modifier la configuration du délai d'attente plus que cela se trouve dans le fichier de configuration.

2
Kiran Shahi

avait le même problème "ChromHeadless n'a pas capturé en 60000 ms" (échec après 3 tentatives), sur Jenkins s'exécutant sur RHEL 7.5. J'ai essayé plusieurs configurations, et en ajoutant éventuellement les --proxy-bypass-list et --proxy-server, cela a fonctionné.

configuration de travail minimale

 browsers: ['HeadlessChrome'],
    customLaunchers:{
      HeadlessChrome:{
        base: 'ChromeHeadless',
        flags: [
          '--no-sandbox',
          '--proxy-bypass-list=*',
          '--proxy-server=\'http://<my org proxy server>:8080\''
       ]
      }
    },

Ci-dessous, vous pouvez voir quelques options supplémentaires dans la configuration, comme celle que j'ai utilisée. Nous avons deux configurations de navigateur, Chrome pour le travail quotidien du développeur où nous souhaitons voir le navigateur ouvert et un chrome sans tête pour les tests CI/CD lors de la construction de notre solution sur un serveur Jenkins.

Ligne de commande pour l'exécuter dans Jenkins:

npm run test -- -cc -sr --browser HeadlessChrome

Dans package.json, nous avons ajouté quelques lignes à la section 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\''
       ]
      }
    },

Après les étapes ci-dessus, cela a fonctionné à partir d'un Shell sur la machine Jenkins. Toutefois, cela a échoué lors de l'exécution en tant que tâche Jenkins avec Impossible de démarrer ChromeHeadless. Essayez de redémarrer ChromeHeadless (1/2). imprimé sur la console.

J'ai comparé les variables env. Après quelques essais et des erreurs, il a été constaté que la variable d'environnement XDG_DATA_DIRS existait lorsqu'elle était consignée dans un shell bash (où les tests chromés sans en-tête réussissent) et que cette variable n'était pas définie dans le travail Jenkins défaillant. Donc, l'ajouter (copié à partir du shell env | grep XDG_DATA_DIRS) l'a finalement résolu. Je suppose que je devrais vérifier quelle est la configuration minimale/les répertoires que je devrais y mettre, et quelle est la cause première, mais ça fonctionne maintenant :-)

Ajout du texte ci-dessous au travail Jenkins juste avant d'exécuter le test

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/

Une autre solution possible

Un ami m'a dit qu'il avait résolu ce problème il y a longtemps en utilisant Xvfb

1
drordk

Pour moi, je dois ajouter explicitement l'ip/port local chrome à NO_PROXY pour que Karma puisse capturer le navigateur.

Dans le 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';

Remarque, même si je l'exporte dans notre jenkinsfile, cela ne fonctionne pas, devez être dans le processus js. 

0
Leon li