SonarQube 分析未显示代码覆盖率

2023-12-11

我有一个 Jenkins 项目来对我的 NodeJS 项目进行 SonarQube 分析。我添加了istanbul作为对我的项目的依赖package.json。在 Jenkins 构建配置中,首先我运行一个 shell 脚本:

cd ./project-name
npm install
node_modules/.bin/istanbul cover ./node_modules/.bin/_mocha path-to-unit-tests
node_modules/.bin/istanbul report cobertura
cd ..

这将安装依赖项、运行测试并生成代码覆盖率报告并生成 cobertura-coverage.xml 文件。

shell脚本之后,我运行Invoke Standalone SonarQube Analysis具有以下代码覆盖率属性:

sonar.java.coveragePlugin=cobertura
sonar.dynamicAnalysis=reuseReports
sonar.cobertura.reportPath=./project-name/coverage/cobertura-coverage.xml

Jenkins 作业通过 SonarQube 仪表板成功运行,该仪表板描述了项目的各种内容,例如代码行、技术债务、问题等。但单元测试的代码覆盖率不会显示在 SonarQube 仪表板上。我确保仪表板具有单元测试小部件。

Version of SonarQube server: 5.2
Version of JavaScript plguin used on SonarQube: 2.9
Version of Cobertura plugin used on SonarQube: 1.6.3
Version of Cobertura plugin used on Jenkins: 1.9.7
Version of NodeJS plugin used on Jenkins: 0.2.1

我验证工作区确实有cobertura-coverage.xml文件。还检查了构建控制台日志,没有发现错误。我之前也尝试过使用 LCOV 格式推送代码覆盖率:

sonar.dynamicAnalysis=reuseReports
sonar.javascript.lcov.reportPath=./project-name/coverage/lcov.info

即使覆盖率报告确实在 Jenkins 工作区中生成,该报告也不会发布到 SonarQube。我查看了工作区内容并进行了验证。控制台日志显示正在生成的覆盖率报告。也尝试过

sonar.dynamicAnalysis=reuseReports
sonar.javascript.lcov.reportPath=project-name/coverage/lcov.info

and

sonar.dynamicAnalysis=reuseReports
sonar.cobertura.reportPath=project-name/coverage/cobertura-coverage.xml

无济于事。我还分别重新启动了 Jenkins 和 SonarQube 服务器 2 次。在 StackOverflow 和其他地方查看了许多类似的问题,但没有找到任何有效的方法。

如果我添加构建后操作Publish Cobetura Coverage Report并指定 cobetura-coverage.xml 文件的路径Cobertura xml report pattern领域,代码覆盖率报告确实发布在 Jenkins 中。

查看 SonarQube 中的后台任务日志,发现异常。

java.lang.IllegalStateException: Cannot persist sources of project-key:project-name/node_modules/jscs/jscs-browser.js
at     org.sonar.server.computation.step.PersistFileSourcesStep$FileSourceVisitor.visitFile(PersistFileSourcesStep.java:132) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler.visitNode(DepthTraversalTypeAwareCrawler.java:72) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler.visit(DepthTraversalTypeAwareCrawler.java:44) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler.visitChildren(DepthTraversalTypeAwareCrawler.java:91) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler.visit(DepthTraversalTypeAwareCrawler.java:47) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler.visitChildren(DepthTraversalTypeAwareCrawler.java:91) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler.visit(DepthTraversalTypeAwareCrawler.java:47) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.step.PersistFileSourcesStep.execute(PersistFileSourcesStep.java:89) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.step.ComputationStepExecutor.execute(ComputationStepExecutor.java:39) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.taskprocessor.report.ReportTaskProcessor.process(ReportTaskProcessor.java:53) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.taskprocessor.CeWorkerRunnableImpl.executeTask(CeWorkerRunnableImpl.java:78) [sonar-server-5.2.jar:na]
at org.sonar.server.computation.taskprocessor.CeWorkerRunnableImpl.run(CeWorkerRunnableImpl.java:55) [sonar-server-5.2.jar:na]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_45-internal]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [na:1.8.0_45-internal]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_45-internal]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [na:1.8.0_45-internal]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_45-internal]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_45-internal]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45-internal]
Caused by: org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: com.mysql.jdbc.PacketTooBigException:     Packet for query is too large (7989143 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.
### The error may involve org.sonar.db.source.FileSourceMapper.insert-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO file_sources (project_uuid, file_uuid, created_at, updated_at, binary_data, line_hashes, data_hash,     src_hash, data_type, revision)     VALUES (?, ?, ?,     ?, ?, ?,     ?, ?,?,     ?)
### Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (7989143 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:26) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:154) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:141) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:51) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52) ~[mybatis-3.2.7.jar:3.2.7]
at com.sun.proxy.$Proxy84.insert(Unknown Source) ~[na:na]
at org.sonar.db.source.FileSourceDao.insert(FileSourceDao.java:117) ~[sonar-db-5.2.jar:na]
at org.sonar.server.computation.step.PersistFileSourcesStep$FileSourceVisitor.persistSource(PersistFileSourcesStep.java:160) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.step.PersistFileSourcesStep$FileSourceVisitor.visitFile(PersistFileSourcesStep.java:130) ~[sonar-server-5.2.jar:na]
... 18 common frames omitted
Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (7989143 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3540) ~[mysql-connector-java-5.1.35.jar:5.1.35]
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2417) ~[mysql-connector-java-5.1.35.jar:5.1.35]
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582) ~[mysql-connector-java-5.1.35.jar:5.1.35]
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2535) ~[mysql-connector-java-5.1.35.jar:5.1.35]
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1911) ~[mysql-connector-java-5.1.35.jar:5.1.35]
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1203) ~[mysql-connector-java-5.1.35.jar:5.1.35]
at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172) ~[commons-dbcp-1.4.jar:1.4]
at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172) ~[commons-dbcp-1.4.jar:1.4]
at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:44) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:69) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.executor.ReuseExecutor.doUpdate(ReuseExecutor.java:50) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:105) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:71) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:152) ~[mybatis-3.2.7.jar:3.2.7]
... 25 common frames omitted

所以现在我已经将 shell 脚本代码覆盖率生成行更新为

node_modules/.bin/istanbul cover -x node_modules ./node_modules/.bin/_mocha path-to-unit-tests

仍然遇到异常。基于max_allowed_pa​​cket,我没有MySQL,我需要提高MAX_ALLOWED_PACKET在数据库设置中。刚刚完成此操作并重新触发 Jenkins 作业以进行 SonarQube 分析。异常消失了。 SonarQube 中的后台任务成功。但我仍然没有在仪表板中看到单元测试代码覆盖率。没有其他例外。当我单击“配置小部件”按钮时,单元测试小部件上有“无数据”标签。当我返回仪表板时,单元测试小部件消失了。

知道我缺少什么吗?


第一次(大约一年前)当我开始探索“Sonarqube”并且在设置时一切正常。我能够看到所有指标以及“代码覆盖率".

因为使用的版本是: sonarqube-6.7.5,声纳扫描仪: 声纳扫描仪-3.2.0.1227-macosx

之后,当我今天尝试其他一些项目时,我花了大约 3 个小时来确定为什么代码覆盖率没有显示在 sonarqube 报告中,尽管一切都配置正确。

花了一些时间后,我发现了以下两个博客主题,这有助于我理解为什么我没有收到覆盖率报告。

如果我读得正确的话,那么似乎在“之后”出现了一个错误lcov“尽管配置准确,但无法识别报告路径。

参考链接:

无法获取 javascript 的代码覆盖率

修复:js-coverage-doesnt-work-anymore

使用版本:sonarqube:8.3.0 和 newtmitch/sonar-scanner 的 Docker 镜像作为声纳扫描仪。

以供参考,我的本地设置中的 Dockerfile 用于运行声纳扫描仪:

FROM newtmitch/sonar-scanner AS sonarqube_scan
COPY . /usr/src
RUN ls -list
RUN sonar-scanner \
    -Dsonar.host.url="http://localhost:9000" \
    -Dsonar.projectKey="test-node-app" \
    -Dsonar.projectVersion="1.0" \
    -Dsonar.sources="/usr/src" \
    -Dsonar.language="javascript" \
    -Dsonar.sourceEncoding="UTF-8" \
    -Dsonar.dynamicAnalysis="reuseReports" \
    -Dsonar.javascript.lcov.reportPaths="/usr/src/app/coverage/lcov.info"

我希望有人能提供帮助!

快乐学习!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SonarQube 分析未显示代码覆盖率 的相关文章

  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • Node.js:server.setTimeout、server.timeout 和 server.keepAliveTimeout 之间有什么区别

    官方文档是here https nodejs org api http html http server settimeout msecs callback server setTimeout 中没有提及有关服务下一个请求的信息 所以我认为
  • 错误:找不到模块“jasmine-core”

    我安装了以下内容进行测试 devDependencies jasmine core 2 4 1 karma 0 13 22 karma jasmine 0 3 7 karma phantomjs launcher 1 0 0 运行后karm
  • NodeJS CPU 一次飙升至 100%

    我有一个用 NodeJS 编写的 SOCKS5 代理服务器 我正在使用原生net and dgram打开 TCP 和 UDP 套接字的库 它可以正常工作大约 2 天 所有 CPU 的最大利用率约为 30 两天没有重新启动后 一个 CPU 峰
  • 为什么我的 Mongoose 3.8.7 架构 getter 和 setter 被忽略?

    在使用 Node js Mongoose 和 MongoDB 时 我发现当我执行 findOne 查询时 我的 Mongoose 模式 getter 和 setter 不会触发 我发现一个旧线程表明 2 x 版本中的 getter 和 se
  • 以异步方式执行 Express res.render

    我有一个 Nodejs 应用程序 其中res renderExpress 方法以阻塞方式花费大约 400 毫秒 我如何处理它以非阻塞方式执行 我的 apache 基准测试需要 12 秒来执行大约 30 个并发请求 我如何以更好的方式实施这一
  • Node.js:读取 URL 中传递的参数

    在 Rails 中 我向服务器发出 POST 请求 response Typhoeus Request post http url localtunnel com request from ola to ole result JSON pa
  • 让 gradle 执行 JUnit 测试(Android 应用程序、Android Studio)

    我目前正在开发一个 Android 应用程序 最近从 Eclipse 切换到 Android Studio 不是我的想法 不过 我想配置 jenkins 服务器来定期运行 JUnit 测试和其他测试 为了实现这一点 我尝试配置一个 grad
  • 使用无服务器访问 SSM 变量

    我想用无服务器变量中的 SSM 参数 https serverless com blog serverless v1 22 0 按照文档 我运行了以下命令 aws ssm put parameter name foo value bar t
  • 动态更改温斯顿的日志级别

    我尝试在运行时实现日志级别更改 我一直在关注https github com yannvr Winston dynamic loglevel blob master test https github com yannvr Winston
  • Node 不断恢复到旧版本

    每次我在控制台中重新启动 vagrant 时 它都会询问我的登录详细信息 然后说Now using node v7 10 0 npm v4 2 0 当我做run nvm install node I get v13 11 0 is alre
  • 如何使用自定义 JDK 构建 Jenkins 项目?

    我有一个常规的 Jenkins 实例 运行一些多分支管道 该实例在 JDK 11 上运行 因为 Jenkins 并不真正支持更高版本 没关系 但不好的是 我的所有管道似乎也都受到 Java 11 的限制 Jenkins 仅使用它自己也使用的
  • 使用 nw-gyp 构建 node-sqlite3

    我正在尝试为 node webkit 构建 sqlite3 The sqlite3 https www npmjs com package sqlite3 installing页面解释说它需要使用 nw gyp 来完成 据我了解 我应该下载
  • 将随机字节转换为整数范围 - 如何?

    我试图通过读取 crypto randomBytes 来获取一定范围内的随机整数 现在 我的问题是我不知道如何从该字节流中读取整数 我想生成一个范围只是 丢弃 不在范围内的整数的问题 有任何想法吗 您可以从以下位置获取一个 32 位整数cr
  • 简单 AJAX Get 请求“待处理”

    我正在尝试实现一个简单的 AJAX GET 请求 该请求告诉服务器删除数据库中的文档 虽然我从服务器得到文档已删除的确认 但 Chrome 检查器显示该请求处于 待处理 状态 最终导致服务器错误 我做错了什么 HTML div class
  • Node.js 中的 PHP exit()/die() 等价物是什么

    什么是 PHP die http www php net manual de function die php http www php net manual de function die php 在 Node js 中等效吗 https
  • 第一次使用node.js - “ReferenceError:节点未定义”

    我刚刚安装了node js 我尝试编写应该检查版本的node v 但它不起作用 这是输出 gt node v ReferenceError node is not defined at repl 1 2 at REPLServer self
  • 构建:找不到“节点”的类型定义文件

    VS 2015 社区版 在家 npm 3 10 Angular 2 我试图在 ASP Net MVC 5 应用程序中获取 Angular2 设置 我开始使用的模板使用旧版本的 Angular 因此我更新了包引用 当我构建时 列表中的第一个错
  • MongoDB中如何通过引用字段进行查询?

    我有两个 Mongo 模式 User id ObjectId name String country ObjectId Reference to schema Country Country id ObjectId name String
  • Node.js - 重载函数

    有没有一种方法可以重载node js中的函数 类似于 noSuchMethod https developer mozilla org en JavaScript Reference Global Objects Object noSuch

随机推荐

  • 警告:openssl_pkcs7_sign():使用 WAMP 获取私钥时出错

    我尝试使用 TCPDF 签署 PDF 但出现此错误 Warning openssl pkcs7 sign error getting private key in C wamp www tcpdf tcpdf php on line 759
  • 快速简单:trayicon 与 python?

    我只需要一个关于如何轻松地将 python 图标放在系统托盘上的快速示例 这意味着 我运行程序 没有显示窗口 只有一个托盘图标 我有一个 png 文件 显示在系统托盘中 当我右键单击它时 会出现一个带有一些选项的菜单 当我单击在一个选项上
  • SQL Server Compact 4 中两个 INNER JOINed 表的更新

    我正在尝试更新 sql server Compact Edition 4 0 中两个表之间的值 我的sql如下 UPDATE ei SET ei EstateID e EstateID FROM EstateImages ei INNER
  • 从 Github 克隆问题

    当我尝试从 git 克隆或拉取时 我收到了这个奇怪的错误消息 奇怪的是 我和一位同事以前对此没有任何问题 然后 我们让另外两名团队成员克隆了存储库 现在突然我和以前的同事继续收到这些错误 这两个新人在拉 推和克隆方面没有任何问题 突然两个原
  • EPL2 Zebra 打印机的图像 (PCX)

    我在生成图形并将其上传到 EPL2 打印机时遇到问题 在厌倦了任何可用的软件并在互联网上搜寻之后 我感到不知所措 我有一个 1 位文件 我尝试使用以下脚本上传它 设置ppi txt GK NAMEPCX GK NAMEPCX GM NAME
  • extJS:读取嵌套的 JSON

    我有一个来自 ldap search 调用的漂亮嵌套 JSON 我想使用这些信息来填充 ExtJS ComboBox 但我在读者方面遇到了一些麻烦 显然 我无法在组合框中读取我需要的信息 即人员的邮件地址 uid 和 cn 我认为整个问题都
  • Tensorflow 中的 Triplet、Siamese 和 Softmax

    我想比较以下类型的 CNN 对于两个不同的大型图像数据集的性能 目标是测量两个图像之间的相似度 这两个图像在训练期间都没有见过 我可以使用 2 个 GPU 和 16 个 CPU 核心 Triplet CNN 输入 三张图像 标签 编码到位
  • 如何使用 JavaScript 获取本地 IP 地址? [复制]

    这个问题在这里已经有答案了 我想获取客户端系统的本地IP地址 我如何使用 JavaScript 来实现这一点 我认为如果没有一些服务器交互就无法做到这一点 最简单的方法是向服务器端片段发出 AJAX 请求 在 PHP 中 该片段如下所示
  • 将参数传递给上传器/从上传器内部访问模型的属性/让用户选择缩略图大小

    我想将图像裁剪为用户从列表中选择的尺寸 例如 100x100px 200x200px 我如何将该属性传递给上传者或从上传者中获取模型的属性 从上传器内部访问模型的属性如下不起作用 version thumb do thumbnail siz
  • AccessDeniedHandler 重定向到登录页面

    当 在 Spring Security MVC 中 对页面的访问被拒绝时 由于用户没有足够的权限 尽管他已通过身份验证 我需要通过显示登录页面 而不是标准行为 提供以另一个用户身份登录显示 403 访问被拒绝页面 我可以写一个AccessD
  • 如何将 f-string 与变量一起使用,而不是与字符串文字一起使用?

    我想将 f string 与我的字符串变量一起使用 而不是与用字符串文字定义的字符串一起使用 这是我的代码 name deep mahesh nirbhay user input r certi element this string I
  • 从 LAN 上的任何计算机访问 Apache VirtualHost?

    我有 wamp 设置 其中有很多网站设置为 httpd conf 中的虚拟主机
  • MKCircle 没有更新半径,但它正在平移

    我必须将 MKCicle 绘制到 MKMapView 中 然后 当用户通过滑块更改半径时 我必须重新绘制它 我删除它并重新创建它 将其重新添加到地图中 但我并没有按照我的预期进行操作 而是看到 MKCircle 在地图上平移 并保持相同的大
  • 如何使用 pygit2 进行 git 合并

    我尝试将分支合并到主分支中 repo pygit2 Repository path to repo branch repo lookup branch upstream branch pygit2 GIT BRANCH REMOTE oid
  • 如何使用 JSoup 通过表单提交文本

    我想使用 JSoup 向此表单提交一些文本 我该怎么做呢
  • VBA 跟踪文件使用情况

    我目前有一个生成客户报表的 Excel 文件 我需要跟踪谁运行了他们的报表 目前 每当生成语句时 我都会有一个宏向我发送一封包含其用户名的电子邮件 然而 在瘦客户端系统上运行的人们会收到提示 一个程序正在尝试代表您发送电子邮件 有什么方法可
  • 将响应转发到不同的 URL 时,在 API 管理策略表达式中将响应正文从 XML 转换为 Json

    将响应转发到不同的 URL 时 如何将响应正文从 XML 更改为 Json 我专门将响应转发到 Azure 服务总线 我尝试了许多不同的方法将 XML 序列化为 json 但没有成功 因为策略表达式中不允许使用某些 JsonConvert
  • 在本地化系统上强制以英语输出 PowerShell 错误

    我需要在各种操作系统上运行一些 PowerShell 脚本 其中大多数都是英文版本 但是 有些是本地化的 例如德语 法语 西班牙语等 问题是本地系统管理员现在大多不使用 PowerShell 并且在脚本失败并向他们抛出错误的情况下 而不是阅
  • Conda Build - 创建 Conda 包因平台 win-64 的依赖项而失败

    从本地目录构建我的第一个 conda 包 遵循 CONDA 网站的说明 https conda io docs user guide tasks build packages recipe html 我收到以下错误 conda build
  • SonarQube 分析未显示代码覆盖率

    我有一个 Jenkins 项目来对我的 NodeJS 项目进行 SonarQube 分析 我添加了istanbul作为对我的项目的依赖package json 在 Jenkins 构建配置中 首先我运行一个 shell 脚本 cd proj