一、前言
年初的時(shí)候部門各組都給出了自己的規(guī)范文檔脐供,包括部門工作規(guī)范浑塞、各語(yǔ)言開(kāi)發(fā)規(guī)范借跪、測(cè)試規(guī)范政己、數(shù)據(jù)庫(kù)規(guī)范、安全規(guī)范等等掏愁,然后各項(xiàng)規(guī)范的監(jiān)督和落實(shí)工作就落在測(cè)試組的頭上歇由。其中各個(gè)開(kāi)發(fā)語(yǔ)言的規(guī)范檢查這一項(xiàng)工作內(nèi)容就巨多,畢竟是一個(gè)沒(méi)有做個(gè)code review的部門果港,技術(shù)債務(wù)可想而知沦泌。根據(jù)我多年TesterHome的潛水經(jīng)驗(yàn),搭建一個(gè)sonar平臺(tái)就很有必要了辛掠。
二谢谦、平臺(tái)搭建
我這里用的是windows,文中用到的所有軟件都會(huì)在文末給出萝衩,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ā)生不必要的錯(cuò)誤千劈,選擇了全部安裝,但是安裝過(guò)程中提示缺少microsoft visual c++ 2013 runtime牌捷,結(jié)果mysql server沒(méi)裝上墙牌。
安裝完成microsoft visual c++ 2013 runtime后打開(kāi)MySql Notifyer涡驮,右鍵,actions---launch installer ---- add --- MySql Server一步一步安裝直到結(jié)束喜滨。
我局域網(wǎng)ip是192.183.3.11捉捅,創(chuàng)建了兩個(gè)數(shù)據(jù)庫(kù)管理員帳號(hào):
root 123456
sonarqube sonarqube
最后驗(yàn)證數(shù)據(jù)庫(kù)安裝和帳號(hào)是否創(chuàng)建成功,使用Navicat客戶端連接虽风,使用以上帳號(hào)連接成功即可锯梁。
sonarqube
1.服務(wù)架構(gòu)
遠(yuǎn)程客戶機(jī)可以通過(guò)各種不同的分析機(jī)制,將被分析的項(xiàng)目代碼上傳到 SonarQube server 并進(jìn)行代碼質(zhì)量的管理和分析,SonarQube 還會(huì)通過(guò) Web API 將分析的結(jié)果以可視化断国、可度量的方式展示給用戶配椭。
通過(guò)插件機(jī)制,Sonar可以集成不同的測(cè)試工具合敦,代碼分析工具,以及持續(xù)集成工具验游,比如pmd-cpd充岛、checkstyle、 findbugs耕蝉、Jenkins崔梗。通過(guò)不同的插件對(duì)這些結(jié)果進(jìn)行再加工處理,通過(guò)量化的方式度量代碼質(zhì)量的變化垒在,從而可以方便地對(duì)不同規(guī)模和種類的工程 進(jìn)行代碼質(zhì)量管理蒜魄。
通常可以采用三種不同的方法來(lái)發(fā)起代碼分析场躯,分別為 Analyzing with SonarQube Runner谈为、,Analyzing with SonarQube Ant Task 和 Analyzing with Maven 方法踢关。這三種方法的主要區(qū)別是 , 它們分別適用于不同架構(gòu)和組織形式的項(xiàng)目伞鲫,并且其相應(yīng)的配置文件的寫法也不盡相同。
本文采用的是SonarQube Runner的分析方式签舞。
2.創(chuàng)建數(shù)據(jù)庫(kù)
使用Navicat連接數(shù)據(jù)庫(kù)并在命令行中運(yùn)行:
create database sonarqube;
3.配置sonarqube
將官網(wǎng)下載的windows運(yùn)行包解壓后修改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ù)庫(kù)名、數(shù)據(jù)庫(kù)用戶名和密碼都是上面創(chuàng)建的儒搭。
4.啟動(dòng)sonarqube
雙擊\sonarqube-6.3.1\bin\windows-x86-64\StartSonar.bat啟動(dòng)(根據(jù)你的系統(tǒng)選擇)吠架,訪問(wèn)http://192.183.3.11:9000 ,出現(xiàn)如下界面即成功,啟動(dòng)過(guò)程數(shù)據(jù)庫(kù)初始化可能稍微有點(diǎn)慢师妙。如果需要更換端口的在sonar.properties文件中進(jìn)行修改诵肛。
啟動(dòng)成功后登錄,默認(rèn)帳號(hào)密碼都是admin,進(jìn)入配置--系統(tǒng)--更新中心--Avaliable搜索Chinese Pack安裝簡(jiǎn)體中文漢化包怔檩,安裝完成重啟褪秀。
5.安裝插件
以管理員身份登錄后,進(jìn)入配置--系統(tǒng)--更新中心--Avaliable搜索你需要安裝的插件薛训。需要注意的是有寫插件需要掛代理才能安裝成功媒吗。
sonar-runner(sonar-scanner)
SonarQube Runner是一個(gè)利用SonarQube服務(wù)端分析代碼的命令行工具,可以把它簡(jiǎn)單理解為客戶端乙埃。sonar-runner分析完成后會(huì)將數(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ù)庫(kù)帳號(hào)密碼
sonar.jdbc.username=sonarqube
sonar.jdbc.password=sonarqube
#----- MySQL 服務(wù)所在ip以及數(shù)據(jù)庫(kù)名
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;
驗(yàn)證環(huán)境變量配置
2.分析本地項(xiàng)目
使用sonar-runner分析項(xiàng)目非常方便,只要在項(xiàng)目工程目錄下新建sonar-project.properties文件介袜,內(nèi)容大致如下:
#key和name保持一致且在sonar下唯一
sonar.projectKey=car_android
sonar.projectName=car_android
#工程版本
sonar.projectVersion=1.0
#源代碼目錄
sonar.sources=src
#分析的語(yǔ)言
sonar.language=java
#編碼
sonar.sourceEncoding=UTF-8
之后在cmd下進(jìn)入工程目錄下運(yùn)行:sonar-runner -X
運(yùn)行最終結(jié)果顯示EXECUTION SUCCESS即成功甫何。稍候片刻打開(kāi)sonar查看所有項(xiàng)目看到剛剛分析的項(xiàng)目car_android。
三遇伞、項(xiàng)目實(shí)踐
(一)與jenkins集成
考慮到下載源碼辙喂,編輯sonar-project.properties配置文件,執(zhí)行sonnar-runner -X這些步驟都太過(guò)反復(fù)繁瑣鸠珠,果斷使用jenkins來(lái)完成這些工作巍耗。
下載并運(yùn)行jenkins,完成一些基礎(chǔ)配置渐排,這里就不細(xì)講了炬太,主要說(shuō)與sonar集成。
1.安裝[SonarQube Scanner for Jenkins]插件
進(jìn)入系統(tǒng)管理驯耻,插件管理中搜索[SonarQube Scanner for Jenkins]點(diǎn)擊安裝亲族。
2.插件配置
進(jìn)入系統(tǒng)管理--[Global Tool Configuration],找到[SonarQube Scanner],點(diǎn)擊新增吓歇,取消“自動(dòng)安裝”的勾選孽水,輸入系統(tǒng)安裝的sonnar-runner工作目錄票腰,完成后保存城看。
進(jìn)入系統(tǒng)管理--系統(tǒng)設(shè)置,找到SonarQube servers杏慰,輸入SonarQube servers的相關(guān)配置测柠。
這里的token需要在sonar的我的賬戶-安全里生成
到這里,插件配置完成缘滥。
(二)安卓項(xiàng)目
1.基礎(chǔ)準(zhǔn)備
我們的安卓源碼放在自己搭建的一個(gè)Gerrit私服上轰胁,我在jenkins上還安裝了Gerrit Trigger插件,結(jié)果目前都是手動(dòng)構(gòu)建朝扼。Gerrit是基于git赃阀,所以本地需要安裝Git,安裝完成后在Git Bash中生成SSH key.
ssh-keygen -t rsa -C yourAccount
輸入密碼1234566
并將pub key保存到Gerrit賬戶下擎颖,如此在下面的配置中即可通過(guò)ssh拉取項(xiàng)目代碼榛斯。
你以為這樣就可以了嗎观游?太年輕了。驮俗。懂缕。
Gerrit還需要額外在id_rsa所在目錄下創(chuàng)建一個(gè)config文件,內(nèi)容如下(IP隱藏掉了):
Host 120.26.54.1xx
KexAlgorithms +diffie-hellman-group1-sha1
2.job配置
新建一個(gè)自由風(fēng)格的項(xiàng)目王凑,配置如圖:
需將剛才生成的id_rsa添加到j(luò)enkins的Credentials中
源碼管理配置完成后搪柑,選擇構(gòu)建步驟Execute SonarQube Scanner,
注:sonar.sources需要根據(jù)系統(tǒng)來(lái)使用不同的引用方式索烹。
3.項(xiàng)目構(gòu)建
完成配置后工碾,點(diǎn)擊立即構(gòu)建,查看[Console Output]百姓,直到出現(xiàn)
INFO: EXECUTION SUCCESS
運(yùn)行分析成功倚喂,稍等片刻點(diǎn)擊SonarQube即可查看分析結(jié)果。
(二)iOS項(xiàng)目
iOS項(xiàng)目需要Objective-c基本環(huán)境瓣戚,在windows本機(jī)sonar-runner是走不通了端圈,需要一臺(tái)mac,在網(wǎng)上查閱了幾篇文章之后子库,實(shí)踐步驟如下:
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
配置開(kāi)發(fā)者證書
找開(kāi)發(fā),證書安裝/導(dǎo)入成功之后仓技,在xcode中點(diǎn)擊項(xiàng)目鸵贬,在界面中編輯Identity,保證域名與Signing(release)一致脖捻,如:
Bundle Identifyier:com.dg11185.IPostCarService
Signing(release):zalQiyeDg11185_20161215_disv1
注:有文章指出無(wú)需配置開(kāi)發(fā)者證書阔逼,只需在后面執(zhí)行的編譯命令中添加 -sdk iphonesimulator 參數(shù)指明以 Debug 方式構(gòu)建即可。
配置sonar-runner
類似windows下的配置地沮,下載解壓嗜浮,運(yùn)行命令:
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,運(yùn)行sonar-runner -h驗(yàn)證摩疑。
2.生成oclint掃描結(jié)果文件
sonar-runner需要一個(gè)oclint的PMD格式掃描結(jié)果文件才能進(jìn)行分析危融。
進(jìn)入工程目錄下,運(yù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到本地雷袋,在項(xiàng)目目錄下新建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.運(yùn)行sonar-runner -X
首次運(yùn)行,提示:
com.B.A.A.B.A: No license for objc
查詢后發(fā)現(xiàn)SonarCFamily這個(gè)插件需要license,商業(yè)軟件蛋勺,哎窮速侈。
那就換個(gè)插件,將sonar-objective-c-plugin-0.5.0-SNAPSHOT.jar放在sonar的plugins文件夾下后重啟服務(wù)迫卢。
再次運(yùn)行scan-runner -X
片刻后打開(kāi)sonar倚搬,刷新頁(yè)面看到掃描結(jié)果。
因?yàn)閙ac 筆記本連接的wifi沒(méi)有固定IP乾蛤,所以無(wú)法使用jenkins slave的方式進(jìn)行集成每界,暫時(shí)只能手動(dòng)編譯運(yùn)行然后在sonar上查看結(jié)果了。
(三)其它項(xiàng)目
1.Credential配置不同
我們的PHP和部分Java源碼放在svn家卖,因此jenkins需要安裝Subversion插件眨层,唯一不同的就是在添加Credential時(shí),Kind選擇Username with password上荡,輸入svn用戶名和密碼即可趴樱。
2.配置文件不同
有些項(xiàng)目比如web項(xiàng)目,包含java酪捡、javascript叁征、HTML、CSS等多中語(yǔ)言逛薇,那配置文件如下:
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è)坑捺疼,我配置完成后手動(dòng)構(gòu)建,輸出日志提示:
Caused by: org.tmatesoft.svn.core.SVNException: svn: E210004: Malformed network data
一看還以為是svn的問(wèn)題永罚,查詢良久看日志啤呼、換插件版本、svn版本均無(wú)果呢袱,后來(lái)將sonar.languages=web,php,js,css,less中web和php順序(我原來(lái)是php官扣,web,js,css,less)調(diào)整了一下再次構(gòu)建,成功羞福,淚流滿面惕蹄。
四、結(jié)語(yǔ)
sonar通過(guò)集成不同插件來(lái)運(yùn)行靜態(tài)代碼掃描確實(shí)給我們的代碼找出了非常多的問(wèn)題坯临,后續(xù)還需要推動(dòng)開(kāi)發(fā)來(lái)針對(duì)結(jié)果中比較嚴(yán)重的問(wèn)題進(jìn)行改進(jìn)和修復(fù)焊唬。
自定義規(guī)則方面,目前暫時(shí)通過(guò)部門的開(kāi)發(fā)規(guī)范來(lái)修改sonar上對(duì)應(yīng)的的代碼規(guī)則看靠,后續(xù)如果有好的實(shí)踐就更第二篇。
對(duì)于文中內(nèi)容如果有疑問(wèn)或者錯(cuò)誤的歡迎指正和交流液肌。
五挟炬、軟件下載
鏈接: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/