покрытие grunt karma не работает на jenkins, но работает на windows/unix

У меня есть проект node, который построен с использованием grunt и browserify и протестирован с использованием karma и jasmine с использованием browserify-istanbul для покрытия кода.

Задача отлично работает как в Windows, так и в Linux, однако она не работает на jenkins из-за браузера.

Running "karma:coverage" (karma) task
31 01 2017 11:38:48.891:ERROR [framework.browserify]: bundle error
31 01 2017 11:38:48.892:ERROR [framework.browserify]: Error: Line 2:      Unexpected token : while parsing file: /a/path/to/a/file.json
31 01 2017 11:38:48.912:INFO [karma]: Karma v1.4.1 server started at http://0.0.0.0:9876/
31 01 2017 11:38:48.913:INFO [launcher]: Launching browser PhantomJS with unlimited concurrency
31 01 2017 11:38:48.917:ERROR [framework.browserify]: bundle error
31 01 2017 11:38:48.918:ERROR [framework.browserify]: Error: Line 2: Unexpected token : while parsing file: /a/path/to/another/file.json
31 01 2017 11:38:48.922:INFO [launcher]: Starting browser PhantomJS
31 01 2017 11:38:49.561:INFO [PhantomJS 2.1.1 (Linux 0.0.0)]: Connected on socket hd7llziNhpmzkjibAAAB with id 81120883
Warning: Task "karma:coverage" failed. Use --force to continue.

Конфиг кармы для задачи покрытия такой:

module.exports = function( config ) {
  config.set({
    basePath: '..',
    frameworks: [ 'browserify', 'jasmine' ],
    files: [
      // load dependencies here
      { pattern: 'test/**/*.spec.js', watched: false, included: true, served: true },
      { pattern: 'spec/**/*.json', watched: true, served: true, included: false },
      { pattern: 'spec/**/*.xml', watched: true, served: true, included: false },
      { pattern: 'spec/**/*.html', watched: true, included: false, served: true },
    ],
    preprocessors: {
      'test/**/*.spec.js': [ 'browserify' ]
    },
    reporters: [ 'coverage' ],
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: false,
    browsers: [ 'PhantomJS' ],
    browserify: {
      debug: true,
      transform: [ 'browserify-shim', 'hbsfy', 'brfs', 'browserify-istanbul', {
        ignore: [
          '**/test/**',
          '**/*.hbs',
          '**/*.json',
          '**/js/shims/*.js',
        ],
      },
    ]},
    coverageReporter = {
      dir: 'coverage',
      reporters: [
        {type: 'text'},
        {type: 'html', subdir: '.'},
        {type: 'cobertura', subdir: '.'}
      ]
    },
    plugins: [
      'karma-phantomjs-launcher',
      'karma-jasmine',
      'karma-browserify',
      'karma-mocha-reporter'
      'karma-coverage',
    ],
    singleRun: true
  });
 };

У меня есть другие проекты, которые отлично работают с этой конфигурацией и не имеют файлов json. Есть ли причина, по которой браузер не работает с файлами *.json в Jenkins, но отлично работает в Windows/Linux. В противном случае есть ли здесь какие-либо другие красные флажки?

Может быть, здесь виновато преобразование «browserify-istanbul»?


person Alex King    schedule 01.02.2017    source источник
comment
Удаление тестов, которые тестируют файлы, которые ссылаются на файлы *.json, решает проблему. Есть ли причина, по которой это должно происходить в Jenkins, а не в других средах? Похоже, это проблема использования преобразования browserify-istanbul вместе с другими преобразованиями.   -  person Alex King    schedule 01.02.2017


Ответы (1)


Может быть, я немного опоздал, но это решило бы жизнь для немногих людей, таких как я, которые борются с этой проблемой.

Если мы посмотрим на browserify-istanbul, то увидим эту функцию:

function shouldIgnoreFile(file, options) {
  var ignore = options.defaultIgnore === false ? [] : defaultIgnore;
  ignore = ignore.concat(options.ignore || []);

  return ignore.some(function(pattern) {
    return minimatch(file, pattern, options.minimatchOptions);
  });
}

Мое первое предположение заключалось в том, что по какой-то причине игнорирование по умолчанию было игнорированием, поэтому я заставил его... но проблема не устранена.

Вторая и единственная оставшаяся возможность заключалась в том, что миниматч обманывал... и я был прав, могу поспорить, что в вашем пути ошибки пакета: /a/path/to/a/file.json есть каталог, который начинается с ., например .jenkins/test-enviroment/src/.../file.json, и вот в чем проблема. В вашей локальной среде вам не нужно проверять путь к каталогам или файлам, начинающимся с точки, но в каталоге jenkins этот .directory добавляется к пути, что приводит к сбою проверки шаблона подстановочных знаков.

Исправить это так же просто, как передать параметр minimatchOptions: {dot: true} в browserify-istanbul.

browserify: { debug: true, transform: [ 'browserify-shim', 'hbsfy', 'brfs', 'browserify-istanbul', { ignore: [ '**/test/**', '**/*.hbs', '**/*.json', '**/js/shims/*.js', ], minimatchOptions: {dot: true} }, ]}

person SirPeople    schedule 11.10.2017
comment
Совершенно забыл об этой проблеме - ваш ответ выглядит великолепно! - person Alex King; 11.10.2017