Lors de l'exécution d'un pipeline CI/CD sur Gitlab, mes tests Karma expirent avec l'erreur:
ℹ 「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.
Ce problème ne se produit pas lors de l'exécution de tests localement, et il ne se produit pas lors de l'exécution de tests à l'aide de l'image Docker même avec Gitlab Runner localement.
J'ai l'impression d'avoir essayé toutes les configurations possibles avec karma.conf.js
. J'ai cherché sur Google ce problème sans relâche et j'ai essayé toutes les suggestions des serveurs proxy, des variables d'environnement, des drapeaux ... mais hélas, pas de chance. J'ai essayé plusieurs images Docker car cela échouait initialement sur Gitlab Runner local mais j'ai trouvé que l'image Docker Selenium/standalone-chrome:latest
fonctionne bien dans Gitlab Runner local.
Voici mon karma.conf.js
fichier:
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
})
}
Et voici mon fichier .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
Je m'attends à ce que les tests s'exécutent avec succès dans les trois instances (npm local, Gitlab Runner local et pipeline Gitlab CI/CD distant). Actuellement, il ne fonctionne qu'avec succès dans les deux premiers.
par exemple, utilisez l'image docker de angular/ngcontainer
. Cela a toutes les configurations, y compris chromeheadless pour tester les applications d'interface utilisateur.
image: 'angular/ngcontainer:latest'