SonarQube 搭建代码质量管理平台(一)

SonarQube 是一个开源的代码分析平台,用来持续分析和评测代码的质量,支持检测 Java、JavaScript、C#、C、C++ 等二十几种编程语言。通过 SonarQube 可以检测出项目中潜在的Bug、漏洞、代码规范、重复代码、缺乏单元测试的代码等问题,并提供了 UI 界面进行查看和管理。

架构

Architecture

SonarQube 由4部分构成:

  • SonarQube Server

SonarQube Server 会启动3个主要进程:
Web Server:UI 管理界面
Search Server:基于 Elasticsearch 的搜索服务
Compute Engine Server:计算引擎服务,进行代码分析并保存到SonarQube Database

  • SonarQube Database

存储 SonarQube 实例的配置信息,项目、视图等的快照信息

  • SonarQube Scanners

分析项目代码,可在构建/持续集成服务器上运行一个或多个

  • SonarQube Plugins

SonarQube 插件管理

集成

Integration

以上是官方提供的流程图,官方提供了支持不同 IDE 的 SonarLint 插件 ,插件会在编码过程中对代码进行分析,从而促使在开发阶段就能提高代码的质量。理论上我们应该遵循分析结果,乖乖的优化代码,但如果开发人员不按套路,不进行优化或不安装 SonarLint,非要把代码提交到 SCM(如: git, SVN, TFVC),一种方式可以在合并管道中加入代码检测环节,有问题直接拦截,提交失败,不过这有点过于粗暴了,很多情况下确实没这个必要;另一种方式是允许代码暂时提交到代码库,进入代码库后再次进行分析,有问题再回头优化(代码库是必经之路,逃也逃不掉)。

对代码库中的代码进行分析之前,我们需要搭建持续集成工具(如:Jenkins),并在工具中集成 SonarQube Scanners,根据持续集成工具设置的条件会自动触发拉取和 Build 代码,然后经过 SonarQube Scanners 分析并将分析报告发送到 SonarQube Server,SonarQube Server 对分析报告进行处理并保存到 SonarQube Database,同时可将分析报告发送给相关负责人进行 Review ,最终我们可以通过 UI 界面进行查看分析结果,开发人员对有问题的代码再次进行优化,如此循环。

环境要求

主要是两个要求,具体可参考 Prerequisite

  1. JDK 8
  2. MySQL (>=5.6 && <8.0) (也支持其他数据)

安装 SonarQube Server

  1. 下载 SonarQube,一般情况使用社区版,其他版本可以试用,但最终需要 money

  2. 解压后,在 bin 文件夹中选择匹配的操作系统启动 SonarQube server

    # On Windows, execute:
    .\bin\windows-x86-xx\StartSonar.bat
     
    # On other operating system, execute:
    bin/[OS]/sonar.sh console
    
    StartSonar

    从启动日志中可以看出 SonarQube server 依赖于 Elasticsearch,但并不需要单独下载,SonarQube 的下载包内已包含,如果想复用之前安装过的 Elasticsearch,请根据需要调整配置文件 conf/sonar.properties 中 Elasticsearch 部分。

  3. 启动成功后访问: http://localhost:9000 ,默认登录账号/密码:admin/admin

SonarQube UI

配置 SonarQube Database

安装后 MySQL 后,创建数据库 sonar,修改 SonarQube 配置文件 /conf/sonar.properties MySQL相关部分,重启后 sonar 数据库中会创建部分相关的表。

#----- MySQL >=5.6 && <8.0
# Support of MySQL is dropped in Data Center Editions and deprecated in all other editions
# Only InnoDB storage engine is supported (not myISAM).
# Only the bundled driver is supported. It can not be changed.
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.jdbc.username=root
sonar.jdbc.password=
sonar.sorceEncoding=UTF-8

安装 SonarQube Scanners

选择对应的操作系统版本 下载 SonarQube Scanners,下载后可将 bin 目录路径加入 Path 中,之后直接通过 sonar-scanner 全局命令执行代码分析。

对 JavaScript 项目进行代码分析

下载 JavaScript 项目代码 ,在项目根目录下创建 sonar-project.properties:

javascript project

在 sonar-project.properties 添加配置如下:

# Sonar项目标识,在 SonarQube实例下必须唯一
sonar.projectKey=test

# 在 SonarQube UI 中显示的项目名称
sonar.projectName=ApiDoc

# 项目版本
sonar.projectVersion=1.0
 
# 项目代码与 sonar-project.properties 文件的相对路径
sonar.sources=.
 
# 代码文件的编码
sonar.sourceEncoding=UTF-8

# 排除不参与代码分析的文件或目录
sonar.exclusions=node_modules/**/*,.idea/**/*

在项目根目录下执行命令:

sonar-scanner
Analyzed

执行成功后,再次访问: http://localhost:9000 ,出现一个 ApiDoc 项目的分析概要,并提示有一个不规范问题,测试覆盖率 0。

注意:日志中的 ”Analysis report compressed in 205ms, zip size=518 KB“说明了压缩后的分析报告大小,最终这部分数据会存储到 MySQL,MySQL 默认接受的最大数据包为 4M,如果压缩包过大,这里的提交就会失败,这时候需要修改 MySQL 的 max_allowed_packet 的值。

ApiDoc Result
Code Smell

修复掉不规范问题后重新执行命令 sonar-scanner ,结果如下:

ApiDoc Result2

同时在 MySQL 的 sonar 数据库中又会自动创建相关的表,并对分析结果进行存储。

Tables

以上通过对本地目录下的一个 JavaScript 项目进行分析测试,实际情况应该是基于 SCM ,并配合持续集成工具进行自动化代码分析,下篇介绍。

参考链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容