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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,360评论 5 461
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,195评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,543评论 0 323
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,420评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,242评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,224评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,626评论 3 384
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,301评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,589评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,660评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,423评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,286评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,662评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,951评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,237评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,613评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,804评论 2 335

推荐阅读更多精彩内容