web-dev-qa-db-ja.com

「ChromeHeadlessは60000ミリ秒でキャプチャできず、殺されました。」 GitlabがホストするCI / CDパイプラインでのみ発生

GitlabでCI/CDパイプラインを実行すると、私のKarmaテストが次のエラーでタイムアウトします。

ℹ 「wdm」: Compiled successfully.
05 08 2019 22:25:31.483:INFO [karma-server]: Karma v4.2.0 server started at http://0.0.0.0:9222/
05 08 2019 22:25:31.485:INFO [launcher]: Launching browsers ChromeHeadlessNoSandbox with concurrency 1
05 08 2019 22:25:31.488:INFO [launcher]: Starting browser ChromeHeadless
05 08 2019 22:26:31.506:WARN [launcher]: ChromeHeadless have not captured in 60000 ms, killing.
05 08 2019 22:26:31.529:INFO [launcher]: Trying to start ChromeHeadless again (1/2).
05 08 2019 22:27:31.580:WARN [launcher]: ChromeHeadless have not captured in 60000 ms, killing.
05 08 2019 22:27:31.600:INFO [launcher]: Trying to start ChromeHeadless again (2/2).
05 08 2019 22:28:31.659:WARN [launcher]: ChromeHeadless have not captured in 60000 ms, killing.
05 08 2019 22:28:31.689:ERROR [launcher]: ChromeHeadless failed 2 times (timeout). Giving up.



npm ERR! Test failed.  See above for more details.

この問題は、テストをローカルで実行する場合には発生せず、Gitlab Runnerでローカルにsame Dockerイメージを使用してテストを実行する場合にも発生しません。

karma.conf.jsを使用して可能な構成をすべて試したような気がします。私はこの問題を執拗にグーグル検索し、プロキシサーバーから環境変数、フラグまですべての提案を試みましたが、残念ながら運がありません。ローカルのGitlab Runnerでは最初は失敗していたので、複数のDockerイメージを試しましたが、ローカルのGitlab RunnerではDockerイメージSelenium/standalone-chrome:latestが正常に機能することがわかりました。

これが私のkarma.conf.jsファイルです。

const process = require('process');
process.env.CHROME_BIN = require('puppeteer').executablePath();

module.exports = function(config) {
  config.set({

    // base path that will be used to resolve all patterns (eg. files, exclude)
    basePath: '',

    // frameworks to use
    frameworks: [ 'jasmine' ],

    // list of files / patterns to load in the browser
    files: [
      'src/**/*.spec.js'
    ],

    // list of files / patterns to exclude
    exclude: [],

    // preprocess matching files before serving them to the browser
    preprocessors: {
      'src/**/*.spec.js': [ 'webpack' ]
    },

    webpack: {
      // webpack configuration
      mode: 'development',
      module: {
        rules: [
          {
            test: /\.js$/,
            loader: 'babel-loader',
            exclude: /node_modules/,
            query: {
              presets: ['env']
            }
          }
        ]
      },
      stats: {
        colors: true
      }
    },


    // test results reporter to use
    reporters: [ 'spec' ],

    // web server port
    port: 9222,

    // enable / disable colors in the output (reporters and logs)
    colors: true,

    // level of logging
    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
    logLevel: config.LOG_INFO,

    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,

    // plugins for karma
    plugins: [
      'karma-chrome-launcher',
      'karma-webpack',
      'karma-jasmine',
      'karma-spec-reporter'
    ],

    // start these browsers
    browsers: ['ChromeHeadlessNoSandbox'],
    customLaunchers: {
      ChromeHeadlessNoSandbox: {
        base: 'ChromeHeadless',
        flags: [
          '--headless',
          '--no-sandbox',
          '--disable-gpu'
        ]
      }
    },
    captureTimeout: 60000,
    browserDisconnectTolerance: 5,
    browserDisconnectTimeout : 30000,
    browserNoActivityTimeout : 30000,

    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: true,

    // Concurrency level
    // how many browser should be started simultaneous
    concurrency: 1
  })
}

そして、これが私の.gitlab-ci.ymlファイルです:

.prereq_scripts: &prereq_scripts |
  Sudo apt -y update && Sudo curl -sL https://deb.nodesource.com/setup_10.x | Sudo bash && Sudo apt -y install nodejs

image: 'Selenium/standalone-chrome:latest'

stages:
- test

test:
  stage: test
  script:
  - *prereq_scripts
  - npm install
  - npm test

3つのインスタンスすべて(ローカルnpm、ローカルGitlab Runner、リモートGitlab CI/CDパイプライン)でテストが正常に実行されることを期待しています。現在、最初の2つでのみ正常に実行されます。

4
nevardreik

chromeheadlessでDockerイメージを試す

たとえば、angular/ngcontainerのdockerイメージを使用します。これには、UIアプリをテストするためのChromeheadlessを含むすべての構成があります。

  image: 'angular/ngcontainer:latest'

https://hub.docker.com/r/angular/ngcontainer

0
Anulal S