SonarQube 介绍
SonarQube 是一个开源的代码质量分析平台,便于管理代码的质量,可检查出项目代码的漏洞和潜在的逻辑问题。同时,它提供了丰富的插件,支持多种语言的检测,如 Java、Python、Groovy、C、C++等几十种编程语言的检测。
它主要的核心价值体现在如下几个方面:
- 检查代码是否遵循编程标准:如命名规范,编写的规范等。
- 检查设计存在的潜在缺陷:SonarQube 通过插件 Findbugs、Checkstyle 等工具检测代码存在的缺陷。
- 检测代码的重复代码量:SonarQube 可以展示项目中存在大量复制粘贴的代码。
- 检测代码中注释的程度:源码注释过多或者太少都不好,影响程序的可读可理解性。
- 检测代码中包、类之间的关系:分析类之间的关系是否合理,复杂度情况。
SonarQube特性:
- 易于安装,开箱即可启动
- 易于配置-所有配置可以通过其提供的web界面实现
- 可以与CI系统,例如jenkins完美集成
- 丰富的扫描规则,支持自定义,并可以集成findbugs,pmd,checkstyle等插件
- 丰富的格式支持,可以扫描java\js\xml\jsp等多种格式
- 丰富的统计功能
- 支持违规的处理、分配等工作流
- 可以对违规进行确认,误报的违规一次确认后将不再统计在内
- 支持maven\ant\命令行等方式扫描
架构原理
SonarQube 平台是由 4 个部分组成:
- SonarQube Server
- SonarQube Database
- SonarQube Plugins
- SonarQube Scanner
本篇介绍通过 Docker 来安装。大概的一个运作流程是这样的,先通过 Sonar-Scanner 插件扫描代码,把数据存储到数据库,SonarQube 读取数据库,将数据库展现在 Web 平台。
部署 Mysql 数据库
1、先拉取 Mysql 镜像(sonarqube:7.4 不支持 Mysql:5.7 以上)
docker pull mysql:5.7
2、创建工作目录,为接下来的挂载自定义映射路径做准备
mkdir -p /Users/xxxxx/data/mysql/conf
mkdir -p /Users/xxxxx/data/mysql/logs
mkdir -p /Users/xxxxx/data/mysql/data
3、创建网络
docker network create my-mysql-network
4、创建Mysql容器并运行
docker run --name mysql -d -p 3306:3306 --net my-mysql-network -v /Users/xxxxx/data/mysql/conf:/etc/my.cnf.d -v
/Users/xxxxx/data/mysql/logs:/logs -v
/Users/xxxxx/data/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart always \
--privileged=true \
--network-alias mysql \
mysql:5.7
详解:
-p 3306:3306:将容器 3306 映射到宿主机端口 3306
-v /Users/xxxxx/data/mysql/conf:/etc/my.cof.d:将容器下的 /etc/my.cof.d 挂载到宿主机 /Users/xxxxx/data/mysql/conf
-e MYSQL_ROOT_PASSWORD=123456:设置 root 密码 123456
--restart always:容器退出时总是重启
--privileged=true:挂载主机目录Docker访问出现Permission denied的解决办法
--net my-mysql-network:容器接入自定义网络
--network-alias mysql:给容器起个网络别名
5、查看容器是否运行正常
6、允许外网访问
进入容器: docker exec -it mysql /bin/bash
操作mysql:
mysql -uroot -p # 密码 123456
GRANT ALL ON *.* TO 'root'@'%'; # 所有网络都可访问
create database sonar; # 创建 sonarqube 数据库
# 添加远程登录用户:sonar ,并授予权限。
CREATE USER 'sonar'@'%' IDENTIFIED WITH mysql_native_password BY 'sonar';
GRANT ALL PRIVILEGES ON *.* TO 'sonar'@'%';
flush privileges; # 刷新权限
7、使用 Navicat 连接 Mysql 数据库
部署 SonarQube
1、拉取 SonarQube 镜像
docker pull docker pull sonarqube:7.4-community
2、创建工作目录
mkdir -p /Users/xxxxx/data/sonarqube
3、运行一个 test 容器
docker run -d --name sonartest sonarqube:7.4-community
4、将容器内重要文件复制到宿主机
docker cp sonartest:/opt/sonarqube/conf /Users/xxxxx/data/sonarqube
docker cp sonartest:/opt/sonarqube/data /Users/xxxxx/data/sonarqube
docker cp sonartest:/opt/sonarqube/logs /Users/xxxxx/data/sonarqube
docker cp sonartest:/opt/sonarqube/extensions /Users/xxxxx/data/sonarqube
5、然后删除此容器
docker rm sonartest
6、修改文件夹权限
chmod -R 777 /Users/xxxxx/data/sonarqube/
7、部署容器并运行( sonarQube + Mysql)
docker run -d --name sonar -p 9090:9000 \
-e SONARQUBE_DATABASE_USER=sonar \
-e SONARQUBE_DATABASE_NAME=sonar \
-e SONARQUBE_DATABASE_PASSWORD=sonar \
-e SONARQUBE_JDBC_URL="jdbc:mysql://0.0.0.0:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false" \
--net my-mysql-network \
--privileged=true \
-v /Users/xxxxx/data/sonarqube/logs:/opt/sonarqube/logs \
-v /Users/xxxxx/data/sonarqube/conf:/opt/sonarqube/conf \
-v /Users/xxxxx/data/sonarqube/data:/opt/sonarqube/data \
-v /Users/xxxxx/data/sonarqube/extensions:/opt/sonarqube/extensions\
sonarqube:7.4-community
详解:
-e SONARQUBE_DATABASE_USER=sonar: 远程用户名
-e SONARQUBE_DATABASE_NAME=sonar: 数据库名称
-e SONARQUBE_DATABASE_PASSWORD=sonar: 远程用户密码
-e SONARQUBE_JDBC_URL="jdbc:mysql://0.0.0.0:3306/sonar: 连接 sonar 数据库
--net my-mysql-network: 容器接入自定义网络
--privileged=true: 挂载主机目录Docker访问出现Permission denied的解决办法
-v /Users/xxxxx/data/sonarqube/logs:/opt/sonarqube/logs: 将容器下的 /opt/sonarqube/logs 挂载到宿主机 /Users/xxxxx/data/sonarqube/logs
8、查看日志
docker logs -f sonar
9、日志内出现以下日志数据 sonarqube 初始化成功
注意:初始化安装过程教程,过程中会安装一些必须依赖。耐心等待。。。
悄咪咪说一句:基本上一次就能安装成功,望君加油!!!!
10、初始化成功后,浏览器输入http://ip:9090,默认账号密码:admin
注意:打开 sonar 页面建议不要使用 http://0.0.0.0:9090 或者 http://127.0.0.1:9090
创建项目
1、创建项目领取令牌
2、分析项目选择项目语言以及操作系统和填写任务标识
3、下载 SonarScanner
下载地址:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/
4、下载扫描工具,根据您的操作系统,选择对应的版本
配置 SonarScanner 环境变量
1、进行解压缩
2、进入 sonar-scanner 文件夹内,获取 bin 目录的绝对路径
3、添加环境变量
使用 vi /etc/profile 命令 把 bin 的绝对路径添加到环境变量内
注意:不要添加到 ~/.bash_profile 内,否则环境变量老是失效
#sonarqube path
SONAR_SCANNER_HOME=/Users/xxxxx/data/sonarqube/sonar-scanner-4.7.0.2747-macosx
export PATH=$SONAR_SCANNER_HOME/bin:$PATH
4、使用以下命令生效 环境变量
source /etc/profile
5、查看环境变量是否配置成功
sonar-scanner -v
出现以下提示,说明环境变量配置成功
扫描代码
1、复制扫描代码指,修改对应的代码文件夹路径
2、粘贴执行扫描
扫描过程较慢。耐心等待。。。。。
出现以下报告,说明扫描成功
3、登陆管理控制台查看扫描结果
Jenkins集成SonarQube
- 开发工具 sonarlint实时分析
- 代码上传仓库git、svn等
- 持续集成服务jenkins使用SonarQube scanners进行代码分析
- 代码分析报告发送至SonarQube server
- SonarQube server将分析结果存入SonarQube database数据库
- SonarQube server界面UI展示代码问题,交由开发者管理处理问题
- SonarQube server提供代码分析报告
Jenkins操作
1、下载插件
插件管理内搜索 SonarQube Scanner 点击 install without restart
如果多次下载失败,就手动下载插件,手动上传该插件
插件下载地址:Jenkins Plugins
点击 2.14 版本名称进行下载
上传插件
2、设置 SonarQube servers
系统配置-找到 SonarQube servers 点击 Add SonarQube
name:随意写
Server URL:填写 SonarQube 服务器地址
添加 Server authentication token
类型选择:Secret text
Secret填写:项目令牌
选择添加的 token
3、Jenkins 容器内安装 SonarQube Scanner
1.创建 sonar-demo 项目
2.下载 SonarQube Scanner
地址:SonarScanner | SonarQube Docs
选择 Linux 64-bit 类型
把 sonar-scanner-cli-4.7.0.2747-linux.zip 复制 Jenkins 容器内
详解:
docker cp 压缩文件 b8ebff36b8ed:/var/jenkins_home/workspace/sonar-demo 复制 sonar 压缩包到 Jenkins 的 /var/jenkins_home/workspace/sonar-demo内
为啥要这样复制。因为 /var/jenkins_home 与本地 data/jenkins_home进行宿主机挂载了
解压 sonar-scanner-cli-4.7.0.2747-linux.zip 文件,并找到 bin目录绝对路径
3.下载 /etc/profile 到本地
注意:因 Jenkins 容器内未配置 vi/vim 命令,所以配置环境变量不能使用 vi/vim 命令 ,只有把 /etc/profile 文件复制到本地,然后添加 sonar-scanner 环境变量添加完成后,再上传到容器内。
/etc/profile 内添加 sonar-scanner 文件夹 bin 绝对路径
4.上传 /etc/profile 到Jenkins 容器内
Jenkins容器内查看 profile 内容
5.生效 环境变量
source /etc/profile
6.容器内查看环境变量是否配置成功
sonar-scanner -v
出现以下提示,说明环境变量配置成功
4、Jenkins 容器内扫描代码
扫描过程较慢。耐心等待。。。。。
出现以下报告,说明扫描成功
5、Jenkins 内配置 SonarQube Scanner
全局工具配置找到 SonarQube Scanner 点击 新增SonarQube Scanner
Name:随意写
SONAR_RUNNER_HOME:容器内 SonarQube Scanner 绝对路径与 /etc/profile 里面填写的 SonarQube Scanner 保持一致
6、Jenkins 内配置 sonar-demo 项目
增加构建步骤选择 Execute SonarQube Scanner
JDK:选择 已有的 名称
Analysis properties:填写构建信息
# unique project identifier (required)
sonar.projectKey=test-local #唯一项目标识符(必需)
# project metadata (used to be required, optional since SonarQube 6.1)
sonar.projectName=test-local #项目名称
sonar.projectVersion=1.0 #版本
# path to source directories (required)
sonar.sources=/var/jenkins_home/workspace/sonar-demo #路径到源目录,⚠️这个要写正确
# path to test source directories (optional)
sonar.tests=
# path to Java project compiled classes (optional)
sonar.java.binaries=
# comma-separated list of paths to libraries (optional)
sonar.java.libraries=
# Additional parameters
sonar.my.property=
7、Jenkins 构建 sonar-demo 项目
点击 SonarQube 查看内容
为啥是项目总览是空的呢!因为构建的时候,源目录下面没有任何代码。