[TOC]
## 一、介绍
>Sonar官方网站: [https://www.sonarqube.org](https://www.sonarqube.org/)
>Sonar官方下载地址: [https://www.sonarqube.org/downloads/](https://www.sonarqube.org/downloads/)
>Sonar官方文档:[https://docs.sonarqube.org/latest/](https://docs.sonarqube.org/latest/)
[SonarQube](http://www.sonarqube.org/) 是一款用于代码质量管理的开源工具,它主要用于管理源代码的质量,,可以生成质量数据报告。
支持Java, C#, C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等等二十几种编程语言的代码质量管理与检测。
SonarQube基本架构图:

SonarQube与项目持续集成架构图:

SonarQube可以从以下七个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量问题。
~~~
(1) 不遵循代码标准
SonarQube可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写。
(2) 潜在的缺陷
SonarQube可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检 测出潜在的缺陷。
(3) 糟糕的复杂度分布
文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员 难以理解它们, 且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试。
(4) 重复
显然程序中包含大量复制粘贴的代码是质量低下的,SonarQube可以展示 源码中重复严重的地方。
(5) 注释不足或者过多
没有注释将使代码可读性变差,特别是当不可避免地出现人员变动时,程序的可读性将大幅下降 而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷。
(6) 缺乏单元测试
SonarQube可以很方便地统计并展示单元测试覆盖率。
(7) 糟糕的设计
通过SonarQube可以找出循环,展示包与包、类与类之间的相互依赖关系,可以检测自定义的架构规则 通过SonarQube可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况, 检测耦合。
~~~
## 二、安装部署
### 1\. 下载镜像
~~~
docker pull sonarqube:7.6-community
~~~
### 2\. 运行镜像
~~~
docker run -d -p 9000:9000 --name sonarqube sonarqube:7.6-community
~~~
### 3\. 创建和复制文件
~~~
cd /opt/sonarqube
docker cp sonarqube:/opt/sonarqube/conf .
docker cp sonarqube:/opt/sonarqube/extensions .
chmod -R 777 extensions
mkdir logs
chmod -R 777 logs
mkdir data
chmod -R 777 data
~~~
### 4\. 创建启动命令`start.sh`
**`vim start.sh`**
~~~
GITLAB_DIR=/opt/sonarqube
docker stop sonarqube
docker rm sonarqube
docker run -d --name sonarqube \
-p 9000:9000 \
-v ${GITLAB_DIR}/conf:/opt/sonarqube/conf \
-v ${GITLAB_DIR}/data:/opt/sonarqube/data \
-v ${GITLAB_DIR}/logs:/opt/sonarqube/logs \
-v ${GITLAB_DIR}/extensions:/opt/sonarqube/extensions \
-e SONARQUBE_JDBC_USERNAME=root \
-e SONARQUBE_JDBC_PASSWORD=1q2w3e4r \
-e SONARQUBE_JDBC_URL="jdbc:mysql://192.168.28.131:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false" \
sonarqube:7.6-community
~~~
> SONARQUBE\_JDBC\_USERNAME 数据库用户名
> SONARQUBE\_JDBC\_PASSWORD 数据库密码
> SONARQUBE\_JDBC\_URL 数据库url
### 5\. 创建数据库
~~~
CREATE DATABASE SonarQube CHARACTER SET utf8 COLLATE utf8_general_ci
~~~
### 6\. 启动
~~~
sh start.sh
~~~
### 7\. 登录
[http://192.168.1.204:9000](http://192.168.1.204:9000/)
> 默认用户名密码:admin/admin
### 8\. 汉化
页面上找到Administration > Marketplace,在搜索框中输入chinese
出现一个Chinese Pack,点击右侧的install按钮。
安装成功后,会提示重启 SonarQube 服务器。

## 三、静态代码测试
### 1\. 本地maven检测
~~~
mvn clean compile sonar:sonar -Dsonar.host.url=http://192.168.28.204:9000
~~~
> sonar:sonar 执行sonar检查
> \-Dsonar.host.url 指定sonarQube的地址
### 2\. git上的maven检测
1. gitlab中创建项目;
2. 提交源代码;
3. 添加sonarqube为项目成员;
4. 添加gitlab的Pipeline(.gitlab-ci.yml文件中描述);

```
Sonar_Analyze:
script:
- source /etc/profile.d/sonarrc.sh #环境配置
- mvn clean install #findbug插件需要
- sonar-scanner -Dsonar.projectKey=$CI_PROJECT_NAME -Dsonar.sources=src -Dsonar.projectName=$CI_PROJECT_PATH -Dsonar.java.binaries=target #sonar扫描
only:
- develop #仅在develop分支调用上述命令
tags: #调用runner的标签
- sonar
Sonar_Preview:
script:
- source /etc/profile.d/sonarrc.sh
- mvn clean install
- sonar-scanner -Dsonar.analysis.mode=preview -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME -Dsonar.gitlab.project_id=$CI_PROJECT_ID -Dsonar.projectKey=$CI_PROJECT_NAME -Dsonar.sources=src -Dsonar.projectName=$CI_PROJECT_PATH -Dsonar.java.binaries=target
except:
- develop #除develop分支以外的分支
tags:
- sonar
```
| 序号 | 变量 | 解释 |
| --- | --- | --- |
| 1 | $CI_PROJECT_NAME | GitLab中源码项目名称 |
| 2 | $CI_PROJECT_PATH | GitLab中所属用户空间加上项目名称 |
| 3 | $CI_COMMIT_SHA | commit的版本(hash格式) |
| 4 | $CI_COMMIT_REF_NAME | 分支或tag名称 |
| 5 | $CI_PROJECT_ID | GitLab CI内部使用的唯一ID |
| 6 | sonar.analysis.mode | sonar分析的模式 |
- 微服务介绍
- 软件架构设计
- 系统简介
- 运行环境
- 模块介绍
- 启动部署命令参数
- 打包说明
- 开发说明
- Java8
- 认证理论
- 有网络隔离
- 无网络隔离
- token自动续签设计
- url级权限控制
- 单点登录
- 登录
- 用户名密码(+验证码)登录
- 通过openId获取token
- 通过手机号获取token
- 第三方系统接口对接
- 第三方系统单点登录
- 通用刷新token
- 账号登出接口
- 统一异常处理
- 日志埋点工具
- 审计日志
- yml自定义配置自动提示
- Redis使用
- CacheManager集成
- 搜索中心
- 网关zuul动态路由
- swagger
- 解决开发环境的服务冲突和实例乱窜
- 多租户理论
- 多租户实现
- 分布式锁
- 分布式id生成器
- 分布式事务
- 分库分表sharding-sphere
- 消息队列
- 系统幂等性
- X 实时搜索系统设计
- Spring Cloud性能调优
- 链路跟踪
- JWT的RSA非对称密钥生成
- jdk
- Oracle
- OpenJDK
- Dragonwell
- JVM介绍
- 常见JVM内存错误及解决方案
- JVM分析工具详解
- nexus
- docker
- 安装
- docker-compose安装
- 私有仓库搭建
- 指定数据储存目录
- 添加私有仓库
- 提交拉取镜像
- X 免Dockerfile文件构建项目镜像
- 持续集成部署CI/CD
- Confluence知识管理
- JIRA事务与项目跟踪软件
- Gitlab代码仓库
- Jenkins自动化部署
- SonarQube代码检测
- Rancher容器管理平台
- nacos
- 部署
- Rancher部署nacos
- 注册中心
- 配置中心
- 多环境
- 生产部署方案
- X 通过Nginx来实现环境隔离
- Sentinel详解
- 动态规则扩展
- 在生产环境中使用 Sentinel
- 启动配置项
- X 网关流控
- ELK日志系统和慢查询SQL
- docker安装
- 普通安装
- Filebeat安装部署
- ES数据定期删除
- 没数据问题排查思路
- X Logstash的grok语法调试
- 慢查询sql
- 审计日志
- Elasticsearch性能优化
- APM监控
- SkyWalking介绍
- Zipkin,Pinpoint,SkyWalking三种服务链路监控组件分析
- 服务端部署
- 客户端部署
- 日志清理
- Metrics监控
- 二进制包部署
- docker部署
- docker安装各组件监控
- Grafana仪表盘和告警配置
- JMeter压力测试工具
- 使用说明
- 分布式事务
- TX-LCN(同步)
- X SEATA(同步)
- X RocketMQ(异步)
- 消息队列
- RocketMQ
- RocketMQ安装部署
- RocketMQ常见异常处理
- SpringCloud-Stream
- RabbitMQ
- Redis
- 单机安装
- 主从复制
- 主从复制+哨兵
- cluster集群
- 持久化方案
- MySQL
- 单机安装
- 主从复制
- 主从切换
- 主主复制
- 高可用
- 分表分库
- Canal数据库日志解析消费
- Canal安装
- 实时同步数据到ElasticSearch
- FastDFS
- docker安装
- centos安装
- 项目管理系统
- 禅道
- 111