自动化工具 SonarQube 的安装与使用

xinxi · December 04, 2018 · Last by Zealing replied at August 16, 2019 · 11246 hits
本帖已被设为精华帖!

简介

SonarQube(原名Sonar)是一个开源的代码质量管理系统,可以扫描项目中重复代码、编码标准、单元测试、代码覆盖率、代码复杂度、潜在Bug、注释等.

支持Java、C/C++、C#、PHP、Flex、Groovy、JavaScript、Python等多种语言.

代码扫码的好处在于通过配置规则扫描代码设计缺陷和代码优化从而提高代码的质量.

本文介绍使用docker技术搭建SonarQube环境并扫描代码.

环境搭建

快速启动

这种方式启动sonarqube是没有数据存储的,docker重新加载后数据不会reload数据.

docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 sonarqube:lts

浏览器打开:0.0.0.0:9000
帐号密码:adminadmin

全配置启动

docker启动mysql

使用mysql作为数据存储,通过如下命令启动:

docker run --name mysql-5.6 -v /Users/xinxi/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123321 
-p 8888:3306 -d mysql:5.6

sonarqube不支持mysql5.5版本,最低支持5.6版本

image

docker启动sonarqube

需要注意两点:

  • db_sonar数据库需要手动先创建,否则会报找不到
  • 本地搭建ip地址不能写localhost,需要写内网ip

启动命令如下:

docker run -d --name Sonarqube -p 8185:9000 -p 8186:9092 
-e "SONARQUBE_JDBC_USERNAME=root"
-e "SONARQUBE_JDBC_PASSWORD=123321"
-e "SONARQUBE_JDBC_URL=jdbc:mysql://192.168.129.25:8888/
db_sonar?useUnicode=true&characterEncoding=utf8"

-d sonarqube:lts

效果

启动成功以后,第一次页登录成功后会设置token,这个token是以后被扫描代码工程中需要配置的,用于通过token的方式连接Sonarqube平台传数据结果

image

Android项目配置

image

Android项目是使用gradle管理插件,所以需要配置gradle文件.

在项目根目录的gradle配置如下:

buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.5"
}
}

plugins {
# 添加插件信息
id "org.sonarqube" version "2.6-rc1"
}

apply plugin: "org.sonarqube"

执行命令:

gradle sonarqube \
-Dsonar.host.url=http://localhost:8186 \
-Dsonar.login=a1cf2c8dbdc187441c3f908b79b562404b9a4f6b

另外配置方式是在gradle.properties配置文件

image

上传结果成功

image

扫描结果

image

image

mvn项目配置

运行命令

mvn sonar:sonar   -Dsonar.host.url=http://localhost:9000   -Dsonar.login=c8ce928f1497f1fa5591cdcf5357aa4e44920796

扫描结果

1.png

iOS项目配置

安装

先需要安装如下工具

brew tap oclint/formulae
brew install oclint
brew install sonar-scanner
brew install gcovr

项目配置

需要在项目根目录增加run-sonar.sh和sonar-project.properties两个文件

具体配置请参考Demo代码

image

运行命令

在项目根目录下,sh run-sonar.sh

踩坑

提示没有oc插件

需要oc插件.png

通过sonarqube安装的oc插件是收费的,下载免费的oc插件.

https://github.com/Backelite/sonar-objective-c

然后把backelite-sonar-objective-c-plugin-0.6.3.jar放到sonarqube的extensions/plugins中,然后重启镜像.

效果展示

走通扫描.jpg

oc扫描结果.png

制作镜像

sonarqube原生不支持中文、并且没有oc插件.可以把汉化中文包和oc插件打包成新的docker镜像

把sonar-l10n-zh-plugin-1.16.jar、backelite-sonar-objective-c-plugin-0.6.3.jar和dockerfile放到一个目录下

dockerfile如下:

dockfile:
FROM sonarqube
ADD sonar-l10n-zh-plugin-1.16.jar /opt/sonarqube/extensions/plugins/
ADD backelite-sonar-objective-c-plugin-0.6.3.jar /opt/sonarqube/extensions/plugins/

执行:docker build -t sonarqube:zh .

jenkins持续集成

使用Android项目为例,首先需要在Jenkins中安装sonarqube插件,然后在系统设置中配置SonarQube的servers地址

image

新建job并配置git地址

image

在构建处选择Execute SonarQube Scanner中配置如下

image

提示需要java插件

image

在SonarQube中安装java插件并且重启

image

扫描代码完成并且上传扫码结果

image

SonarQube查看扫描结果

image

结语

SonarQube是一款优秀代码扫描工具,可以通过静态扫码代码的方式发现编码问题,代码扫描是一种低成本高收益的方式,在持续集成中是必不可少的环节.

学习帖

SonarQube的安装与使用

https://blog.imyxiao.com/docker/sonarqube.html

SonarQube 中文插件安装

https://www.jianshu.com/p/6cc4632628b1

使用Jenkins进行Android自动打包及SonarQube代码自动检测

http://blog.51cto.com/536410/2052972

oclint官方

http://oclint.org

IOS-Sonar代码质量监控

https://blog.csdn.net/helloworld_junyang/article/details/53836001

基于Sonar的iOS代码质量检测系统

https://blog.csdn.net/hualusiyu/article/details/79349025

iOS Sonar集成流程详解

https://www.jianshu.com/p/74bee59fef1c

Docker构建SonarQube检测代码质量平台

https://blog.csdn.net/OneZhous/article/details/80527953

SonarQube + Jenkins Pipeline配置

https://blog.csdn.net/liuxinghao/article/details/77967158

共收到 15 条回复 时间 点赞

请问 backelite-sonar-objective-c-plugin-0.6.3.jar 在哪下载?~ 在链接里找不到

Smile 回复

下载仓库代码,自己mvn 命令打包

安涛 定向班第一期_shell 课程实战_20181216 中提及了此贴 21 Dec 16:29
KevinWang 定向班第一期_shell 课程实战_20181216 中提及了此贴 20 Dec 16:42
FishKylin 定向班第一期_shell 课程实战_20181216 中提及了此贴 18 Dec 11:08
xinxi 回复

一开始我用的是最laster版的,看了容器的log只有警告,然后我换了个6.7版的sonarqube镜像可以了。😂

8Floor has been deleted
ivy520 定向班第一期_shell 课程实战_20181216 中提及了此贴 16 Dec 23:53
ivy520 [Topic was deleted] 中提及了此贴 16 Dec 22:55
simple 专栏文章:[精华帖] 社区历年精华帖分类归总 中提及了此贴 13 Dec 14:44
xinxi 回复

我们内部试了下,iOS 的开发同学反馈基本都没啥价值,而且还容易误报,所以后面没在 iOS 用了。

最近写的文章质量都不错,继续加油哦!

xinxi #16 · December 08, 2018 作者
陈恒捷 回复

价值是大,但是就看开发改不改了..

写得很齐全,加精鼓励下

另外,想问下 iOS 的规则开发同学反馈如何,发现的问题价值大吗?

陈恒捷 将本帖设为了精华贴 07 Dec 23:40
xinxi #19 · December 07, 2018 作者
豆豆 回复

-d是在后台启动的意思,需要用docker logs 容器id看下具体原因.

请问我用你的命令,启动的sonar容器很快就stop了,是命令的问题吗?启动MySQL容器就不会stop 都已经加了-d参数了

docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 sonarqube:lts
xinxi 回复

没找到,需要自己手动打包吧。。。小白。。

run的时候 建议加个bash路径吧

我从https://github.com/Backelite/sonar-objective-c 下载了源码,用maven(mvn package)编译打包backelite-sonar-objective-c-plugin-0.6.3.jar,放到extensions/plugin目录下,但是启动的时候sonarqube报错,加载oc插件不成功,我的sonarqube版本是7.4,机器硬件是“Darwin secneodeMac-mini-5.local 17.7.0 Darwin Kernel Version 17.7.0: Thu Jun 21 22:53:14 PDT 2018; root:xnu-4570.71.2~1/RELEASE_X86_64 x86_64” ,请问这是因为什么原因?

2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin Git / 1.6.0.1349 / 5324aafc7d16337ca792fec35903d0d313c9e2c7
2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin JaCoCo / 1.0.1.143 / 65c55e41e32c114704fd597ccea91fc55becb4ec
2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin LDAP / 2.2.0.608 / 79dc3fa4393a29667673c70182f3016288b548b7
2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin ObjectiveC (Backelite) / 0.6.3
2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin SonarC# / 7.7.0.7192 / c46d44cdae6e75538626f380fe3fa7553e6cf93d
2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin SonarCSS / 1.0.2.611 / 8db5e31b2e21ff683da69668ec577c7a026acf23
2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin SonarFlex / 2.4.0.1222 / 68d9cb3b7daccbc4869c4f2b89d09218d26a0829
2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin SonarGo / 1.1.0.1612 / 1809c7be6d88396c0a1b8d597b1e9e0ed8d29730
2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin SonarJS / 5.0.0.6962 / ac2fe7567f3dfeb3295e2e710afd8c06b7760e9d
2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin SonarJava / 5.8.0.15699 / 34186ed1499e6166d3ef8670086d05ab6f12f6f9
2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin SonarKotlin / 1.2.1.2009 / 3dd3ade901a10bc88a7158c014eba9f5a568951c
2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin SonarPHP / 2.14.0.3569 / 59a202b8d1c5276ce32da2a0bc63c94cae4cdeb2
2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin SonarPython / 1.10.0.2131 / a00e0ddc83bbeb01a9ee7475fab9eafe3f4096ac
2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin SonarRuby / 1.2.1.2009 / 3dd3ade901a10bc88a7158c014eba9f5a568951c
2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin SonarTS / 1.8.0.3332 / af8e41ab1a72ba3cc28b0e3e9e065a0ccb47d31d
2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin SonarVB / 7.7.0.7192 / c46d44cdae6e75538626f380fe3fa7553e6cf93d
2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin SonarXML / 1.5.1.1452 / eadc1dcd0e24a3c77068e3c1d41af0327d6b16ea
2019.08.15 10:49:38 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin Svn / 1.9.0.1295 / 942e075773975354e32691a60bfd968065703e04
2019.08.15 10:49:39 INFO web[][o.s.s.p.w.MasterServletFilter] Initializing servlet filter org.sonar.server.ws.WebServiceFilter@19fa25c2 [pattern=UrlPattern{inclusions=[/api/system/migrate_db., ...], exclusions=[/api/properties, ...]}]
2019.08.15 10:49:39 INFO web[][o.s.s.a.EmbeddedTomcat] HTTP connector enabled on port 9000
2019.08.15 10:49:40 WARN web[][o.s.c.p.ComponentKeys] Bad component key: org.sonar.java.externalreport.ExternalRulesDefinition@13a84755. Please implement toString() method on class org.sonar.java.externalreport.ExternalRulesDefinition
2019.08.15 10:49:40 WARN web[][o.s.c.p.ComponentKeys] Bad component key: org.sonar.java.externalreport.ExternalRulesDefinition@2054717d. Please implement toString() method on class org.sonar.java.externalreport.ExternalRulesDefinition
2019.08.15 10:49:40 WARN web[][o.s.c.p.ComponentKeys] Bad component key: org.sonar.java.externalreport.ExternalRulesDefinition@6103baea. Please implement toString() method on class org.sonar.java.externalreport.ExternalRulesDefinition
2019.08.15 10:49:40 ERROR web[][o.s.s.p.Platform] Background initialization failed. Stopping SonarQube
java.lang.IllegalStateException: Fail to load plugin ObjectiveC (Backelite) [backelitesonarobjectivecplugin]
at org.sonar.server.plugins.ServerExtensionInstaller.installExtensions(ServerExtensionInstaller.java:82)
at org.sonar.server.platform.platformlevel.PlatformLevel4.start(PlatformLevel4.java:586)
at org.sonar.server.platform.Platform.start(Platform.java:211)
at org.sonar.server.platform.Platform.startLevel34Containers(Platform.java:185)
at org.sonar.server.platform.Platform.access$500(Platform.java:46)
at org.sonar.server.platform.Platform$1.lambda$doRun$0(Platform.java:119)
at org.sonar.server.platform.Platform$AutoStarterRunnable.runIfNotAborted(Platform.java:371)
at org.sonar.server.platform.Platform$1.doRun(Platform.java:119)
at org.sonar.server.platform.Platform$AutoStarterRunnable.run(Platform.java:355)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NoClassDefFoundError: org/sonar/api/batch/AbstractCpdMapping
at java.lang.ClassLoader.defineClass1(Native Method)

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up