SonarQube代码质量管理
一、介绍与安装
SonarQube 是一款用于代码质量管理的开源工具,它主要用于管理源代码的质量。 通过插件形式,可以支持众多计算机语言,比如 java, C#, go,C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等。sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具来检测你的代码,帮助你发现代码的漏洞,Bug,异味等信息。 Sonar 不仅提供了对 IDE 的支持,可以在 Eclipse和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。
二、安装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,安装。
- 下载离线安装汉化包
下载地址: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
重新启动,汉化成功
8、代码扫描插件安装
比较高的版本默认会安装很多插件,若需求有变,可在插件市场中搜索下载。
三、安装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,需要先开启访问权限
然后,创建项目,生成token,复制并在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
#----- 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代码检查命令,如下所示:
进入要检测的项目目录,然后执行下列命名:
[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
在服务器上查看结果:
五、集成Jenkins
1、jenkins安装sonar-scanner插件
点击“系统管理”,然后点击"插件管理",搜索sonar,找到插件并安装,根据提示重启jenkins
2、配置sonarqube服务器
点击“系统管理”,然后点击“系统设置”,配置sonarqube服务器
最后点击保存
3、配置sonar-scanner客户端
点击“系统管理”,然后点击“全局工具配置”,配置sonar-scanner客户端
- jenkins安装在服务器本地,配置方式需要填写本地安装的sonar-scanner客户端路径
[root@localhost sonar-scanner-4.0.0.1744-linux]# pwd
/usr/local/sonar-scanner-4.0.0.1744-linux
- jenkins安装在dockers容器中时,配置方式有些不同,这里sonar-scanner选择自动安装,配置完成后点击保存
4、修改任务配置
配置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