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

Posted

技术标签:

【中文标题】grunt karma 覆盖在 jenkins 上失败,但在 windows/unix 上有效【英文标题】:grunt karma coverage fails on jenkins but works on windows/unix 【发布时间】:2017-06-18 02:31:30 【问题描述】:

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

该任务在 windows 和 linux 上都可以正常运行,但是由于 browserify 而在 jenkins 上运行时失败。

运行“业力:覆盖”(业力)任务 31 01 2017 11:38:48.891:ERROR [framework.browserify]: 捆绑错误 31 01 2017 11:38:48.892:ERROR [framework.browserify]:错误:第 2 行:意外令牌:解析文件时:/a/path/to/a/file.json 31 01 2017 11:38:48.912:INFO [karma]: Karma v1.4.1 服务器在 http://0.0.0.0:9876/ 开始 2017 年 3 月 1 日 11:38:48.913:INFO [启动器]:以无限并发启动浏览器 PhantomJS 31 01 2017 11:38:48.917:ERROR [framework.browserify]: 捆绑错误 31 01 2017 11:38:48.918:ERROR [framework.browserify]:错误:第 2 行:意外令牌:解析文件时:/a/path/to/another/file.json 2017 年 3 月 1 日 11:38:48.922:INFO [启动器]:启动浏览器 PhantomJS 31 01 2017 11:38:49.561:INFO [PhantomJS 2.1.1 (Linux 0.0.0)]: 连接到套接字 hd7llziNhpmzkjibAAAB 与 id 81120883 警告:任务“业力:覆盖”失败。使用 --force 继续。

覆盖任务的业力配置如下:

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”转换可能是这里的罪魁祸首吗?

【问题讨论】:

删除引用 *.json 文件的测试文件可以解决问题。有什么理由为什么这应该发生在 Jenkins 上,而不是在过度环境中?将 browserify-istanbul 转换与其他转换一起使用似乎是一个问题。 【参考方案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);
  );

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

剩下的第二个也是唯一的可能性是 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 , ]

【讨论】:

完全忘记了这个问题 - 你的答案看起来很棒!

以上是关于grunt karma 覆盖在 jenkins 上失败,但在 windows/unix 上有效的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jenkins 从 Karma.js 获得百分比覆盖率

当主机更改源时,grunt karma 对 vagrant 进行测试 grunt/karma 未检测到它

Karma start和grunt karma之间的区别:单位

KarmaJS 中的代码覆盖率过高,具有 karma-coverage 和 Jasmine

使用grunt时找不到模块'karma'

Sonarqube 默认覆盖范围为 0,来自具有绝对路径的 Karma Coverage LCOV 文件