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} }, ]}
我有一个使用 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} }, ]}