Мы перемещаем веб-сайт на основе Angular (Angular, NgRx и Angular Material Starter) с CircleCI на Shippable, и теперь я получаю следующие сбои:
27 05 2019 14:46:00.036:INFO [karma-server]: Karma v4.0.1 server started at http://0.0.0.0:9876/
27 05 2019 14:46:00.040:INFO [launcher]: Launching browsers ChromeShippable with concurrency unlimited
27 05 2019 14:46:00.071:INFO [launcher]: Starting browser Chrome
27 05 2019 14:46:01.326:ERROR [launcher]: Cannot start Chrome
nvm is not compatible with the "npm_config_prefix" environment variable: currently set to "/build/versions/node/v10.14.1"
Run `unset npm_config_prefix` to unset it.
27 05 2019 14:46:01.327:ERROR [launcher]: Chrome stdout:
27 05 2019 14:46:01.327:ERROR [launcher]: Chrome stderr: nvm is not compatible with the "npm_config_prefix" environment variable: currently set to "/build/versions/node/v10.14.1"
Run `unset npm_config_prefix` to unset it.
Я могу поделиться дополнительной конфигурацией, но тот же самый код, созданный в CircleCI, теперь не работает в Shippable.
Я могу воспроизвести локально (в моем локальном Docker), используя образ drydock/u16nodall
.
Перед запуском npm мы устанавливаем следующие переменные окружения:
export PATH = "./node_modules/.bin:$PATH";
export CHROME_BIN=chromium-browser;
export DISPLAY=:99.0;
Различные версии NPM или Node, похоже, не имеют значения.
karma.conf.js
имеет это:
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html
module.exports = function (config) {
var isWatch = config.buildWebpack.options.watch;
config.set({
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
plugins: [
require('karma-jasmine'),
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-spec-reporter'),
require('karma-coverage-istanbul-reporter'),
require('@angular-devkit/build-angular/plugins/karma')
],
client: {
clearContext: false // leave Jasmine Spec Runner output visible in browser
},
coverageIstanbulReporter: {
dir: require('path').join(__dirname, '../shippable/codecoverage'),
reports: ['cobertura', 'html', 'lcovonly', 'json'],
fixWebpackSourcePaths: true,
thresholds: {
statements: 80,
lines: 80,
branches: 72,
functions: 80
}
},
reporters: ['spec'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
customLaunchers: {
ChromeShippable: {
base: 'Chrome',
flags: ['--no-sandbox','--disable-setuid-sandbox']
}
},
browserNoActivityTimeout: 50000,
singleRun: !isWatch
});
};
Все, что мне удалось найти в связи с ошибкой _несовместимого npm_config_prefix_, похоже, связано с поврежденной установкой узла. Но установка свежей версии с NVM тоже показывает эту ошибку.
Любые идеи, как заставить это работать?
Наконец-то я смог решить эту проблему, обновив конфигурацию customLauchers
, чтобы она основывалась на ChromeHeadless
вместо Chrome
.
customLaunchers: {
ChromeShippable: {
base: 'ChromeHeadless',
flags: ['--no-sandbox','--disable-setuid-sandbox']
}
},
Я еще не закончил искать ошибки в готовой миграции, но, по крайней мере, это устраняет ошибку, о которой я конкретно спрашивал. Я уже подтвердил, что это работает нормально (не происходит сбой при запуске Chrome) и на ящиках для сборки, которые можно отправить.
Обновлено: Большинство всех последующих ошибок также были связаны с тем, что Chrome необходимо явно запускать как безголовый.
Добавлено в .pa11yci
's defaults
:
"chromeLaunchConfig": {
"args": ["--no-sandbox","--disable-setuid-sandbox","--disable-dev-shm-usage"]
}
Добавлено в экспортированные e2e/protractor.conf.js
capabilities
:
'chromeOptions': {
args: [ '--headless', '--disable-gpu', '--no-sandbox','--disable-setuid-sandbox','--disable-dev-shm-usage']
}
Было много других изменений, выходящих за рамки этого вопроса.