Jenkins與Sonar整合
背景
隨著程式碼量的增多,服務模組的拆分,程式碼越來越難進行管理,質量與效率這一對矛盾體將凸顯出來,就希望將程式碼質量管理的模式由原來人為主動控制轉變成為由自動化工具檢測,人被動接收通知,並且相關資料沉澱下來。Jenkins
大家都熟知是用來自動化單元測試、編譯、打包及部署的,挺好用的。
基於另外一個出發點,針對程式碼規範,相信大家或多或少的瞭解過阿里巴巴開源的編碼規範,看過就忘記了,在開發過程中,常常由於時間進度緊沒能很好的執行,但程式真正執行起來出現問題往往都是這些潛在的問題與壞味道導致的,如果有一種工具能夠將這些規則固化到日常開發流程中去,利用工具倒逼著自己提前考慮這些問題,那將大大的提高軟體質量,也充當了一部分程式碼走讀的功能,另一方面也能夠將自己的知識結構更加系統化的鍛鍊,Sonar
本文件描述不清晰或者關於這兩款工具軟體其它功能的最佳實踐,還望各位指正。
依賴及版本說明
Jenkins
版本2.107.3
下載地址,我這裡是下載的.war
包形式Sonar
版本7.1
下載地址,我這裡下載的是Latest Release
版本JDK 1.8+
與Mysql 5.6+
這就不多說Maven 3.2.1
Jenkins
因為下載的是.war
包形式,也不存在其它的安裝步驟,直接執行命令java -jar jenkins.war
即可將其跑起來,它將所有需要的資原始檔都放在了這裡,好方便,預設執行的埠是8080,多數情況下這個埠都會被佔用,具體改法下面會講到。大家可能都知道jenkins
Maven Integration plugin
,Cobertura Plugin
,SonarQube Scanner for Jenkins
等等,如果公司的機器能夠上網,安裝這些外掛都不是問題,本公司的網路環境有限,只有少部分機器能夠上網,在這過程中遇到不少麻煩,因為如果將war
包轉移到另外一臺新的機器上時,它又是重新初始化,必須初步瞭解它的執行機制與目錄結構,解決方法見下。
目錄結構
jenkins.war
包相當於它的執行主體程式,放在任意目錄都可以/root/.jenkins
目錄相當於它的執行時目錄,包括配置、外掛、工作空間、日誌、節點、任務等重要資訊目錄,基本上看這個目錄就夠了,/root
alice
使用者,那目錄將變成/alice/.jenkins
Jenkins使用
程式執行起來後,瀏覽器訪問http://IP:8080
進入初臺化介面如下,首先會出現一個解鎖的頁面,按照提示的密碼檔案路徑獲取密碼,將密碼填入後下一步進入系統,進入後進行admin初始密碼的修改。
成功進入主介面如下,具體相關的功能不再一一介紹,關於系統的配置功能均在系統管理
中。
相關技巧
- 如何進行離線安裝
離線安裝一般有如下兩種方式
下載外掛檔案
xxx.hpi
,從外掛官網下載對應的外掛檔案,然後在系統管理
->外掛管理
->高階
中手動上傳外掛,如下圖所示
利用能夠上網的機器將所需要的外掛線上安裝好,然後將
/root/.jenkins
目錄下全部打包至不能上網的機器對應目錄下,重啟jenkins
服務
- 如何修改預設啟動埠8080
執行命令java -jar jenkins.war --httpPort=8090
可對當前啟動生效,但如果機器重啟或將jenkins
做成系統服務怎麼辦,因為它本身沒有提供配置檔案修改,需要自己將埠寫入環境變數,然後讀取環境變數進行實現。
Sonar
介紹
Sonar
是一個用於程式碼質量管理的開源平臺,用於管理Java
原始碼的質量。通過外掛機制,它 可以整合不同的測試工具,程式碼分析工具,以及持續整合工具,比如checkstyle
、findbugs
、Jenkins
。通過不同的外掛對這些結果進行再加工處理,通過量化的方式度量程式碼質量的變化,從而可以方便地對不同規模和種類的工程進行程式碼質量管理。同時它還對大量的持續整合工具提供了介面支援,可以很方便地在持續整合中使用它。此外,它的外掛還可以對 Java
以外的其他程式語言提供支援,對國際化以及報告文件化也有良好的支援。可以說是目前最強大的程式碼質量管理工具之一。
它的主要作用如下:
- 檢查程式碼是否遵循程式設計標準:如命名規範,編寫的規範等
- 檢查設計存在的潛在缺陷:
SonarQube
通過外掛Findbugs
、Checkstyle
等工具檢測程式碼存在的缺陷 - 檢測程式碼的重複程式碼量:
SonarQube
可以展示專案中存在大量複製貼上的程式碼 - 檢測程式碼中註釋的程度:原始碼註釋過多或者太少都不好,影響程式的可讀可理解性
- 檢測程式碼中包、類之間的關係:分析類之間的關係是否合理,複雜度情況
安裝
配置資料庫
Sonar
執行需要使用到資料庫,它會將規則、使用者、分析結果儲存在資料庫,需要執行以下語句進行資料庫的初始化,其中的相關表是在程式啟動初始化時建立的。
CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'sonar' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
FLUSH PRIVILEGES;
配置Sonar
因為Sonar
在執行過程中使用了elasticsearch
資料庫,但它不能使用root
使用者啟動,檢查當前是否為root
使用者,如果是則切換至sonar
使用者。
將下載好的安裝包sonarqube-7.1.zip
賦予sonar
使用者許可權,執行命令chown sonar:sonar sonarqube-7.1.zip
,然後解壓。
解壓後進入conf
配置目錄,修改sonar.properties
檔案,如下配置預設均是註釋掉的。
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
啟動
進入bin
啟動目錄,該目錄下根據作業系統與位數的不同而區分有不同的目錄,這裡選擇的是linux-x86-64
,進入後執行命令./sonar.sh start
啟動。
啟動過程的相關日誌存放在與bin
目錄平級的logs
目錄下。
Sonar漢化
Sonar
預設的語言是英文的,看起來不是那麼方便,社群也提供了漢化版的外掛下載地址
下載完成將外掛放到\extensions\plugins
,重啟sonar
即可。
Sonar使用
sonar
高版本相比低版本發生了一個變化,以前低版本與外部介面使用使用者名稱與密碼,高版本則使用生成的token
,在初始化過程中會提示你輸入一個使用者名稱,然後生成token
,這個值就是以後與maven
及jenkins
整合時的介面憑證,當然也可以跳過,後面再生成。
瀏覽器訪問http://IP:9000
進入主介面,如下圖所示,具體相關功能不一一細講。
自定義程式碼審查規則
自定義程式碼審查規則是根據每個公司的編碼規範形成的,拿java
來說預設有許多,但不一定都需要滿足,這個後續再研究。
Jenkins整合Sonar
在前面jenkins
中該裝的外掛都裝了,接下來通過新建一個任務來實現,對svn
路徑下的專案實現編譯打包,程式碼規範檢查,質量統計分析整個流程。
jenkins
與sonar
整合有兩種方式,一種是在Post Steps
過程中使用SonarQube Scanner
分析,二是在構建後操作中使用SonarQube analysis with Maven
,相當於呼叫了maven
的外掛與sonar
整合。這裡使用的是第二種方式進行驗證實現。
全域性工具配置,包括
jdk
與maven
的配置,在系統管理
->全域性工具配置
,如下圖所示
新建任務,輸入任務名稱,選擇專案型別,這裡選擇
maven
專案
任務配置,任務配置如下所示,裡面提供了很多過程階段,像原始碼管理、構建觸發器、構建環境、Pre Steps、Build、Post Steps、構建設定及構建後操作,這裡我使用到了原始碼管理、構建觸發器、Build與構建後操作四個過程
原始碼管理,主要是指定原始碼下載的路徑,一般為
SVN
,但需要配置SVN
的使用者名稱與密碼,在右側Credentials
功能採單中新增全域性的帳戶資訊
構建觸發器,指定任務觸發的機制,視情況而定,我這裡是週期性的,規則跟
cron
形式一致
Build 指定了編譯的根檔案以及編譯的命令
構建後操作,指定了使用
maven
外掛整合sonar
,當然前提是得先配置SonarQube servers
,在系統管理
->系統設定
中進行配置,如下圖所示,其中Server authentication token
就是前面提到的需要在sonar
中根據使用者名稱生成的令牌
最後點選儲存任務配置資訊,你可以接下來就選擇立即構建
功能來驗證是否正確,或者等待你設定的週期定時器規則。
結果驗證
以上步驟實現從SVN
中拉取程式碼、編譯、程式碼規範檢查整個流程,我們將在jenkins
看到編譯的結果,在sonar
中檢視到程式碼質量的統計資料,問題一目瞭然的反映出來了。
問題
maven
執行過程許可權不夠,錯誤如下,最終排查是由於我手動將maven
包傳到linux
機器時,bin
目錄下的啟動指令碼失去了可執行許可權,賦許可權即可
[iotstp] $ /home/mzh/CI/apache-maven-3.2.1/bin/mvn -f /root/.jenkins/workspace/iotstp/pom.xml -e -B sonar:sonar -Dsonar.host.url=http://10.10.107.104:9000 ********
FATAL: command execution failed
java.io.IOException: error=13, 許可權不夠
maven
外掛呼叫sonar
介面時找不到SVN
的使用者名稱與密碼,鑑權失敗,解決措施為關閉掉sonar
中的scm
開關
[ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.0.905:sonar (default-cli) on project iotstp: Error when executing blame for file pom.xml: svn: E170001: Authentication required for '<http://10.10.1.15:443> VisualSVN Server' -> [Help 1]