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

一、前言

年初的時候部門各組都給出了自己的規(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)

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


sonar-runner

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

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

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


SonarQube Scanner

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

SonarQube servers

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

sonarToken

到這里,插件配置完成。

(二)安卓項目

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

你以為這樣就可以了嗎?太年輕了。。。
Gerrit還需要額外在id_rsa所在目錄下創(chuàng)建一個config文件,內(nèi)容如下(IP隱藏掉了):

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

2.job配置

新建一個自由風(fēng)格的項目,配置如圖:

Git

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

Credential

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

Execute SonarQube Scanner

注:sonar.sources需要根據(jù)系統(tǒng)來使用不同的引用方式。

3.項目構(gòu)建

完成配置后,點擊立即構(gòu)建,查看[Console Output],直到出現(xiàn)

INFO: EXECUTION SUCCESS

運行分析成功,稍等片刻點擊SonarQube即可查看分析結(jié)果。

SonarQube

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


運行結(jié)果

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

iOS

因為mac 筆記本連接的wifi沒有固定IP,所以無法使用jenkins slave的方式進(jìn)行集成,暫時只能手動編譯運行然后在sonar上查看結(jié)果了。

(三)其它項目

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

這里有一個坑,我配置完成后手動構(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/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容