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つでのみ正常に実行されます。
たとえば、angular/ngcontainer
のdockerイメージを使用します。これには、UIアプリをテストするためのChromeheadlessを含むすべての構成があります。
image: 'angular/ngcontainer:latest'