我有一个使用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.
覆盖任务的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文件的配置。浏览器是否有任何原因导致Jenkins上的* .json文件失败,但在Windows / Linux上运行正常。否则这里还有其他红旗吗?
" browserify-istanbul"变形是罪魁祸首吗?
答案 0 :(得分: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正在做诡计...而且我是对的,我可以打赌在你的bundle错误路径中:/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} }, ]}