grunt karma 覆盖率在 jenkins 上失败,但在 windows/unix 上有效

grunt karma coverage fails on jenkins but works on windows/unix

我有一个使用 grunt 和 browserify 构建的节点项目,并使用 browserify-istanbul 使用 karma 和 jasmine 测试代码覆盖率。

该任务在 windows 和 linux 上都运行良好,但是由于 browserify 而在 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.

覆盖任务的karma配置如下:

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 文件。是否有任何原因导致 browserify 在 Jenkins 上的 *.json 文件上失败,但在 Windows/Linux 上运行良好。否则这里还有其他危险信号吗?

"browserify-istanbul" 转换可能是这里的罪魁祸首吗?

也许我来晚了一点,但这将解决像我这样为这个问题而苦苦挣扎的少数人的生活。

如果我们看一下 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);
  });
}

我的第一个猜测是,由于某种原因,默认的忽略被忽略了,所以我强制它...但问题仍然存在。

剩下的第二种也是唯一的可能性是 minimatch 在耍花招……我是对的,我可以打赌在你的包错误路径中:/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} }, ]}