Jenkins 集成sonar 可以提供一個dashboard給項目成員和管理者,提供一個一目瞭然的項目分析情況,Sonar在代碼分析是非常有用的工具。下面就具體說說如何進行集成。
一、實踐目標
1、安裝和配置sonar
2、與Jenkins 集成
3、通過某個具體工程項目來呈現sonar分析結果
二、環境準備
1、Jenkins 環境: 部署在192.168.136.144 centos6.5
2、mysql: 5.6.33: 部署在 192.168.136.144
3、 sonargube 和 sonar scanner 部署在192.168.136.144
4、 jdk: 1.8 (因爲高版本的jenkins和sonar 都要求1.8)
三、安裝sonar
1、下載sonar
通過sonar的下載鏈接,我們可以下載最新的sonar 6.5版本,下載url爲:https://www.sonarqube.org/downloads/
下載的版本爲:sonarqube-6.5.zip,並把它部署到192.168.136.144 的 /opt 目錄下。
2、mysql中創建數據庫
在mysql中創建sonar的數據庫:
MySQL> CREATE USER 'sonar'@'%' IDENTIFIED BY 'sonar123';
MySQL> CREATE DATABASE sonar CHARACTER SET UTF8;
MySQL> GRANT ALL PRIVILEGES ON sonar.* TO 'sonar'@'%';
上面主要做的事情就是:爲sonar 創建一個數據庫和使用這個數據庫的用戶,並進行授權
3、修改sonar 的相關配置
首先修改:/opt/sonarqube-6.5/conf/sonar.properties 中的java啓動參數和數據庫連接信息
sonar.web.javaOpts=-Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar123
sonar.jdbc.url=jdbc:mysql://192.168.136.144:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.web.context=/sonar
sonar.web.host=0.0.0.0
sonar.web.port=9000
4、啓動和停止命令
由於sonar部署包裏面爲了各種系統準備了啓動腳本,所以我們可以根據系統情況,做一個軟鏈接到sonar的根目錄:
通過 ln -s bin/linux-x86-64/sonar.sh sonar.sh 建立一個軟鏈接
[root@cwqsolo sonarqube-6.5]# ln -s bin/linux-x86-64/sonar.sh sonar.sh
[root@cwqsolo sonarqube-6.5]# ls -ltr
total 40
-rw-r--r-- 1 root root 7651 Jul 31 21:00 COPYING
drwxr-xr-x 8 root root 4096 Oct 4 06:44 bin
drwxr-xr-x 2 root root 4096 Oct 4 06:44 data
drwxr-xr-x 4 root root 4096 Oct 4 06:44 extensions
drwxr-xr-x 10 root root 4096 Oct 4 06:44 lib
drwxr-xr-x 2 root root 4096 Oct 4 06:44 logs
drwxr-xr-x 2 root root 4096 Oct 4 06:44 temp
drwxr-xr-x 9 root root 4096 Oct 4 06:44 web
drwxr-xr-x 2 root root 4096 Oct 4 06:56 conf
lrwxrwxrwx 1 root root 25 Oct 4 07:00 sonar.sh -> bin/linux-x86-64/sonar.sh
[root@cwqsolo sonarqube-6.5]#
通過上述部署, 在sonar部署目錄下,啓動和停止簡化爲:
sonar.sh stop
sonar.sh start
sonar.sh restart
#控制檯啓動
sonar.sh console
## 查看日誌
tail -f ./logs/sonar.log
sonar 6需要java 1.8 版本的支持,否則會報告如下錯誤
在部署了java 1.8 之後,日誌打印正常。說明如果環境中有多個java版本,並且缺省java 不是 jdk 1.8 怎麼辦呢? 可以通過修改 conf/wrapper.conf 中的屬性
wrapper.conf:wrapper.java.command=java
通過修改“java”來設置1.8版本的jdk,如通過下面方式:
wrapper.conf:wrapper.java.command=/usr/java/jdk1.8.0_112/jre/bin/java
5、啓動sonar
通過命令( ./sonar.sh start),就可以用url: http://192.168.136.144:9000/sonar/ 來訪問sonargube服務了。 缺省賬號密碼 admin / admin
下面首先把sonar 中文漢化一下,從 https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases 上,下載 sonar-l10n-zh-plugin-1.17.jar,將這個插件,部署到/opt/sonarqube-6.5/extensions/plugins。 在sonar部署目錄裏面, 通過 ./sonar.sh restart 重啓後,就可以看到中文界面了。
也可以通過administration-》system-》update 找到中文包,進行安裝:
中文安裝好後,重新打開sonar的界面,是這樣的,清楚多了:
6 安裝 sonar-scanner
安裝完成sonargube 服務後,還需要安裝一個分析工具,可以用runner 或者scanner ,本文采用scanner ,它與sonargube的關係可以大致理解爲客戶端和服務端。
首先通過下面的url下載scanner2.8版本: https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-2.8.zip 並解壓部署到 /opt目錄下,完成後如下所示:
[root@cwqsolo opt]# ls -ltr
total 20
drwxr-xr-x. 2 root root 4096 Nov 22 2013 rh
drwxr-xr-x 4 root root 4096 Nov 6 2016 cloudera
drwxr-xr-x 3 root root 4096 Nov 9 2016 remi
drwxr-xr-x 10 root root 4096 Oct 4 07:23 sonarqube-6.5
drwxr-xr-x 5 root root 4096 Oct 5 00:56 sonar-scanner-2.8
[root@cwqsolo opt]#
進入 scanner 目錄,並進入conf 目錄,修改sonar-scanner.properties 文件,與sonar前面的設置一致:
sonar.host.url=http://192.168.136.144:9000
sonar.login=admin
sonar.password=admin
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar123
sonar.jdbc.url=jdbc:mysql://192.168.136.144:3306/sonar?useUnicode=true&characterEncoding=utf8
修改系統環境變量中/etc/profile 中的設置,在文件最後添加下面內容:
PATH=$PATH:/opt/sonar-scanner-2.8/bin
export PATH
通過以下命令進行啓動
sonar-scanner -h
啓動正確後,可以看到如下界面:
scanner在於jenkins 進行集成的作用是:jenkins通過scanner傳入要分析的工程,scanner再將這些分析結果,傳給sonargube 進行呈現
四、在jenkins中配置sonar
1、jenkins中sonar插件的安裝
網頁上大部分都是在插件管理裏,可以找到sonarqube plugin,好吧,有點衰,我的jenkins插件管理裏面找不到這個插件,於是我只好採用phi 文件安裝方式:
首先去這個url下載phi文件: http://updates.jenkins-ci.org/latest/sonar.hpi 這個是sonar最新插件,需要jenkins 2.6以上版本,可憐只好升級了一把jenkins。
準備好hpi文件,並升級jenkins,重啓後,進入jenkins:
jenkins -》插件管理-》高級
點擊上傳,又是小等待後,重啓。
2、配置 sonarqube server
現在在進入jenkins-》系統管理-》系統配置後,就可以出現配置sonarqube server的地方了
3、 配置sonar scanner
由於上面我們已經安裝了scanner,所以這裏可以配置一下,不需要選擇自動安裝
4、修改scanner參數
配置完成後,進入工程,需要進行配置下面幾個sonar scanner參數:
尤其需要注意紅框中的內容,低版不需要關注,但是高版本需要填寫,否則scanner 會報錯
5、執行構建
如果一切順利,構建後顯示本次構建爲藍色(成功),點開 sonarQube 就可以看到代碼分析工具給出的結果:
最後通過SonarQube 來展現分析的結果:
五、異常
最後:總結一下各種坑
1、sonar.java.binaries property 屬性錯誤
高版本的sonar 會報告如下錯誤:Please provide compiled classes of your project with sonar.java.binaries property
解決辦法:
在jenkins構建配置中, 加入此參數如:
sonar.java.binaries=WebRoot/WEB-INF/classes
如果有多個目錄,用逗號隔開
2、scanner 報告 SVN錯誤
INFO: ------------------------------------------------------------------------
ERROR: Error during SonarQube Scanner execution
java.lang.IllegalStateException: Error when executing blame for file src/com/cyrx/webapp/action/CommonController.java
at org.sonar.plugins.scm.svn.SvnBlameCommand.blame(SvnBlameCommand.java:86)
at org.sonar.plugins.scm.svn.SvnBlameCommand.blame(SvnBlameCommand.java:59)
at org.sonar.scanner.scm.ScmPublisher.publish(ScmPublisher.java:82)
at org.sonar.scanner.phases.PublishPhaseExecutor.afterSensors(PublishPhaseExecutor.java:59)
解決:
打開sonarqube的控制檯,使用admin登錄後 ,在配置->SCM->菜單中,將Disabled the SCM Sensor設置爲true,