持续集成 代码审查 Sonar

Posted by Sunday on 2018-07-26

SonarQube 是一个开源的代码分析平台, 用来持续分析和评测项目源代码的质量。 通过SonarQube团队项目代码质量可以检测出项目中重复代码, 潜在bug, 代码风格问题,缺乏单元测试等问题, 并通过一个web ui展示出来。
11

主要功能如下:

  1. 用户本地使用IDE的插件进行代码分析
  2. 用户上传到源代码版本控制服务器
  3. 持续集成,使用Sonar Scanner进行扫描
  4. 将扫描结果上传到SonarQube服务器
  5. SonarQube server将结果写入db
  6. 用户通过web ui查看扫描结果
  7. SonarQube导出结果到其他需要的服务

用Sonar能够实现什么?

  • 技术债务(sonar根据”规则”扫描出不符合规则的代码)
  • 覆盖率(单元测试覆盖率)
  • 重复(重复的代码, 有利于提醒封装)
  • 结构

Sonar部署

数据库配置

安装mysql 5.6

1
2
3
4
5
6
7
8
rpm -ivh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm 
yum install mysql-community-server -y
systemctl start mysqld.service

CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
FLUSH PRIVILEGES;

安装

https://www.sonarqube.org/downloads/

1
2
3
yum install java-1.8.0
unzip sonarqube-6.7.4.zip -d /usr/local/
ln -s /usr/local/sonarqube-6.7.4 /usr/local/sonarqube

配置

1
2
3
4
5
6
7
vim /usr/local/sonarqube/conf/sonar.properties

sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.web.host=0.0.0.0
sonar.web.port=9000

启动

1
2
3
useradd sonar
chown -R sonar.sonar /usr/local/sonarqube/
sudo -u sonar /usr/local/sonarqube/bin/linux-x86-64/sonar.sh start

访问:192.168.10.101:9000
登陆管理员:admin:admin

中文

Administration - Marketplace
安装 Chinese Pack,然后重启sonar
11

也可以通过下列的安装
https://github.com/SonarQubeCommunity/sonar-l10n-zh
https://github.com/SonarQubeCommunity/sonar-l10n-zh/tags

1
2
cp sonar-l10n-zh-plugin-1.19.jar /usr/local/sonarqube/extensions/plugins
/usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart

Sonar-scanner

安装

1
2
unzip sonar-scanner-cli-3.2.0.1227-linux.zip -d /usr/local/ 
ln -sv sonar-scanner-cli-3.2.0.1227-linux /usr/local/sonar-scanner

配置sonar-scanner与sonar关联

1
2
3
4
5
6
7
sonar.host.url=http://localhost:9000
sonar.sourceEncoding=UTF-8
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.login=admin
sonar.log=admin

测试代码下载

1
2
wget https://github.com/SonarSource/sonar-scanning-examples/archive/master.zip
unzip master

配置扫描

1
2
3
4
5
6
7
8
vim /root/sonar-scanning-examples-master/sonarqube-scanner/sonar-project.properties
sonar.projectKey=org.sonarqube:sonarqube-scanner #keys(唯一性,不可其他项目重复)
sonar.projectName=Example of SonarQube Scanner Usage #名称(唯一性,不可其他项目重复)
sonar.projectVersion=1.0

sonar.sources=src #代码目录
sonar.sourceEncoding=UTF-8
#sonar.language=php #只检测php代码,注释则检测全部代码,java,c,python 等

启动检测

1
2
cd /root/sonar-scanning-examples-master/sonarqube-scanner
/usr/local/sonar-scanner/bin/sonar-scanner

11

Jenkins配置sonar插件

实现Jenkins构建时自动sonar检测。

jenkin安装插件:SonarQube Scanner
系统管理-系统设置
11
系统管理-全局工具配置
11
web项目配置 - 配置 - 构建
配置sonar参数,并设置构建失败邮件通知
11

1
2
3
4
5
6
sonar.projectKey=web-sonar-scanner
sonar.projectName=web-sonar-scanner
sonar.projectVersion=1.0
sonar.sources=./
sonar.sourceEncoding=UTF-8
sonar.language=php

web项目配置 立即构建
11
11

故障解决

无法启动

1
2
3
4
5
6
7
8
9
10
cat /usr/local/sonarqube/logs/sonar.log 
2018.07.26 18:05:54 WARN app[][o.s.a.p.AbstractProcessMonitor] Process exited with exit value [es]: 1

cat /usr/local/sonarqube/logs/es.log
2018.07.26 18:05:54 ERROR es[][o.e.b.Bootstrap] Exception
java.lang.RuntimeException: can not run elasticsearch as root

useradd sonar
chown -R sonar.sonar /usr/local/sonarqube/
sudo -u sonar /usr/local/sonarqube/bin/linux-x86-64/sonar.sh start

1
2
3
4
5
6
7
8
vim /usr/local/sonarqube/elasticsearch/config/jvm.options
#-Xms2g
#-Xmx2g
-Xms512m
-Xmx512m

rm -rf /usr/local/sonarqube/data/*
sudo -u sonar /usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart
1
2
3
4
cat /usr/local/sonarqube/logs/web.log
ERROR web[][o.s.s.p.Platform] Web server startup failed: Unsupported mysql version: 5.5. Minimal supported version is 5.6.
6.7版本不支持mysql5.5,升级至mysql5.6
7.2版本支持mysql5.5