Jenkins 与本地环境的纽约报告输出不同

min*_*rse 5 jenkins istanbul jenkins-pipeline nyc nrwl-nx

当我尝试生成 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`
]);
Run Code Online (Sandbox Code Playgroud)

这在本地对我来说效果很好,我看到我的所有库/项目都有一个 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'])
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

当构建作业在 Jenkins 上运行并且这些文件不为空时,我确实看到了生成的工作区中的copyfiles和命令的输出,其中有大量内容详细说明了各种覆盖信息。nyc merge

最终nyc merge生成的组合文件超过 20Mb。

在此输入图像描述

这似乎只是nyc report命令的问题。

深入研究 Jenkins 上的构建日志,我在 HTML 发布步骤中也没有看到任何错误。

在此输入图像描述

有没有人在 CI 与本地环境中使用时遇到过类似的意外覆盖结果问题nyc

是否有任何调试/详细输出标志可以与nyc命令一起使用来帮助我解决问题?

小智 0

我认为输出的差异是由于环境的差异造成的,例如工具版本或环境变量的差异。

尝试--all对 nyc report 命令进行标记以确保所有文件都包含在报告中,并--verbose进行标记以获取更详细的输出。还可以尝试使用不同的报告器来生成报告,或者尝试与合并命令分开运行报告命令以查看是否有任何作用。还可以检查生成报告的目录是否存在任何权限问题。