一、前言
年初的時候部門各組都給出了自己的規(guī)范文檔,包括部門工作規(guī)范、各語言開發(fā)規(guī)范、測試規(guī)范、數(shù)據(jù)庫規(guī)范、安全規(guī)范等等,然后各項規(guī)范的監(jiān)督和落實工作就落在測試組的頭上。其中各個開發(fā)語言的規(guī)范檢查這一項工作內(nèi)容就巨多,畢竟是一個沒有做個code review的部門,技術(shù)債務(wù)可想而知。根據(jù)我多年TesterHome的潛水經(jīng)驗,搭建一個sonar平臺就很有必要了。
二、平臺搭建
我這里用的是windows,文中用到的所有軟件都會在文末給出,linux操作系統(tǒng)的就看看配置吧。
基礎(chǔ)環(huán)境
1.JDK
下載安裝最新版JDK,并配置環(huán)境變量:
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,但是我為了避免發(fā)生不必要的錯誤,選擇了全部安裝,但是安裝過程中提示缺少microsoft visual c++ 2013 runtime,結(jié)果mysql server沒裝上。
安裝完成microsoft visual c++ 2013 runtime后打開MySql Notifyer,右鍵,actions---launch installer ---- add --- MySql Server一步一步安裝直到結(jié)束。
我局域網(wǎng)ip是192.183.3.11,創(chuàng)建了兩個數(shù)據(jù)庫管理員帳號:
root 123456
sonarqube sonarqube
最后驗證數(shù)據(jù)庫安裝和帳號是否創(chuàng)建成功,使用Navicat客戶端連接,使用以上帳號連接成功即可。
sonarqube
1.服務(wù)架構(gòu)

遠(yuǎn)程客戶機(jī)可以通過各種不同的分析機(jī)制,將被分析的項目代碼上傳到 SonarQube server 并進(jìn)行代碼質(zhì)量的管理和分析,SonarQube 還會通過 Web API 將分析的結(jié)果以可視化、可度量的方式展示給用戶。
通過插件機(jī)制,Sonar可以集成不同的測試工具,代碼分析工具,以及持續(xù)集成工具,比如pmd-cpd、checkstyle、 findbugs、Jenkins。通過不同的插件對這些結(jié)果進(jìn)行再加工處理,通過量化的方式度量代碼質(zhì)量的變化,從而可以方便地對不同規(guī)模和種類的工程 進(jìn)行代碼質(zhì)量管理。
通??梢圆捎萌N不同的方法來發(fā)起代碼分析,分別為 Analyzing with SonarQube Runner、,Analyzing with SonarQube Ant Task 和 Analyzing with Maven 方法。這三種方法的主要區(qū)別是 , 它們分別適用于不同架構(gòu)和組織形式的項目,并且其相應(yīng)的配置文件的寫法也不盡相同。
本文采用的是SonarQube Runner的分析方式。
2.創(chuàng)建數(shù)據(jù)庫
使用Navicat連接數(shù)據(jù)庫并在命令行中運行:
create database sonarqube;
3.配置sonarqube
將官網(wǎng)下載的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、數(shù)據(jù)庫名、數(shù)據(jù)庫用戶名和密碼都是上面創(chuàng)建的。
4.啟動sonarqube
雙擊\sonarqube-6.3.1\bin\windows-x86-64\StartSonar.bat啟動(根據(jù)你的系統(tǒng)選擇),訪問http://192.183.3.11:9000 ,出現(xiàn)如下界面即成功,啟動過程數(shù)據(jù)庫初始化可能稍微有點慢。如果需要更換端口的在sonar.properties文件中進(jìn)行修改。
啟動成功后登錄,默認(rèn)帳號密碼都是admin,進(jìn)入配置--系統(tǒng)--更新中心--Avaliable搜索Chinese Pack安裝簡體中文漢化包,安裝完成重啟。

5.安裝插件
以管理員身份登錄后,進(jìn)入配置--系統(tǒng)--更新中心--Avaliable搜索你需要安裝的插件。需要注意的是有寫插件需要掛代理才能安裝成功。


sonar-runner(sonar-scanner)
SonarQube Runner是一個利用SonarQube服務(wù)端分析代碼的命令行工具,可以把它簡單理解為客戶端。sonar-runner分析完成后會將數(shù)據(jù)post到sonarqube進(jìn)行展示。
1.配置
將下載好的sonar-scanner-2.5解壓編輯其中的conf\sonar-runner.properties文件:
#----- Default SonarQube server SonarQube 服務(wù)器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+) 數(shù)據(jù)庫帳號密碼
sonar.jdbc.username=sonarqube
sonar.jdbc.password=sonarqube
#----- MySQL 服務(wù)所在ip以及數(shù)據(jù)庫名
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8
將sonar-runner配置到系統(tǒng)環(huán)境變量:
新建系統(tǒng)環(huán)境變量SONAR_RUNNER_HOME=your\sonar\path\sonar-scanner-2.5\sonar-scanner-2.5
在path中添加:%SONAR_RUNNER_HOME%\bin;
驗證環(huán)境變量配置

2.分析本地項目
使用sonar-runner分析項目非常方便,只要在項目工程目錄下新建sonar-project.properties文件,內(nèi)容大致如下:
#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下進(jìn)入工程目錄下運行:sonar-runner -X

運行最終結(jié)果顯示EXECUTION SUCCESS即成功。稍候片刻打開sonar查看所有項目看到剛剛分析的項目car_android。

三、項目實踐
(一)與jenkins集成
考慮到下載源碼,編輯sonar-project.properties配置文件,執(zhí)行sonnar-runner -X這些步驟都太過反復(fù)繁瑣,果斷使用jenkins來完成這些工作。
下載并運行jenkins,完成一些基礎(chǔ)配置,這里就不細(xì)講了,主要說與sonar集成。
1.安裝[SonarQube Scanner for Jenkins]插件
進(jìn)入系統(tǒng)管理,插件管理中搜索[SonarQube Scanner for Jenkins]點擊安裝。
2.插件配置
進(jìn)入系統(tǒng)管理--[Global Tool Configuration],找到[SonarQube Scanner],點擊新增,取消“自動安裝”的勾選,輸入系統(tǒng)安裝的sonnar-runner工作目錄,完成后保存。

進(jìn)入系統(tǒng)管理--系統(tǒng)設(shè)置,找到SonarQube servers,輸入SonarQube servers的相關(guān)配置。

這里的token需要在sonar的我的賬戶-安全里生成

到這里,插件配置完成。
(二)安卓項目
1.基礎(chǔ)準(zhǔn)備
我們的安卓源碼放在自己搭建的一個Gerrit私服上,我在jenkins上還安裝了Gerrit Trigger插件,結(jié)果目前都是手動構(gòu)建。Gerrit是基于git,所以本地需要安裝Git,安裝完成后在Git Bash中生成SSH key.
ssh-keygen -t rsa -C yourAccount
輸入密碼1234566
并將pub key保存到Gerrit賬戶下,如此在下面的配置中即可通過ssh拉取項目代碼。

你以為這樣就可以了嗎?太年輕了。。。
Gerrit還需要額外在id_rsa所在目錄下創(chuàng)建一個config文件,內(nèi)容如下(IP隱藏掉了):
Host 120.26.54.1xx
KexAlgorithms +diffie-hellman-group1-sha1
2.job配置
新建一個自由風(fēng)格的項目,配置如圖:

需將剛才生成的id_rsa添加到j(luò)enkins的Credentials中

源碼管理配置完成后,選擇構(gòu)建步驟Execute SonarQube Scanner,

注:sonar.sources需要根據(jù)系統(tǒng)來使用不同的引用方式。
3.項目構(gòu)建
完成配置后,點擊立即構(gòu)建,查看[Console Output],直到出現(xiàn)
INFO: EXECUTION SUCCESS
運行分析成功,稍等片刻點擊SonarQube即可查看分析結(jié)果。

(二)iOS項目
iOS項目需要Objective-c基本環(huán)境,在windows本機(jī)sonar-runner是走不通了,需要一臺mac,在網(wǎng)上查閱了幾篇文章之后,實踐步驟如下:
1.基礎(chǔ)準(zhǔn)備
ssh key
iOS源碼放在碼云,碼云也是基于Git,不用再次安裝,只需要將本地生成的pub key上傳到碼云的ssh 公鑰即可。

安裝OCLint
#提示xcode需要更新到8.3,更新xcode到最新版本
brew tap oclint/formulae
brew install oclint //掛代理
brew update //不執(zhí)行
brew upgrade oclint //不執(zhí)行
安裝XCtool
#掛代理
brew install xctool
安裝gcovr
#掛代理
brew install gcovr
安裝xcpretty
sudo gem install xcpretty
配置開發(fā)者證書
找開發(fā),證書安裝/導(dǎo)入成功之后,在xcode中點擊項目,在界面中編輯Identity,保證域名與Signing(release)一致,如:
Bundle Identifyier:com.dg11185.IPostCarService
Signing(release):zalQiyeDg11185_20161215_disv1
注:有文章指出無需配置開發(fā)者證書,只需在后面執(zhí)行的編譯命令中添加 -sdk iphonesimulator 參數(shù)指明以 Debug 方式構(gòu)建即可。
配置sonar-runner
類似windows下的配置,下載解壓,運行命令:
sudo chmod -R 777 /Users/dg11185_test/Downloads/
配置環(huán)境變量
vi /etc/profile
在文件末尾添加如下內(nèi)容:
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掃描結(jié)果文件
sonar-runner需要一個oclint的PMD格式掃描結(jié)果文件才能進(jìn)行分析。
進(jìn)入工程目錄下,運行下列命令:
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,內(nèi)容如下:
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
查詢后發(fā)現(xiàn)SonarCFamily這個插件需要license,商業(yè)軟件,哎窮。
那就換個插件,將sonar-objective-c-plugin-0.5.0-SNAPSHOT.jar放在sonar的plugins文件夾下后重啟服務(wù)。
再次運行scan-runner -X

片刻后打開sonar,刷新頁面看到掃描結(jié)果。

因為mac 筆記本連接的wifi沒有固定IP,所以無法使用jenkins slave的方式進(jìn)行集成,暫時只能手動編譯運行然后在sonar上查看結(jié)果了。
(三)其它項目
1.Credential配置不同
我們的PHP和部分Java源碼放在svn,因此jenkins需要安裝Subversion插件,唯一不同的就是在添加Credential時,Kind選擇Username with password,輸入svn用戶名和密碼即可。

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
這里有一個坑,我配置完成后手動構(gòu)建,輸出日志提示:
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)調(diào)整了一下再次構(gòu)建,成功,淚流滿面。
四、結(jié)語
sonar通過集成不同插件來運行靜態(tài)代碼掃描確實給我們的代碼找出了非常多的問題,后續(xù)還需要推動開發(fā)來針對結(jié)果中比較嚴(yán)重的問題進(jìn)行改進(jìn)和修復(fù)。
自定義規(guī)則方面,目前暫時通過部門的開發(fā)規(guī)范來修改sonar上對應(yīng)的的代碼規(guī)則,后續(xù)如果有好的實踐就更第二篇。
對于文中內(nèi)容如果有疑問或者錯誤的歡迎指正和交流。
五、軟件下載
鏈接: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/