SonarQube代码质量管理

SonarQube代码质量管理

一、介绍与安装

SonarQube 是一款用于代码质量管理的开源工具,它主要用于管理源代码的质量。 通过插件形式,可以支持众多计算机语言,比如 java, C#, go,C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等。sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具来检测你的代码,帮助你发现代码的漏洞,Bug,异味等信息。 Sonar 不仅提供了对 IDE 的支持,可以在 Eclipse和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。

image

二、安装SonarQube

1、环境准备
  • java环境
  • 数据库(支持SQL Server、Mysql、Oracle、PostgreSQL)
2、无数据库快速安装
#SonarQube 7.9及以后的版本不再支持MySQL
[root@localhost ~]# docker pull sonarqube:7.8-community
  • 快速安装

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

docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 sonarqube:7.8-community
浏览器打开:0.0.0.0:9000
帐号密码:admin、admin
3、安装数据库

启动mysql官方页面: https://hub.docker.com/_/mysql?tab=description

  • 首先设置挂载权限

    需要修改目录权限,因为当映射本地数据卷时,/home/xyz/test/mysql/目录的拥有者为root用户,而容器中的jenkins user的uid为1000

[root@localhost ~]# chown -R 1000 /home/xyz/test/mysql/
  • docker启动mysql
[root@localhost ~]# docker run --name some-mysql -v /home/xyz/test/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123123 -d -p 8999:3306 mysql:5.7

#挂载目录更细
[root@localhost ~]#docker run \
    -d \
    -p 8999:3306 \
    --name mysql \
    -v /home/xyz/test/mysql/conf:/etc/mysql/conf.d \
    -v /home/xyz/test/mysql/logs:/logs \
    -v /home/xyz/test/mysql/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123123 \
    mysql:5.7

注意:docker run -e  在容器内创建一个环境变量,这是宿主机向容器中传递信息的方法之一,在这里给mysql传递了-e MYSQL_ROOT_PASSWORD=123123,也就是初始密码123123

注意:sonarqube最低支持5.6版本

4、手动创建数据库
#进入容器
[root@localhost ~]# docker exec -it f0b9b606386d bash

#登录mysql
root@f0b9b606386d:/# mysql -uroot -p123123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.28 MySQL Community Server (GPL)

mysql> show databases ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.02 sec)

#创建数据库
mysql> create database db_sonar;
Query OK, 1 row affected (0.00 sec)


mysql> show databases ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_sonar           |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5、添加远程登录用户
#用户名为sonar,密码为sonar
mysql> CREATE USER 'sonar'@'%' IDENTIFIED WITH mysql_native_password BY 'sonar';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'sonar'@'%';
Query OK, 0 rows affected (0.00 sec)

6、docker启动sonarqube
  • 启动sonarqube命名
[root@localhost ~]#docker run \
-d \
--name sonarqube \
-p 9000:9000 \
-p 9092:9092 \
--link=some-mysql:mysql \
-e SONARQUBE_JDBC_USERNAME=sonar \
-e SONARQUBE_JDBC_PASSWORD=sonar \
-e SONARQUBE_JDBC_URL="jdbc:mysql://192.168.31.5:8999/db_sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false" \
sonarqube:7.8-community

#--link=some-mysql:mysql
some-mysql是上面启动的0780av4容器的名字,这里作为源容器,mysql是该容器在link下的别名(alias),通俗易懂的讲,站在node容器的角度,some-mysql和mysql都是0780av4容器的名字,并且作为容器的hostname,node用这2个名字中的哪一个都可以访问到0780av4容器并与之通信。
  • 发现错误max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535] 
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

首先修改:

vi /etc/security/limits.conf
修改配置文件,在文件最后加入下面两个行。用户退出重新登录生效。
*               soft    nofile          65536
*               hard    nofile          65536

然后修改:

sudo sysctl -w vm.max_map_count=262144

注意:db_sonar数据库需要手动先创建,否则会报找不到。本地搭建ip地址不能写localhost,需要写内网ip。另外 SonarQube 7.9不再支持MySQL。

7、sonarqube登录及汉化
  • 默认登录账户信息
admin
admin
  • 在线安装汉化包

点击adminstration,然后点击marketplace,然后搜索chinese,安装。

image
  • 下载离线安装汉化包

下载地址:https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases/tag/sonar-l10n-zh-plugin-1.28

  • 将主机的文件复制到容器中
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
#把下载好的jar包放在 /extensions/plugins/目录下
sonarqube@dfb52e9f7b13:/opt/sonarqube/extensions/plugins$docker cp ./sonar-l10n-zh-plugin-1.28.jar sonarqube:/opt/sonarqube/extensions/plugins
[root@localhost ~]# docker exec -it sonarqube bash
sonarqube@dfb52e9f7b13:/opt/sonarqube$ cd /opt/sonarqube/extensions/plugins
sonarqube@dfb52e9f7b13:/opt/sonarqube/extensions/plugins$ ls

README.txt              sonar-jacoco-plugin-1.0.1.143.jar   sonar-ruby-plugin-1.5.0.315.jar
sonar-auth-github-plugin-1.5.0.870.jar  sonar-java-plugin-5.13.0.18197.jar  sonar-scala-plugin-1.5.0.315.jar
sonar-auth-saml-plugin-1.1.0.181.jar    sonar-javascript-plugin-5.2.1.7778.jar  sonar-scm-git-plugin-1.8.0.1574.jar
sonar-csharp-plugin-7.14.0.8411.jar sonar-kotlin-plugin-1.5.0.315.jar   sonar-scm-svn-plugin-1.9.0.1295.jar
sonar-css-plugin-1.1.0.993.jar      sonar-l10n-zh-plugin-1.28.jar       sonar-typescript-plugin-1.9.0.3766.jar
sonar-flex-plugin-2.4.0.1222.jar    sonar-ldap-plugin-2.2.0.608.jar     sonar-vbnet-plugin-7.14.0.8411.jar
sonar-go-plugin-1.1.1.2000.jar      sonar-php-plugin-3.1.1.4762.jar     sonar-xml-plugin-2.0.1.2020.jar
sonar-html-plugin-3.1.0.1615.jar    sonar-python-plugin-1.14.0.3086.jar

重新启动,汉化成功

image
8、代码扫描插件安装

比较高的版本默认会安装很多插件,若需求有变,可在插件市场中搜索下载。

image

三、安装sonar-scanner

1、安装sonar-scanner工具

请将sonar-scanner安装在jenkins服务上,因为jenkins拉取代码到本地后,再执行代码扫描

  • 下载sonar-scanner
[root@localhost ~]# wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.0.0.1744-linux.zip
  • 解压文件
#安装解压工具
[root@localhost ~]# yum install -y unzip zip

#解压文件
[root@localhost ~]# unzip sonar-scanner-cli-4.0.0.1744-linux.zip
  • 移到标准位置
[root@localhost ~]# mv sonar-scanner-4.0.0.1744-linux/ /usr/local
2、修改sonar-scanner配置文件
  • 建立软连接,方便用sonar-scanner的别名执行代码检测命令
[root@localhost ~]#ln -s /usr/local/sonar-scanner-4.0.0.1744-linux/ sonar-scanner
  • 修改配置文件sonar-scanner.properties
[root@localhost ~]# cd /usr/local/sonar-scanner-4.0.0.1744-linux/conf
[root@localhost conf]# vi sonar-scanner.properties
  • 以配置sonar用户名及密码方式连接
#----- Default SonarQube server
sonar.host.url=http://192.168.31.5:9000
 
#----- Default source code encoding
sonar.sourceEncoding=UTF-8
 
#----- 数据库用户名
sonar.jdbc.username=sonar
#----- 数据库密码
sonar.jdbc.password=sonar
#----- 数据库连接地址
sonar.jdbc.url=jdbc:mysql://192.168.31.5:8999/db_sonar?useUnicode=true&characterEncoding=utf8
 
#----- Sonar 用户名
sonar.login=admin
#----- Sonar 密码
sonar.password=admin
  • 以token方式配置并连接sonar

要以token方式配置并连接sonar,需要先开启访问权限

image
image

然后,创建项目,生成token,复制并在sonar-scanner配置文件sonar-scanner.properties中

image
image
image
[root@localhost ~]# cd /usr/local/sonar-scanner-4.0.0.1744-linux/conf
[root@localhost conf]# vi sonar-scanner.properties
#----- Default SonarQube server
sonar.host.url=http://192.168.31.5:9000
#----- Sonar token登录
sonar.login= a380c2e12c6735dcb8550d5e6dae192265a97a15

#----- Default source code encoding
sonar.sourceEncoding=UTF-8
 
#----- 数据库用户名
sonar.jdbc.username=sonar
#----- 数据库密码
sonar.jdbc.password=sonar
#----- 数据库连接地址
sonar.jdbc.url=jdbc:mysql://192.168.31.5:8999/db_sonar?useUnicode=true&characterEncoding=utf8
 

3、修改环境变量
[root@localhost ~]# vi /etc/profile

在末尾环境变量处增加以下内容:

export SONAR_SCANNER_HOME=/usr/local/sonar-scanner-4.0.0.1744-linux
export PATH=$SONAR_SCANNER_HOME/bin:$PATH

配置生效

[root@localhost ~]# vi /etc/profilesource /etc/profile

四、代码检测

创建好项目,然后保存好生成的项目token,然后按照提示选择要生成的代码,最后生成代码分析命令。比如生成的python代码检查命令,如下所示:

image

进入要检测的项目目录,然后执行下列命名:

[root@localhost ~]# cd /home/myprojects
[root@localhost myprojects]# ls
appium_xueqiu-master

执行代码扫描命名:

[root@localhost myprojects]#sonar-scanner \
  -Dsonar.projectKey=mytest \
  -Dsonar.sources=. \
  
 #在sonar-scanner配置文件sonar-scanner.properties中添加了token就不用再添加下列两行命令
  -Dsonar.host.url=http://192.168.31.5:9000 \
  -Dsonar.login=a380c2e12c6735dcb8550d5e6dae192265a97a15

结果:

INFO: ------------- Run sensors on project
INFO: Sensor Zero Coverage Sensor
INFO: Sensor Zero Coverage Sensor (done) | time=22ms
INFO: No SCM system was detected. You can use the 'sonar.scm.provider' property to explicitly specify it.
INFO: 9 files had no CPD blocks
INFO: Calculating CPD for 14 files
INFO: CPD calculation finished
INFO: Analysis report generated in 85ms, dir size=118 KB
INFO: Analysis report compressed in 35ms, zip size=47 KB
INFO: Analysis report uploaded in 52ms
INFO: ANALYSIS SUCCESSFUL, you can browse http://192.168.31.5:9000/dashboard?id=mytest
INFO: Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report
INFO: More about the report processing at http://192.168.31.5:9000/api/ce/task?id=AXB11_OiIlo1wSAT3f3c
INFO: Analysis total time: 5.902 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 7.062s
INFO: Final Memory: 6M/27M

在服务器上查看结果:

image

五、集成Jenkins

1、jenkins安装sonar-scanner插件

点击“系统管理”,然后点击"插件管理",搜索sonar,找到插件并安装,根据提示重启jenkins

image
2、配置sonarqube服务器

点击“系统管理”,然后点击“系统设置”,配置sonarqube服务器

image
image

最后点击保存

3、配置sonar-scanner客户端

点击“系统管理”,然后点击“全局工具配置”,配置sonar-scanner客户端

image
  • jenkins安装在服务器本地,配置方式需要填写本地安装的sonar-scanner客户端路径
[root@localhost sonar-scanner-4.0.0.1744-linux]# pwd
/usr/local/sonar-scanner-4.0.0.1744-linux
image
  • jenkins安装在dockers容器中时,配置方式有些不同,这里sonar-scanner选择自动安装,配置完成后点击保存
image
4、修改任务配置
image
image
image

配置SonarQube analysis properties。可以将其单独写到一个配置文件(sonar-project.properties)里面,也可以像这样每次都写一遍。

#项目的唯一标识,不能重复
sonar.projectKey=python

#项目在sonarqube上显示的名称
sonar.projectName=${JOB_NAME}

#扫描哪个项目的源代码
sonar.sources=${WORKSPACE}

注意,在docker容器中部署的jenkins,在配置SonarQube analysis properties时配置sonar.sources=.,否则可能找不到拉取下来的代码

#项目的唯一标识,不能重复
sonar.projectKey=python

#项目在sonarqube上显示的名称
sonar.projectName=${JOB_NAME}

#扫描哪个项目的源代码
sonar.sources=.

六、参考文献

https://testerhome.com/topics/17117

https://www.jianshu.com/p/b92add446d4e

https://www.cnblogs.com/freestudy/articles/10277783.html

https://blog.csdn.net/KissedBySnow/article/details/90437605

https://blog.csdn.net/An1090239782/article/details/104262711?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

https://www.cnblogs.com/gcgc/p/10829948.html

http://www.eryajf.net/1977.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容