SonarQube覆盖率报告怎么导入SonarQube覆盖率数据显示为空怎么办,很多团队在把代码质量平台搭起来以后,都会撞上这个问题。SonarQube这个工具自己是不会去生成覆盖率报告的,那串数据得先让JaCoCo、LCOV、coverage.py、dotnet-coverage或者gcov这类外部的测试覆盖率工具给跑出来,然后扫描器在分析的那一步,再把它们读到SonarQube里头,最后才在页面上亮出来。说白了,SonarQube干的活儿是接住这些数据然后展示出来,它可不替你跑测试,也不替你往外头吐覆盖率文件。
一、SonarQube覆盖率报告怎么导入
在往SonarQube里倒覆盖率之前,有几样东西得先掂量清楚:项目是拿什么语言写的、测试用上了哪一套家伙、最后生出来的报告又是个什么样式。语言不同,它对应的覆盖率参数本来就有差别,比如Java这边常使的是JaCoCo吐出来的XML,JavaScript和TypeScript多半挨着LCOV走,Python那头多是让coverage.py去生成XML模样的报告,至于C和C++的项目,那就得把对口的覆盖率工具和扫描的配置揉到一块儿来弄了。千万别以为只要把那捆报告文件朝项目目录里一丢就算完事,SonarQube可不会自动去猜你那些报告都藏在哪些路径底下。
1、先生成覆盖率的报告
在CI的流水线里头,得先迈出一步,去把单元测试或者集成测试跑起来,再叫那个管覆盖率的工具把报告文件给吐出来。好比Java项目,先让测试跑一遭,顺手就把JaCoCo的XML给生出来;前端那边呢,先把lcov.info给倒腾出来;到了Python这儿,就是先让coverage.xml那份报告落停。到了这一步,一定得亲眼去确认一下那个文件是当真躺在那里了,不能光看见测试任务绿了,就觉得报告也跟着完事了。
2、接着把报告路径给配好
在【sonar-project.properties】那个要紧的文件里,要不就在CI敲出去的扫描命令中间,把跟语言对得上号的覆盖率报告路径给填上去,也就是把报告文件蹲着的那个地方,原原本本地告诉SonarScanner。
这路径你用相对的也行,用绝对的也成,但有一条必须守住,就是得拿扫描执行时候的那个目录当尺子,把它核得死死的。好些倒腾了半天也灌不进去的毛病,并不是报告自个儿的格式生错了,倒是扫描器蹬蹬蹬跑起来的那阵子,左摸右摸,横竖就是找不着那个文件。
3、还得把执行的前后次序给捋顺
那个专管覆盖率的工具,非得抢在SonarScanner伸着脖子去扒拉分析之前,就把报告给囫囵个儿地生出来、摆在那里。SonarQube的文档也一板一眼地敲过黑板:覆盖率的工具得先在搭好的流水线里把腿脚抡开了,然后才轮到扫描器去把那结结实实的果儿给搂进去。要是这个先后趟子给跑反了,等SonarScanner急急慌慌去跑分析的时候,那报告还原样没个影儿呢,到了页面上它当然就给你空荡荡地晾着,什么也显不出来。
二、SonarQube覆盖率数据显示为空怎么办
一瞅见覆盖率那块地方光秃秃的空着,什么数也显不出来,先别扭头就去怪SonarQube的页面是不是卡了壳。更常撞上的由头,是报告它自己压根儿就没生成出来、路径给填劈了腿、格式没对上榫头、源码的路径在两边是两副面孔,再不就是扫描那会儿,把那些本该拢进来统计的文件给一搂子划拉到了外头。动手排查的时候,得把眼珠子先钉在CI吐出来的那堆日志,还有报告文件自个儿的身上,从这些地方一丁一点地往下捋。
1、去翻翻扫描时撂下的那套日志
先把【Scanner日志】拽到跟前,拿眼去搜刮coverage、report、import、not found,还有cannot resolve file这些个顶顶吃劲的词儿。
这堆日志里头,照常理是会跟你叨咕几句的,它会讲那报告到底是被寻见了还是没寻见,是不是顺顺当当地给解开嚼巴了,再不就是哪些文件它说死说活就是跟项目的源码对不上卯。要是你在这日志里头从头翻到尾,连半句跟覆盖率报告沾边的影儿都扒拉不着,那十停里头得有九停,是你塞进去的那几道参量压着根儿就没显出神通来。
2、再去瞅瞅报告窝着的路径和干活的那个目录
在CI上常能碰上一档子糟心事:在自家的机子上颠颠地往里导,啥毛病也没有,可一撂到流水线上,那地界就给你空得能跑马。这背后捣鬼的由头,多半是干活的目录它变了脸,报告呢,倒是老老实实地在target、build、coverage这些个旮旯底下蹲着,可你敲扫描命令的那个当口,脚底下踩着的目录却压根儿不是那么一回事。是可以在流水线里头,多塞进去一道能瞧见目录里动静的命令,去扫听扫听,赶在扫描动手以前,那份要命的报告文件它是不是已然好端端地戳在那儿了。
3、得对一对源码的路径它能不能贴得上
覆盖率报告里头记着的那一串串文件路径,它得能跟SonarQube踅摸着去扫描的那套源码脸对脸地贴上卯才成。要是报告里头躺着的,是容器腔子里的那套路数、直不愣登的绝对路径,再不就是SourceLink那一套花里胡哨的地址,可扫描器那边瞧见的,偏偏是另外一套认路的章法,这就很可能会闹出这么一档子事:报告明明是被它给搂过去了,可临了那覆盖率却愣是没给映射到那些源码文件的身子上头去。碰着.NET这一路的景况,那些文档也提溜过一嗓子,说是有那么一些覆盖率的输出,它使的没准是SourceLink那套URI,得把它给扳成系统自个儿认的路子,才更容易被顺顺当当地识别出来。
三、覆盖率导入后怎么保证结果稳定
覆盖率那串数字能利利索索地显在页面上,充其量也就是头一脚踹出去了,再往后,还得花心思去护着,叫每一趟CI碾过去的结果都能四平八稳地待在那里。要是不去管它,今儿个覆盖率还亮汪汪地挂在那儿,明儿个一扭脸又秃成一片白,那这拿质量去卡门的禁子,可就很难让人信得瓷实了。项目这头,是该把报告是咋生出来的、路径是照着什么去指的、分支那头是拿什么谋略去划拉的,再搭上那些被丢在外头不扫的条条框框,全给死死地钉在那一处不放。
1、把使唤的工具版本和报告格式给固定死
团队这头,顶好是把管覆盖率的工具是哪个版本、最后往外吐的到底是套啥格式、还有出来以后夯在哪个目录底下,都给齐刷刷地拢成一股绳。就拿Java这一摊来说,大伙儿就认准了全使JaCoCo那套XML;前端那些活计呢,就齐着步子往外倒LCOV那一款;等到了Python那垄地,就一水儿都往外盘coverage.xml这么个式样。这报告的格式越是往一处凑,CI那边搭起来的那套把式,往后想再去拾掇它、盘它,也就跟着越是轻省不少。
2、去咂摸咂摸那些排除规则
如果项目这头已经端端地设下了sonar.exclusions、sonar.coverage.exclusions这么几道挡头,再不就是把那圈定测试目录的规矩给码上了,那到了这会子,就得去挨个儿地咂摸咂摸,可别在里头把那些原本就该拢进来算一算覆盖率分量的源码,给一竿子错划到外头去了。只要这文件它一旦被划拉出去,哪怕那报告里头明晃晃地揣着归它的那份覆盖率数,到了页面上,你也照样是瞧不见心里头惦记的那副光景。
3、在挂上门禁以前,先把眼下这条基线给踩稳当了
要是覆盖率这玩意儿是刚接进来的,那就不太主张一上来就给它立下一道高得吓人的死卡子。可以先由着它,叫它在CI的趟子上颠颠地跑上那么几个来回,拿眼盯严实了报告是不是每回都安安稳稳地导进去了,等这口气儿喘匀了,再回身去一丁一点地给那新代码的覆盖率往起拔拔高,也省得因为那些配置上头一摇三晃的波荡,闹得回回都把那构建的活儿给捅得咣当响。
总结
总的来看,SonarQube覆盖率报告怎么导入,还有覆盖率数据显示为空时该怎么去办,根上的事情就是先由外头那些工具把覆盖率生出来,再叫SonarScanner顺着你塞给它的那条路径给导进去。导入的时候得查一查报告是不是真生成了、路径有没有指对、格式能不能合上,还有扫描的先后次序有没有错。一旦碰上空数据,就把眼珠子先钉在Scanner日志、CI里那个干活用的目录,还有源码跟报告能不能路径相合的这几处上去。只要这些个关节齐齐整整地对上了,SonarQube里的覆盖率数据,也就该稳稳当当地亮出来了。