在尝试生成 Jenkins 管道作业的合并覆盖率报告时,我遇到了一些奇怪的事情。
我有一个 Nx 驱动的 Angular monorepo,并且正在生成涵盖其中包含的所有库和项目的覆盖率报告。
我整理了以下脚本来运行测试,然后使用
nyc
进行合并和报告操作。
const { execSync } = require('child_process');
const packageJSON = require("../package.json");
const EXCLUDE_UNIT_TEST = packageJSON.buildData.excludeUnitTest;
const run = (commands) => {
commands.forEach((command) => execSync(command, { stdio: 'inherit' }));
};
run([
`rm -rf coverage`,
`npx nx run-many --target=test --all --maxWorkers=4 --exclude=${EXCLUDE_UNIT_TEST} --coverage=true`,
`npx copyfiles -f 'coverage/**/*coverage.json' coverage/project-parts`,
`npx nyc merge coverage/project-parts coverage/nyc/combined.json`,
`npx nyc report --reporter html-spa --reporter lcov -t coverage/nyc --report-dir coverage/combined`
]);
这对我在本地非常有效,我看到我所有的库/项目都有一个 HTML 报告(lcov 格式和 html-spa 报告)。
但是当在我们的 Jenkins(我们使用 EC2 从属插件)的节点上执行相同的脚本时,HTML 报告是空的。
stage('Gate 2 - Test') {
steps {
echo "GATE 2 - Test"
ansiColor('xterm') {
sh 'npm run tests:all'
}
}
post {
success {
publishHTML (target : [allowMissing: false,
alwaysLinkToLastBuild: false,
keepAll: false,
reportDir: 'coverage/combined',
reportFiles: 'index.html',
reportName: 'Magma Code Coverage',
reportTitles: 'Coverage Report'])
}
}
}
当在 Jenkins 上运行构建作业并且这些文件不为空时,我确实看到了生成的工作区中
copyfiles
和 nyc merge
命令的输出,这些文件中有很多内容详细说明了各种覆盖信息.
nyc merge
生成的最终合并文件超过20Mb.
这只是
nyc report
命令似乎是问题所在。
深入了解 Jenkins 的构建日志,我在 HTML 发布步骤中也没有看到任何错误。
有没有人在 CI 与本地环境上使用
nyc
遇到类似的问题,意外的覆盖率结果?
是否有任何调试/详细输出标志可以与
nyc
命令一起使用,以帮助我解决问题?