【Linux运维入门】手把手教你使用 SonarQube 改善代码质量
SonarQube介绍
SonarQube是一个用于代码质量管理的开源平台,用于管理源代码的质量。
同时 SonarQube 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 SonarQube。
此外,SonarQube 的插件还可以对 Java 以外的其他编程语言提供支持,对国际化和报告文档化也有良好的支持。
SonarQube的使用范围
通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,JavaScrip等二十几种编程语言的代码质量管理与检测,针对不同的编程语言其所提供的分析方式也有所不同:
对于所有支持的编程语言,SonarQube 都提供了源代码的静态分析功能。
对于某些特定的编程语言,SonarQube 提供了对编译后代码的静态分析功能。
需要注意的底层代码问题
不遵循代码标准
潜在的缺陷
糟糕的复杂度分布
重复
注释不足或者过多
缺乏单元测试
糟糕的设计
SonarQube 可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规 范代码编写
SonarQube 可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检 测出潜在的缺陷
文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们
如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试
显然程序中包含大量复制粘贴的代码是质量低下的,SonarQube 源码中重复严重的地方
没有注释将使代码可读性变差,特别是当不可避免地出现人员变动时
程序的可读性大幅下降而过多的注释又会使得开发人员将精力花费在注释上,亦违背初衷
SonarQube 可以很方便地统计并展示单元测试覆盖率
通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系,检测自定义的架构规则
通过sonar可以管理第三方的jar包,利用LCOM4检测单个任务规则的应用情况,检测藕合
搭建SonarQube
| 安装基础软件
[root@oldboy-sonarqube ~]# yum -y install git java unzip wget
| 安装数据库
# 下载mysql yum源
[root@oldboy-sonarqube ~]# wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm
[root@oldboy-sonarqube ~]# yum localinstall mysql80-community-release-el7-5.noarch.rpm
# 更改默认安装版本为5.7
[root@oldboy-sonarqube ~]# vim /etc/yum.repos.d/mysql-community.repo
[root@oldboy-sonarqube ~]# grep "mysql57" -A 15 /etc/yum.repos.d/mysql-community.repo
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
# 安装mysql
[root@oldboy-sonarqube ~]# yum install mysql-community-server -y
| 启动数据库
[root@oldboy-sonarqube ~]# systemctl start mysqld
# 如果端口监听到tcp6,增加一条配置重启即可
[root@oldboy-sonarqube ~]# grep bind /etc/my.cnf
bind-address =0.0.0.0
[root@oldboy-sonarqube ~]# systemctl restart mysqld
# 或者关闭系统的tcp6
[root@oldboy-sonarqube ~]# vim /etc/sysctl.conf # 加入以下三条配置
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
[root@oldboy-sonarqube ~]# sysctl -p
| 登录数据库
# 查看默认密码
[root@oldboy-sonarqube ~]# cat /var/log/mysqld.log | grep 'password'
2022-04-21T01:25:21.080508Z 1 [Note] A temporary password is generated for root@localhost: <Ee?o?/M-9Td
# 登录数据库
[root@oldboy-sonarqube ~]# mysql -p"<Ee?o?/M-9Td"
| 修改数据库密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'oldboy123';
-- MySQL5.7设置了密码必须大于8位、包含数字、大小写字母、特殊字符
-- 如果不想设置那么麻烦的话可以修改配置文件
[root@oldboy-sonarqube ~]# grep validate /etc/my.cnf
validate_password=off
-- 创建sonar库
mysql> CREATE DATABASE sonar DEFAULT CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sonar |
| sys |
+--------------------+
5 rows in set (0.00 sec)
| SonarQube服务安装
[root@oldboy-sonarqube ~]# wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.0.zip
[root@oldboy-sonarqube ~]# unzip sonarqube-7.0.zip
[root@oldboy-sonarqube ~]# mkdir -p /oldboyedu/softwares/
[root@oldboy-sonarqube ~]# mv sonarqube-7.0 /oldboyedu/softwares/
[root@oldboy-sonarqube ~]# cd /oldboyedu/softwares/
[root@oldboy-sonarqube softwares]# ln -s sonarqube-7.0/ sonarqube
[root@oldboy-sonarqube softwares]# useradd sonar
[root@oldboy-sonarqube softwares]# chown -R sonar.sonar /oldboyedu/softwares/sonarqube-7.0/
# 关闭防火墙
[root@oldboy-sonarqube softwares]# systemctl stop firewalld.servic
| 配置sonar连接本地数据库
[root@oldboy-sonarqube softwares]# vim /oldboyedu/softwares/sonarqube/conf/sonar.properties
[root@oldboy-sonarqube softwares]# grep "^$|#" /oldboyedu/softwares/sonarqube/conf/sonar.properties
sonar.jdbc.username=root
sonar.jdbc.password=oldboy123
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
| 使用普通用户启动sonarqube
[root@oldboy-sonarqube softwares]# su - sonar -c "/oldboyedu/softwares/sonarqube/bin/linux-x86-64/sonar.sh start"
Starting SonarQube...
Started SonarQube.
# 启动后的端口为9000使用浏览器直接访问http://192.168.56.146:9000/about 用户名admin 密码admin
使用SonarQube
[root@oldboy-jenkins ~]# wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.7.0.2747-linux.zip
[root@oldboy-jenkins ~]# unzip sonar-scanner-cli-4.7.0.2747-linux.zip
[root@oldboy-jenkins ~]# mv sonar-scanner-4.7.0.2747-linux/ /oldboyedu/softwares/
[root@oldboy-jenkins ~]# ln -s /oldboyedu/softwares/sonar-scanner-4.7.0.2747-linux/ /oldboyedu/softwares/sonar-scanner
[root@oldboy-jenkins ~]# vim /oldboyedu/softwares/sonar-scanner/conf/sonar-scanner.properties
[root@oldboy-jenkins ~]# egrep -v "^$|#" /oldboyedu/softwares/sonar-scanner/conf/sonar-scanner.properties
sonar.host.url=http://192.168.56.146:9000
sonar.login=8229eadc87409aa0565924f76fd1bb0c65dd0990
sonar.sourceEncoding=UTF-8
到项目目录下进行代码推送分析 打开认证
# 在Jenkins服务器上
[root@oldboy-jenkins ~]# cd /var/lib/jenkins/workspace/test
[root@oldboy-jenkins ~]# /oldboyedu/softwares/sonar-scanner/bin/sonar-scanner \
-Dsonar.projectKey=html \
-Dsonar.sources=.
执行成功后的结果在页面查看
推送java代码分析
[root@oldboy-jenkins ~]# cd /var/lib/jenkins/workspace/java
[root@oldboy-jenkins ~]# /oldboyedu/softwares/sonar-scanner/bin/sonar-scanner \
-Dsonar.projectKey=java \
-Dsonar.sources=.
SonarQube集成到Jenkins
| jenkins中安装插件
| jenkins上配置SonarQube服务端
| 无法添加凭据解决方案
| jenkins配置
| 配置test项目
中增加构建项sonar 上下对换位置,先测试代码后发布到web
sonar.projectName=${JOB_NAME} # 项目在sonarqube上的显示名称
sonar.projectKey=html # 项目的唯一表示,不能重复
sonar.sources=. # 扫描那个项目的源码