1. 程式人生 > >Jenkins與Sonar整合

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初始密碼的修改。
jenkins解鎖

成功進入主介面如下,具體相關的功能不再一一介紹,關於系統的配置功能均在系統管理中。
jenkins主介面

相關技巧

  1. 如何進行離線安裝

離線安裝一般有如下兩種方式

  • 下載外掛檔案xxx.hpi,從外掛官網下載對應的外掛檔案,然後在系統管理->外掛管理->高階中手動上傳外掛,如下圖所示
    外掛上傳

  • 利用能夠上網的機器將所需要的外掛線上安裝好,然後將/root/.jenkins目錄下全部打包至不能上網的機器對應目錄下,重啟jenkins服務
    線上安裝

    1. 如何修改預設啟動埠8080

執行命令java -jar jenkins.war --httpPort=8090可對當前啟動生效,但如果機器重啟或將jenkins做成系統服務怎麼辦,因為它本身沒有提供配置檔案修改,需要自己將埠寫入環境變數,然後讀取環境變數進行實現。

Sonar

介紹

Sonar是一個用於程式碼質量管理的開源平臺,用於管理Java原始碼的質量。通過外掛機制,它 可以整合不同的測試工具,程式碼分析工具,以及持續整合工具,比如checkstylefindbugsJenkins。通過不同的外掛對這些結果進行再加工處理,通過量化的方式度量程式碼質量的變化,從而可以方便地對不同規模和種類的工程進行程式碼質量管理。同時它還對大量的持續整合工具提供了介面支援,可以很方便地在持續整合中使用它。此外,它的外掛還可以對 Java 以外的其他程式語言提供支援,對國際化以及報告文件化也有良好的支援。可以說是目前最強大的程式碼質量管理工具之一。

它的主要作用如下:

  • 檢查程式碼是否遵循程式設計標準:如命名規範,編寫的規範等
  • 檢查設計存在的潛在缺陷:SonarQube通過外掛FindbugsCheckstyle等工具檢測程式碼存在的缺陷
  • 檢測程式碼的重複程式碼量: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,這個值就是以後與mavenjenkins整合時的介面憑證,當然也可以跳過,後面再生成。

瀏覽器訪問http://IP:9000進入主介面,如下圖所示,具體相關功能不一一細講。
sonar主介面

自定義程式碼審查規則

自定義程式碼審查規則是根據每個公司的編碼規範形成的,拿java來說預設有許多,但不一定都需要滿足,這個後續再研究。

Jenkins整合Sonar

在前面jenkins中該裝的外掛都裝了,接下來通過新建一個任務來實現,對svn路徑下的專案實現編譯打包,程式碼規範檢查,質量統計分析整個流程。

jenkinssonar整合有兩種方式,一種是在Post Steps過程中使用SonarQube Scanner分析,二是在構建後操作中使用SonarQube analysis with Maven,相當於呼叫了maven的外掛與sonar整合。這裡使用的是第二種方式進行驗證實現。

  • 全域性工具配置,包括jdkmaven的配置,在系統管理->全域性工具配置,如下圖所示
    jdk配置
    maven配置

  • 新建任務,輸入任務名稱,選擇專案型別,這裡選擇maven專案
    新建任務

  • 任務配置,任務配置如下所示,裡面提供了很多過程階段,像原始碼管理、構建觸發器、構建環境、Pre Steps、Build、Post Steps、構建設定及構建後操作,這裡我使用到了原始碼管理、構建觸發器、Build與構建後操作四個過程

    1. 原始碼管理,主要是指定原始碼下載的路徑,一般為SVN,但需要配置SVN的使用者名稱與密碼,在右側Credentials功能採單中新增全域性的帳戶資訊
      原始碼管理

    2. 構建觸發器,指定任務觸發的機制,視情況而定,我這裡是週期性的,規則跟cron形式一致
      觸發器

    3. Build 指定了編譯的根檔案以及編譯的命令
      build

    4. 構建後操作,指定了使用maven外掛整合sonar,當然前提是得先配置SonarQube servers,在系統管理->系統設定中進行配置,如下圖所示,其中Server authentication token就是前面提到的需要在sonar中根據使用者名稱生成的令牌
      sonarqube配置
      構建後操作

最後點選儲存任務配置資訊,你可以接下來就選擇立即構建功能來驗證是否正確,或者等待你設定的週期定時器規則。

結果驗證

以上步驟實現從SVN中拉取程式碼、編譯、程式碼規範檢查整個流程,我們將在jenkins看到編譯的結果,在sonar中檢視到程式碼質量的統計資料,問題一目瞭然的反映出來了。
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]

SCM關閉