天天看點

使用了這個神器,讓我的代碼bug少了一半

       最近一段時間,我們團隊在生産環境出現了幾次線上問題,有部分比較嚴重,直接影響使用者功能的使用,惹得上司不高興了,讓我想辦法提升代碼品質,這時候項目工程代碼品質檢測神器——SonarQube,出現在我們的視線當中。 

一 sonarqube是做什麼的

SonarQube®是一種自動代碼審查工具,用于檢測代碼中的錯誤,漏洞和代碼味道。它可以與您現有的工作流程內建,以實作跨項目分支和提取請求的連續代碼檢查。通過插件形式,可以支援包括 java, C#, C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等二十幾種程式設計語言的代碼品質管理與檢測。sonarqube可以從以下7個次元檢測代碼品質,而作為開發人員至少需要處理前5種代碼品質問題。

1.1 不遵循代碼标準

sonarqube可以通過CheckStyle等代碼規則檢測工具規範代碼編寫。

1.2 存在的缺陷漏洞

sonarqube可以通過Findbugs等等代碼規則檢測工具檢測出潛在的缺陷。

1.3  糟糕的複雜度分布

檔案、類、方法等,如果複雜度過高将難以改變,這會使得開發人員 難以了解它們, 且如果沒有自動化的單元測試,對于程式中的任何元件的改變都将可能導緻需要全面的回歸測試。

1.4  重複

顯然程式中包含大量複制粘貼的代碼是品質低下的,sonarqube可以展示源碼中重複嚴重的地方。

1.5  注釋不足或者過多

沒有注釋将使代碼可讀性變差,特别是當不可避免地出現人員變動 時,程式的可讀性将大幅下降 而過多的注釋又會使得開發人員将精力過多地花費在閱讀注釋上,亦違背初衷。

1.6  缺乏單元測試

sonarqube可以很友善地統計并展示單元測試覆寫率。

1.7  糟糕的設計

通過sonarqube可以找出循環,展示包與包、類與類之間的互相依賴關系,可以檢測自定義的架構規則 通過sonarqube可以管理第三方的jar包,可以利用LCOM4檢測單個任務規則的應用情況, 檢測耦合。sonarqube可以很友善地統計并展示單元測試覆寫率。

總覽:

使用了這個神器,讓我的代碼bug少了一半

在典型的開發過程中:

  1. 開發人員在IDE中開發和合并代碼(最好使用SonarLint在編輯器中接收即時回報),然後将其代碼簽入ALM。
  2. 組織的持續內建(CI)工具可以檢出,建構和運作單元測試,而內建的SonarQube掃描器可以分析結果。
  3. 掃描程式将結果釋出到SonarQube伺服器,該伺服器通過SonarQube界面,電子郵件,IDE内通知(通過SonarLint)以及對拉取或合并請求的修飾(使用Developer Edition及更高版本時)向開發人員提供回報。

SonarQube執行個體包含三個元件:

使用了這個神器,讓我的代碼bug少了一半
  1. SonarQube伺服器運作以下過程:
  • 提供SonarQube使用者界面的Web伺服器。
  • 基于Elasticsearch的搜尋伺服器。
  • 計算引擎負責處理代碼分析報告并将其儲存在SonarQube資料庫中。
  • 該資料庫存儲以下内容:
  • 代碼掃描期間生成的代碼品質和安全性的度量标準和問題。
  • SonarQube執行個體配置。
  • 在建構或連續內建伺服器上運作的一台或多台掃描器可以分析項目。

二 sonarqube如何搭建

官網位址:https://www.sonarqube.org/,選擇“文檔”菜單

使用了這個神器,讓我的代碼bug少了一半

在出現的文檔頁面中可以選擇版本,目前最新的版本是8.5。筆者嘗試過三個版本:

8.5:它是目前最新的版本,需要安裝JDK11,并且隻支援oracle、sqlserver和PostgreSQL資料庫

7.9:它是一個長期支援的版本,非常文檔,也需要安裝JDK11,并且隻支援oracle、sqlserver和PostgreSQL資料庫 。

7.6:它是一個老版本,隻需安裝JDK8,支援oracle、sqlserver和PostgreSQL資料庫,以及mysql資料庫。

剛開始我們為了省事,安裝了 7.6的版本,因為mysql資料庫我們已經在用了,無需額外安裝其他資料庫,并且JDK8也在使用,安裝成本最小。但是後來發現,如果需要安裝漢化版插件,或者mybatis插件,這些插件要求的SonarQube版本必須在7.9以上,并且需要運作在JDK11以上。經過權衡之後,我們決定安裝最新版的。

2.1 安裝JDK11和postgreSQL

   JDK下載下傳位址:https://www.oracle.com/java/technologies/javase-jdk11-downloads.html

   JDK的安裝比較簡單,我在這裡就不過多介紹了,網上有很多教程。

   PostgreSQL它自己号稱自己是世界上最先進的開源資料庫,具有許多功能,旨在幫助開發人員建構應用程式,管理者來保護資料完整性和建構容錯環境,并幫助您管理資料,無論資料集的大小。除了免費和開源之外,PostgreSQL也是高度可擴充的。例如,您可以定義自己的資料類型,建構自定義函數,甚至可以使用不同的程式設計語言編寫代碼,而無需重新編譯資料庫。

   PostgreSQL的安裝與使用可以參數:https://www.jianshu.com/p/7d133efccaa4

2.3 從zip檔案安裝sonarqube

SonarQube無法在root基于Unix的系統上運作,是以,如有必要,請為SonarQube建立專用的使用者帳戶。

$ SONARQUBE-HOME(下面)指的是SonarQube發行版已解壓縮的目錄的路徑。

設定對資料庫的通路

編輯$ SONARQUBE-HOME / conf / sonar.properties以配置資料庫設定。模闆可用于每個受支援的資料庫。隻需取消注釋并配置所需的模闆,然後注釋掉專用于H2的行:

Example for PostgreSQL
sonar.jdbc.username=sonarqube
sonar.jdbc.password=mypassword
sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube      

配置Elasticsearch存儲路徑

預設情況下,Elasticsearch資料存儲在$ SONARQUBE-HOME / data中,但不建議将其用于生産執行個體。相反,您應該将此資料存儲在其他位置,最好是在具有快速I / O的專用卷中。除了保持可接受的性能外,這樣做還可以簡化SonarQube的更新。

編輯$ SONARQUBE-HOME / conf / sonar.properties以配置以下設定:

sonar.path.data=/var/sonarqube/data
sonar.path.temp=/var/sonarqube/temp      

用于啟動SonarQube的使用者必須具有對這些目錄的讀寫權限。

啟動Web伺服器

預設端口為“ 9000”,上下文路徑為“ /”。這些值可以在$ SONARQUBE-HOME / conf / sonar.properties中進行更改:

sonar.web.host=192.0.0.1
sonar.web.port=80
sonar.web.context=/sonarqube      

執行以下腳本來啟動伺服器:

  • 在Linux上:bin / linux-x86-64 / sonar.sh start
  • 在macOS上:bin / macosx-universal-64 / sonar.sh start
  • 在Windows上:bin / windows-x86-64 / StartSonar.bat

調整Java安裝

如果伺服器上安裝了多個Java版本,則可能需要明确定義使用哪個Java版本。

要更改SonarQube使用的Java JVM,請編輯$ SONARQUBE-HOME / conf / wrapper.conf并更新以下行:

wrapper.java.command=/path/to/my/jdk/bin/java      

您現在可以在http:// localhost:9000上浏覽SonarQube (預設的系統管理者憑據為admin/ admin)。第一次通路這個位址比較會停留在這個頁面一段時間,因為SonarQube會做一些初始化工作,包含往空資料庫中建表

使用了這個神器,讓我的代碼bug少了一半

初始化成功後運作的頁面:

使用了這個神器,讓我的代碼bug少了一半

同時會生成20多張表:

使用了這個神器,讓我的代碼bug少了一半

2.3 安裝插件

根據個人需要,可以安裝漢化插件,sonarqube預設是英文界面。

github位址:https://github.com/SonarQubeCommunity/sonar-l10n-zh

将項目下載下傳編譯打包後,将jar放到$SONARQUBE-HOME\extensions\plugins

目錄下即可,然後執行:./sonar.sh restart指令重新開機sonarqube服務。

此外,還有mybatis插件

gitee位址:https://gitee.com/mirrors/sonar-mybatis

我個人用過,覺得作用不大,不過可以基于這個代碼擴充自己需要的功能。

三 sonarqube如何使用

3.1 在maven項目中內建sonarqube

先在maven的settings.xml檔案中增加如下配置:

<pluginGroups>    <pluginGroup>org.sonarsource.scanner.maven</pluginGroup></pluginGroups><profiles>    <profile>      <id>sonar</id>      <activation>        <activeByDefault>true</activeByDefault>      </activation>      <properties>        <!-- Optional URL to server. Default value is http://localhost:9000 -->        <sonar.host.url>          http://localhost:9000        </sonar.host.url>      </properties>    </profile></profiles>      

然後在pom.xml檔案中增加配置:

<plugin>  <groupId>org.sonarsource.scanner.maven</groupId>  <artifactId>sonar-maven-plugin</artifactId>  <version>3.3.0.603</version></plugin>      

在項目目錄下運作代碼檢測指令:  mvn clean complie -U -Dmaven.test.skip=true sonar:sonar

看到這幾句話,就表示檢測成功了

使用了這個神器,讓我的代碼bug少了一半

然後在sonar背景檢視檢測報告

使用了這個神器,讓我的代碼bug少了一半

報告裡面包含:bug、漏洞、異味、安全熱點、覆寫、重複率等,對有問題的代碼能夠快速定位。

點選某個bug可以檢視具體有問題代碼:

沒有關閉輸入流問題:

使用了這個神器,讓我的代碼bug少了一半

空指針問題:

使用了這個神器,讓我的代碼bug少了一半

錯誤的用法:

使用了這個神器,讓我的代碼bug少了一半

SimpleDateFormat不應該被定義成static的。

檢測出的代碼問題類型太多,這裡就不一一列舉了。總之,記住一句話:sonar很牛逼。它不光可以檢測出代碼問題,還對一些不好的代碼寫法和用法有更好的建議。

彩蛋

sonarqube非常強大,上面隻介紹了它的基本用法。一般情況下,我們可以使用jenkins配置需要代碼檢測的項目,從gitlab上下載下傳代碼,執行maven編譯打包代碼測試指令,可直接生成報告。jenkins觸發執行代碼檢測的時機是:1.有代碼送出,或者指定比如test分支有代碼送出,項目數量少可以這樣做。2.定時執行,我們公司就是配置在淩晨定時執行,因為jenkins部署的項目太多了,為了不影響正常的項目部署。

總之,sonar的功能非常強大,強烈建議大家在項目中使用,真的可以減少很多隐藏的bug,提高代碼品質。

使用了這個神器,讓我的代碼bug少了一半

繼續閱讀