sonarqube代碼質(zhì)量管理平臺(tái)環(huán)境搭建及實(shí)踐(一)

一、前言

年初的時(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)

服務(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)體中文漢化包怔檩,安裝完成重啟褪秀。

首頁(yè)

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)境變量配置


sonar-runner

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é)果

運(yùn)行最終結(jié)果顯示EXECUTION SUCCESS即成功甫何。稍候片刻打開(kāi)sonar查看所有項(xiàng)目看到剛剛分析的項(xiàng)目car_android。

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工作目錄票腰,完成后保存城看。


SonarQube Scanner

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

SonarQube servers

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

sonarToken

到這里,插件配置完成缘滥。

(二)安卓項(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

你以為這樣就可以了嗎观游?太年輕了。驮俗。懂缕。
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)目王凑,配置如圖:

Git

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

Credential

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

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é)果。

SonarQube

(二)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


運(yùn)行結(jié)果

片刻后打開(kāi)sonar倚搬,刷新頁(yè)面看到掃描結(jié)果。

iOS

因?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用戶名和密碼即可趴樱。

svnCredential

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/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谤祖,隨后出現(xiàn)的幾起案子婿滓,更是在濱河造成了極大的恐慌,老刑警劉巖粥喜,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凸主,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡额湘,警方通過(guò)查閱死者的電腦和手機(jī)卿吐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锋华,“玉大人嗡官,你說(shuō)我怎么就攤上這事√夯溃” “怎么了衍腥?”我有些...
    開(kāi)封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)纳猫。 經(jīng)常有香客問(wèn)我婆咸,道長(zhǎng),這世上最難降的妖魔是什么芜辕? 我笑而不...
    開(kāi)封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任擅耽,我火速辦了婚禮,結(jié)果婚禮上物遇,老公的妹妹穿的比我還像新娘乖仇。我一直安慰自己,他們只是感情好询兴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布乃沙。 她就那樣靜靜地躺著,像睡著了一般诗舰。 火紅的嫁衣襯著肌膚如雪警儒。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天眶根,我揣著相機(jī)與錄音蜀铲,去河邊找鬼。 笑死属百,一個(gè)胖子當(dāng)著我的面吹牛记劝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播族扰,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼厌丑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼定欧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起怒竿,我...
    開(kāi)封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤砍鸠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后耕驰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體爷辱,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年朦肘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饭弓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厚骗,死狀恐怖示启,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情领舰,我是刑警寧澤夫嗓,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站冲秽,受9級(jí)特大地震影響舍咖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锉桑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一排霉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧民轴,春花似錦攻柠、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至微驶,卻和暖如春浪谴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背因苹。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工苟耻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扶檐。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓凶杖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蘸秘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子官卡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容