[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基本架构图: ![](https://img.kancloud.cn/b2/0e/b20e9f8df03efff4932c614a3d050832_1200x316.png) SonarQube与项目持续集成架构图: ![](https://img.kancloud.cn/26/bf/26bfdb046fe048db390f7b1927594fc0_1200x700.png) 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 服务器。 ![](https://img.kancloud.cn/d4/10/d410e02cb239192ee752f2ee205670e6_1555x787.png) ## 三、静态代码测试 ### 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文件中描述); ![](https://img.kancloud.cn/02/8b/028bedd55ff12fcc2734aae9d5890ddf_1815x714.png) ``` 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分析的模式 |