Angular学习笔记73:解决lcov.info中文件路径不对从而导致没有覆盖率的问题

本文介绍了在Angular项目中遇到lcov.info文件路径问题导致Sonar无法获取覆盖率的情况,提出了两种解决方案:一是手动修改lcov.info中的路径为Jenkins工作目录;二是通过在Jenkins工作空间内执行测试生成正确的覆盖率文件。同时,文章还提到了在Jenkins中使用ChromeHeadless和相关插件进行无头浏览器配置的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决没有覆盖率的问题

在sonar-scanner 中的覆盖率可以通过属性来指定 typescript 覆盖率的文件目录

sonar.typescript.lcov.reportPaths

在Angular项目中,可以通过:

ng test --code-coverage --watch=false

来生成 lcov.info 文件,sonar 通过读取这个文件来获取当前项目的覆盖率

在之前由于本人的愚蠢,在本地环境中,获取了 Angular 项目的覆盖率,然后将项目挂载到Jenkins的工作目录中,但是由于 lcov.info 中的文件目录不正确,导致sonar一直获取不到覆盖率。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HGJBqS4J-1571728421751)(evernotecid://621D2FF6-4E72-4E02-9043-55F31F42819B/appyinxiangcom/22553815/ENResource/p226)]

这里的路径在Jenkins中找不到,所以一直拿不到覆盖率。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wBs6SXXx-1571728421753)(evernotecid://621D2FF6-4E72-4E02-9043-55F31F42819B/appyinxiangcom/22553815/ENResource/p227)]

解决办法

方法一:在知道Jenkins 目录的情况下,将这里的路径更改为Jenkins的工作目录

当前 Jenkins 的目录为:/data/jenkins/workspace/demo,遂修改如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aXS2s9GW-1571728421754)(evernotecid://621D2FF6-4E72-4E02-9043-55F31F42819B/appyinxiangcom/22553815/ENResource/p229)]

此时在重新构建的就有覆盖率了。

在这里插入图片描述

但是这个方法仅限于零时解决一下,不能用于持续化构建获取sonar 扫描结果

方法二:在Jenkins 工作空间中触发测试从而生成正确目录的覆盖率文件

  1. 修改 Jenkins 的 pipeline script
import groovy.json.JsonSlurperClassic

node {
   def appName="demo"; def appVersionCode="13";
   sh "sleep 1"
  def appCodeSonarDirs = "/data/jenkins/workspace/demo";
  def coverSrc = "/data/jenkins/workspace/demo/coverage/lcov.info";
  def loginUser="admin";
  def loginpPassword="admin";
  def projectBaseDir="/data/jenkins/workspace/demo"
        stage('Review') {
           echo "-----New Stage Start-----TemplateStageId[2]------"
           echo "Stage[Review] Start!"
           def result = 0;
           try {
            echo "Stage[Review] start!"
                def inventoryUrl = "http://60.205.214.32:9000"
                def sonarqubeScannerHome = tool name: 'Bundled', type: 'hudson.plugins.sonar.SonarRunnerInstallation'
                withCredentials([usernamePassword(credentialsId: 'Sonar_DevOps_Default', usernameVariable: 'username', passwordVariable: 'password')]) {
                    sh "npm run test:codeCoverage && ${sonarqubeScannerHome}/bin/sonar-scanner -X -Dsonar.projectBaseDir=${projectBaseDir} -Dsonar.host.url=${inventoryUrl} -Dsonar.login=${loginUser} -Dsonar.password=${loginpPassword} -Dsonar.projectName=${appName} -Dsonar.projectVersion=${appVersionCode} -Dsonar.projectKey=${appName} -Dsonar.sources=${appCodeSonarDirs} -Dsonar.typescript.lcov.reportPaths=${coverSrc}"
                    }
              result = 2
           } catch (e) {
              result = -1
              echo "-----Stage End-----TemplateStageId[-9]-DurationTime[0]-Result[-1]------"
              throw e
           } finally {
              echo "Stage[Review] End!"
           }
        }
}

此时会先执行npm run test:codeCoverage生成覆盖率文件目录

这里在package.json 的 script 中配置了test:codeCoverage命令,因为angular/cli 没有全局安装,所以在这里直接执行 ng 命令时会报错,通过执行 npm run test:codeCoverage 来调用的是当前node_modules 安装的angular/cli 。

但是此时又会出现一个问题,就是在jenkins中没有安装chrome , 在拉起chrome会报错。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PEAB0O1w-1571728421754)(evernotecid://621D2FF6-4E72-4E02-9043-55F31F42819B/appyinxiangcom/22553815/ENResource/p230)]

  1. 使用 ChromeHeadless

安装插件 puppeteer & karma-chrome-launcher

执行命令:

npm i -D puppeteer karma-chrome-launcher
  1. 修改 karma 的配置文件

修改项目目录下的 karma.conf.js

process.env.CHROME_BIN = require('puppeteer').executablePath();
module.exports = function (config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine', '@angular-devkit/build-angular'],
    plugins: [
      require('karma-jasmine'),
      require('karma-chrome-launcher'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage-istanbul-reporter'),
      require('@angular-devkit/build-angular/plugins/karma')
    ],
    client: {
      clearContext: false
    },
    coverageIstanbulReporter: {
      dir: require('path').join(__dirname, 'coverage'), reports: ['html', 'lcovonly'],
      fixWebpackSourcePaths: true,
    },
    reporters: ['progress', 'kjhtml'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['ChromeHeadlessCI'],
    singleRun: false,
    customLaunchers: {
      ChromeHeadlessCI: {
        base: 'ChromeHeadless',
        flags: ['--no-sandbox']
      }
    },
  });
};

然后在 Jenkins 中重新执行就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wujiayucn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值