sonarqube代码质量管理平台环境搭建及实践(一)

一、前言

年初的时候部门各组都给出了自己的规范文档,包括部门工作规范、各语言开发规范、测试规范、数据库规范、安全规范等等,然后各项规范的监督和落实工作就落在测试组的头上。其中各个开发语言的规范检查这一项工作内容就巨多,毕竟是一个没有做个code review的部门,技术债务可想而知。根据我多年TesterHome的潜水经验,搭建一个sonar平台就很有必要了。

二、平台搭建

我这里用的是windows,文中用到的所有软件都会在文末给出,linux操作系统的就看看配置吧。

基础环境

1.JDK

下载安装最新版JDK,并配置环境变量:

JAVA_HOME=C:\Program Files\Java\jdk1.8.0_131
path   %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
CLASSPATH   .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

2.Mysql

主要是安装mysql server,但是我为了避免发生不必要的错误,选择了全部安装,但是安装过程中提示缺少microsoft visual c++ 2013 runtime,结果mysql server没装上。

安装完成microsoft visual c++ 2013 runtime后打开MySql Notifyer,右键,actions---launch installer ---- add --- MySql Server一步一步安装直到结束。

我局域网ip是192.183.3.11,创建了两个数据库管理员帐号:

root       123456
sonarqube  sonarqube

最后验证数据库安装和帐号是否创建成功,使用Navicat客户端连接,使用以上帐号连接成功即可。

sonarqube

1.服务架构

服务架构

远程客户机可以通过各种不同的分析机制,将被分析的项目代码上传到 SonarQube server 并进行代码质量的管理和分析,SonarQube 还会通过 Web API 将分析的结果以可视化、可度量的方式展示给用户。
通过插件机制,Sonar可以集成不同的测试工具,代码分析工具,以及持续集成工具,比如pmd-cpd、checkstyle、 findbugs、Jenkins。通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程 进行代码质量管理。
通常可以采用三种不同的方法来发起代码分析,分别为 Analyzing with SonarQube Runner、,Analyzing with SonarQube Ant Task 和 Analyzing with Maven 方法。这三种方法的主要区别是 , 它们分别适用于不同架构和组织形式的项目,并且其相应的配置文件的写法也不尽相同。
本文采用的是SonarQube Runner的分析方式。

2.创建数据库

使用Navicat连接数据库并在命令行中运行:

create database sonarqube;

3.配置sonarqube

官网下载的windows运行包解压后修改conf\sonar.properties配置文件:

sonar.jdbc.url=jdbc:mysql://172.16.30.228:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
sonar.jdbc.username=sonarqube
sonar.jdbc.password=sonarqube

注:这里的ip、数据库名、数据库用户名和密码都是上面创建的。

4.启动sonarqube

双击\sonarqube-6.3.1\bin\windows-x86-64\StartSonar.bat启动(根据你的系统选择),访问http://192.183.3.11:9000 ,出现如下界面即成功,启动过程数据库初始化可能稍微有点慢。如果需要更换端口的在sonar.properties文件中进行修改。
启动成功后登录,默认帐号密码都是admin,进入配置--系统--更新中心--Avaliable搜索Chinese Pack安装简体中文汉化包,安装完成重启。

首页

5.安装插件

以管理员身份登录后,进入配置--系统--更新中心--Avaliable搜索你需要安装的插件。需要注意的是有写插件需要挂代理才能安装成功。

插件
插件

sonar-runner(sonar-scanner)

SonarQube Runner是一个利用SonarQube服务端分析代码的命令行工具,可以把它简单理解为客户端。sonar-runner分析完成后会将数据post到sonarqube进行展示。

1.配置

将下载好的sonar-scanner-2.5解压编辑其中的conf\sonar-runner.properties文件:

#----- Default SonarQube server  SonarQube 服务器ip端口
sonar.host.url=http://192.183.3.11:9000
#----- Default source code encoding
sonar.sourceEncoding=UTF-8
#----- Global database settings (not used for SonarQube 5.2+) 数据库帐号密码
sonar.jdbc.username=sonarqube
sonar.jdbc.password=sonarqube
#----- MySQL  服务所在ip以及数据库名
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8

将sonar-runner配置到系统环境变量:

新建系统环境变量SONAR_RUNNER_HOME=your\sonar\path\sonar-scanner-2.5\sonar-scanner-2.5
在path中添加:%SONAR_RUNNER_HOME%\bin;

验证环境变量配置


sonar-runner

2.分析本地项目

使用sonar-runner分析项目非常方便,只要在项目工程目录下新建sonar-project.properties文件,内容大致如下:

#key和name保持一致且在sonar下唯一
sonar.projectKey=car_android
sonar.projectName=car_android
#工程版本
sonar.projectVersion=1.0  
#源代码目录
sonar.sources=src 
#分析的语言 
sonar.language=java  
#编码
sonar.sourceEncoding=UTF-8

之后在cmd下进入工程目录下运行:sonar-runner -X


运行结果

运行最终结果显示EXECUTION SUCCESS即成功。稍候片刻打开sonar查看所有项目看到刚刚分析的项目car_android。

car_android

三、项目实践

(一)与jenkins集成

考虑到下载源码,编辑sonar-project.properties配置文件,执行sonnar-runner -X这些步骤都太过反复繁琐,果断使用jenkins来完成这些工作。
下载并运行jenkins,完成一些基础配置,这里就不细讲了,主要说与sonar集成。

1.安装[SonarQube Scanner for Jenkins]插件

进入系统管理,插件管理中搜索[SonarQube Scanner for Jenkins]点击安装。

2.插件配置

进入系统管理--[Global Tool Configuration],找到[SonarQube Scanner],点击新增,取消“自动安装”的勾选,输入系统安装的sonnar-runner工作目录,完成后保存。


SonarQube Scanner

进入系统管理--系统设置,找到SonarQube servers,输入SonarQube servers的相关配置。

SonarQube servers

这里的token需要在sonar的我的账户-安全里生成

sonarToken

到这里,插件配置完成。

(二)安卓项目

1.基础准备

我们的安卓源码放在自己搭建的一个Gerrit私服上,我在jenkins上还安装了Gerrit Trigger插件,结果目前都是手动构建。Gerrit是基于git,所以本地需要安装Git,安装完成后在Git Bash中生成SSH key.

ssh-keygen -t rsa -C yourAccount
输入密码1234566

并将pub key保存到Gerrit账户下,如此在下面的配置中即可通过ssh拉取项目代码。


Gerrit

你以为这样就可以了吗?太年轻了。。。
Gerrit还需要额外在id_rsa所在目录下创建一个config文件,内容如下(IP隐藏掉了):

Host 120.26.54.1xx
        KexAlgorithms +diffie-hellman-group1-sha1

2.job配置

新建一个自由风格的项目,配置如图:

Git

需将刚才生成的id_rsa添加到jenkins的Credentials中

Credential

源码管理配置完成后,选择构建步骤Execute SonarQube Scanner,

Execute SonarQube Scanner

注:sonar.sources需要根据系统来使用不同的引用方式。

3.项目构建

完成配置后,点击立即构建,查看[Console Output],直到出现

INFO: EXECUTION SUCCESS

运行分析成功,稍等片刻点击SonarQube即可查看分析结果。

SonarQube

(二)iOS项目

iOS项目需要Objective-c基本环境,在windows本机sonar-runner是走不通了,需要一台mac,在网上查阅了几篇文章之后,实践步骤如下:

1.基础准备

ssh key

iOS源码放在码云,码云也是基于Git,不用再次安装,只需要将本地生成的pub key上传到码云的ssh 公钥即可。

码云

安装OCLint

#提示xcode需要更新到8.3,更新xcode到最新版本
brew tap oclint/formulae
brew install oclint    //挂代理
brew update   //不执行
brew upgrade oclint  //不执行

安装XCtool

#挂代理
brew install xctool  

安装gcovr

#挂代理
brew install gcovr  

安装xcpretty

sudo gem install xcpretty

配置开发者证书

找开发,证书安装/导入成功之后,在xcode中点击项目,在界面中编辑Identity,保证域名与Signing(release)一致,如:
Bundle Identifyier:com.dg11185.IPostCarService
Signing(release):zalQiyeDg11185_20161215_disv1
注:有文章指出无需配置开发者证书,只需在后面执行的编译命令中添加 -sdk iphonesimulator 参数指明以 Debug 方式构建即可。

配置sonar-runner

类似windows下的配置,下载解压,运行命令:

sudo chmod -R 777 /Users/dg11185_test/Downloads/

配置环境变量

vi /etc/profile

在文件末尾添加如下内容:

export SONAR_RUNNER_HOME=/Users/dg11185_test/Downloads/sonar-scanner-2.5/sonar-scanner-2.5
export PATH=$SONAR_RUNNER_HOME/bin:$PATH

退出terminal,运行sonar-runner -h验证。

2.生成oclint扫描结果文件

sonar-runner需要一个oclint的PMD格式扫描结果文件才能进行分析。
进入工程目录下,运行下列命令:

xcodebuild |xcpretty -r json-compilation-database
cp ./build/reports/compilation_db.json  compile_commands.json
oclint-json-compilation-database -e Pods -v -- -report-type pmd -o report.xml -max-priority-1=9999 -max-priority-2=9999 -max-priority-3=9999

3.配置文件

将代码clone到本地,在项目目录下新建sonar-project.properties,内容如下:

sonar.projectKey=car_iOS
sonar.projectName=car_iOS
sonar.projectVersion=1.0
sonar.language=objc
#sonar.projectDescription=Fake description
sonar.sources=IPostCarService
sonar.objectivec.project=IPostCarService.xcodeproj
#sonar.objectivec.workspace=IPostCarService.xcworkspace
sonar.objectivec.appScheme=IPostCarService
sonar.sourceEncoding=UTF-8
#上面生成的文件
sonar.objectivec.oclint.reportPath=report.xml
sonar.scm.enabled=false

4.运行sonar-runner -X

首次运行,提示:

com.B.A.A.B.A: No license for objc

查询后发现SonarCFamily这个插件需要license,商业软件,哎穷。
那就换个插件,将sonar-objective-c-plugin-0.5.0-SNAPSHOT.jar放在sonar的plugins文件夹下后重启服务。
再次运行scan-runner -X


运行结果

片刻后打开sonar,刷新页面看到扫描结果。

iOS

因为mac 笔记本连接的wifi没有固定IP,所以无法使用jenkins slave的方式进行集成,暂时只能手动编译运行然后在sonar上查看结果了。

(三)其它项目

1.Credential配置不同

我们的PHP和部分Java源码放在svn,因此jenkins需要安装Subversion插件,唯一不同的就是在添加Credential时,Kind选择Username with password,输入svn用户名和密码即可。

svnCredential

2.配置文件不同

有些项目比如web项目,包含java、javascript、HTML、CSS等多中语言,那配置文件如下:

sonar.projectKey=PHP_ALL
sonar.projectName=PHP_ALL
sonar.projectVersion=1.0  
sonar.sources=%WORKSPACE%
sonar.languages=web,php,js,css,less
sonar.sourceEncoding=UTF-8

这里有一个坑,我配置完成后手动构建,输出日志提示:

Caused by: org.tmatesoft.svn.core.SVNException: svn: E210004: Malformed network data

一看还以为是svn的问题,查询良久看日志、换插件版本、svn版本均无果,后来将sonar.languages=web,php,js,css,less中web和php顺序(我原来是php,web,js,css,less)调整了一下再次构建,成功,泪流满面。

四、结语

sonar通过集成不同插件来运行静态代码扫描确实给我们的代码找出了非常多的问题,后续还需要推动开发来针对结果中比较严重的问题进行改进和修复。
自定义规则方面,目前暂时通过部门的开发规范来修改sonar上对应的的代码规则,后续如果有好的实践就更第二篇。
对于文中内容如果有疑问或者错误的欢迎指正和交流。

五、软件下载

链接:http://pan.baidu.com/s/1o7Krtgu 密码:qc3w

六、参考

sonar:
http://www.cnblogs.com/winner-0715/p/5599350.html
http://www.linuxidc.com/Linux/2016-08/133879.htm
https://my.oschina.net/u/2306127/blog/541285
https://my.oschina.net/jiangbianwanghai/blog/478338 https://www.ibm.com/developerworks/cn/opensource/os-sonarqube/
https://my.oschina.net/jiangbianwanghai/blog/478935
https://my.oschina.net/jiangbianwanghai/blog/479285

jenkins集成:
http://www.cnblogs.com/mingshengling/p/5751299.html
http://www.linuxidc.com/Linux/2016-08/133877p2.htm https://www.ibm.com/developerworks/cn/devops/1612_qusm_jenkins/index.html

iOS:
https://testerhome.com/topics/7927
https://shengpan.net/auto-code-review/
http://blog.csdn.net/itfootball/article/details/45058591
http://ios.jobbole.com/85016/

推荐阅读更多精彩内容