最近一段時間,我們團(tuán)隊在生產(chǎn)環(huán)境出現(xiàn)了幾次線上問題,有部分比較嚴(yán)重,直接影響用戶功能的使用,惹得領(lǐng)導(dǎo)不高興了,讓我想辦法提升代碼質(zhì)量,這時候項目工程代碼質(zhì)量檢測神器——SonarQube,出現(xiàn)在我們的視線當(dāng)中。?
一?sonarqube是做什么的
SonarQube?是一種自動代碼審查工具,用于檢測代碼中的錯誤,漏洞和代碼味道。它可以與您現(xiàn)有的工作流程集成,以實現(xiàn)跨項目分支和提取請求的連續(xù)代碼檢查。通過插件形式,可以支持包括 java, C#, C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等二十幾種編程語言的代碼質(zhì)量管理與檢測。sonarqube可以從以下7個維度檢測代碼質(zhì)量,而作為開發(fā)人員至少需要處理前5種代碼質(zhì)量問題。
1.1 不遵循代碼標(biāo)準(zhǔn)
sonarqube可以通過CheckStyle等代碼規(guī)則檢測工具規(guī)范代碼編寫。
1.2?存在的缺陷漏洞
sonarqube可以通過Findbugs等等代碼規(guī)則檢測工具檢測出潛在的缺陷。
1.3? 糟糕的復(fù)雜度分布
文件、類、方法等,如果復(fù)雜度過高將難以改變,這會使得開發(fā)人員 難以理解它們, 且如果沒有自動化的單元測試,對于程序中的任何組件的改變都將可能導(dǎo)致需要全面的回歸測試。
1.4? 重復(fù)
顯然程序中包含大量復(fù)制粘貼的代碼是質(zhì)量低下的,sonarqube可以展示源碼中重復(fù)嚴(yán)重的地方。
1.5? 注釋不足或者過多
沒有注釋將使代碼可讀性變差,特別是當(dāng)不可避免地出現(xiàn)人員變動 時,程序的可讀性將大幅下降 而過多的注釋又會使得開發(fā)人員將精力過多地花費在閱讀注釋上,亦違背初衷。
1.6? 缺乏單元測試
sonarqube可以很方便地統(tǒng)計并展示單元測試覆蓋率。
1.7? 糟糕的設(shè)計
通過sonarqube可以找出循環(huán),展示包與包、類與類之間的相互依賴關(guān)系,可以檢測自定義的架構(gòu)規(guī)則 通過sonarqube可以管理第三方的jar包,可以利用LCOM4檢測單個任務(wù)規(guī)則的應(yīng)用情況, 檢測耦合。sonarqube可以很方便地統(tǒng)計并展示單元測試覆蓋率。
總覽:
在典型的開發(fā)過程中:
開發(fā)人員在IDE中開發(fā)和合并代碼(最好使用SonarLint在編輯器中接收即時反饋),然后將其代碼簽入ALM。
組織的持續(xù)集成(CI)工具可以檢出,構(gòu)建和運行單元測試,而集成的SonarQube掃描儀可以分析結(jié)果。
掃描程序?qū)⒔Y(jié)果發(fā)布到SonarQube服務(wù)器,該服務(wù)器通過SonarQube界面,電子郵件,IDE內(nèi)通知(通過SonarLint)以及對拉取或合并請求的修飾(使用Developer Edition及更高版本時)向開發(fā)人員提供反饋。
SonarQube實例包含三個組件:
SonarQube服務(wù)器運行以下過程:
提供SonarQube用戶界面的Web服務(wù)器。
基于Elasticsearch的搜索服務(wù)器。
計算引擎負(fù)責(zé)處理代碼分析報告并將其保存在SonarQube數(shù)據(jù)庫中。
該數(shù)據(jù)庫存儲以下內(nèi)容:
代碼掃描期間生成的代碼質(zhì)量和安全性的度量標(biāo)準(zhǔn)和問題。
SonarQube實例配置。
在構(gòu)建或連續(xù)集成服務(wù)器上運行的一臺或多臺掃描儀可以分析項目。
二 sonarqube如何搭建
官網(wǎng)地址:https://www.sonarqube.org/,選擇“文檔”菜單
在出現(xiàn)的文檔頁面中可以選擇版本,目前最新的版本是8.5。筆者嘗試過三個版本:
8.5:它是目前最新的版本,需要安裝JDK11,并且只支持oracle、sqlserver和PostgreSQL數(shù)據(jù)庫
7.9:它是一個長期支持的版本,非常文檔,也需要安裝JDK11,并且只支持oracle、sqlserver和PostgreSQL數(shù)據(jù)庫?。
7.6:它是一個老版本,只需安裝JDK8,支持oracle、sqlserver和PostgreSQL數(shù)據(jù)庫,以及mysql數(shù)據(jù)庫。
剛開始我們?yōu)榱耸∈?,安裝了 7.6的版本,因為mysql數(shù)據(jù)庫我們已經(jīng)在用了,無需額外安裝其他數(shù)據(jù)庫,并且JDK8也在使用,安裝成本最小。但是后來發(fā)現(xiàn),如果需要安裝漢化版插件,或者mybatis插件,這些插件要求的SonarQube版本必須在7.9以上,并且需要運行在JDK11以上。經(jīng)過權(quán)衡之后,我們決定安裝最新版的。
2.1 安裝JDK11和postgreSQL
? ?JDK下載地址:https://www.oracle.com/java/technologies/javase-jdk11-downloads.html
? ?JDK的安裝比較簡單,我在這里就不過多介紹了,網(wǎng)上有很多教程。
? ?PostgreSQL它自己號稱自己是世界上最先進(jìn)的開源數(shù)據(jù)庫,具有許多功能,旨在幫助開發(fā)人員構(gòu)建應(yīng)用程序,管理員來保護(hù)數(shù)據(jù)完整性和構(gòu)建容錯環(huán)境,并幫助您管理數(shù)據(jù),無論數(shù)據(jù)集的大小。除了免費和開源之外,PostgreSQL也是高度可擴(kuò)展的。例如,您可以定義自己的數(shù)據(jù)類型,構(gòu)建自定義函數(shù),甚至可以使用不同的編程語言編寫代碼,而無需重新編譯數(shù)據(jù)庫。
? ?PostgreSQL的安裝與使用可以參數(shù):https://www.jianshu.com/p/7d133efccaa4
2.3?從zip文件安裝sonarqube
SonarQube無法在root
基于Unix的系統(tǒng)上運行,因此,如有必要,請為SonarQube創(chuàng)建專用的用戶帳戶。
$ SONARQUBE-HOME(下面)指的是SonarQube發(fā)行版已解壓縮的目錄的路徑。
設(shè)置對數(shù)據(jù)庫的訪問
編輯$ SONARQUBE-HOME / conf / sonar.properties以配置數(shù)據(jù)庫設(shè)置。模板可用于每個受支持的數(shù)據(jù)庫。只需取消注釋并配置所需的模板,然后注釋掉專用于H2的行:
Example for PostgreSQL
sonar.jdbc.username=sonarqube
sonar.jdbc.password=mypassword
sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube
配置Elasticsearch存儲路徑
默認(rèn)情況下,Elasticsearch數(shù)據(jù)存儲在$ SONARQUBE-HOME / data中,但不建議將其用于生產(chǎn)實例。相反,您應(yīng)該將此數(shù)據(jù)存儲在其他位置,最好是在具有快速I / O的專用卷中。除了保持可接受的性能外,這樣做還可以簡化SonarQube的升級。
編輯$ SONARQUBE-HOME / conf / sonar.properties以配置以下設(shè)置:
sonar.path.data=/var/sonarqube/data
sonar.path.temp=/var/sonarqube/temp
用于啟動SonarQube的用戶必須具有對這些目錄的讀寫權(quán)限。
啟動Web服務(wù)器
默認(rèn)端口為“ 9000”,上下文路徑為“ /”。這些值可以在$ SONARQUBE-HOME / conf / sonar.properties中進(jìn)行更改:
sonar.web.host=192.0.0.1
sonar.web.port=80
sonar.web.context=/sonarqube
執(zhí)行以下腳本來啟動服務(wù)器:
在Linux上:bin / linux-x86-64 / sonar.sh start
在macOS上:bin / macosx-universal-64 / sonar.sh start
在Windows上:bin / windows-x86-64 / StartSonar.bat
調(diào)整Java安裝
如果服務(wù)器上安裝了多個Java版本,則可能需要明確定義使用哪個Java版本。
要更改SonarQube使用的Java JVM,請編輯$ SONARQUBE-HOME / conf / wrapper.conf并更新以下行:
wrapper.java.command=/path/to/my/jdk/bin/java
您現(xiàn)在可以在http:// localhost:9000上瀏覽SonarQube?(默認(rèn)的系統(tǒng)管理員憑據(jù)為admin
/?admin
)。第一次訪問這個地址比較會停留在這個頁面一段時間,因為SonarQube會做一些初始化工作,包含往空數(shù)據(jù)庫中建表
初始化成功后運行的頁面:
同時會生成20多張表:
2.3?安裝插件
根據(jù)個人需要,可以安裝漢化插件,sonarqube默認(rèn)是英文界面。
github地址:https://github.com/SonarQubeCommunity/sonar-l10n-zh
將項目下載編譯打包后,將jar放到$SONARQUBE-HOME\extensions\plugins
目錄下即可,然后執(zhí)行:./sonar.sh restart命令重啟sonarqube服務(wù)。
此外,還有mybatis插件
gitee地址:https://gitee.com/mirrors/sonar-mybatis
我個人用過,覺得作用不大,不過可以基于這個代碼擴(kuò)展自己需要的功能。
三 sonarqube如何使用
3.1?在maven項目中集成sonarqube
先在maven的settings.xml文件中增加如下配置:
<pluginGroups>
<pluginGroup>org.sonarsource.scanner.mavenpluginGroup>
pluginGroups>
<profiles>
<profile>
<id>sonarid>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
<properties>
<sonar.host.url>
http://localhost:9000
sonar.host.url>
properties>
profile>
profiles>
然后在pom.xml文件中增加配置:
??
org.sonarsource.scanner.maven ??
sonar-maven-plugin ??
3.3.0.603
在項目目錄下運行代碼檢測命令:? mvn?clean?complie -U?-Dmaven.test.skip=true sonar:sonar
看到這幾句話,就表示檢測成功了
然后在sonar后臺查看檢測報告
報告里面包含:bug、漏洞、異味、安全熱點、覆蓋、重復(fù)率等,對有問題的代碼能夠快速定位。
點擊某個bug可以查看具體有問題代碼:
沒有關(guān)閉輸入流問題:
空指針問題:
錯誤的用法:
SimpleDateFormat不應(yīng)該被定義成static的。
檢測出的代碼問題類型太多,這里就不一一列舉了??傊?,記住一句話:sonar很牛逼。它不光可以檢測出代碼問題,還對一些不好的代碼寫法和用法有更好的建議。
彩蛋
sonarqube非常強(qiáng)大,上面只介紹了它的基本用法。一般情況下,我們可以使用jenkins配置需要代碼檢測的項目,從gitlab上下載代碼,執(zhí)行maven編譯打包代碼測試命令,可直接生成報告。jenkins觸發(fā)執(zhí)行代碼檢測的時機(jī)是:1.有代碼提交,或者指定比如test分支有代碼提交,項目數(shù)量少可以這樣做。2.定時執(zhí)行,我們公司就是配置在凌晨定時執(zhí)行,因為jenkins部署的項目太多了,為了不影響正常的項目部署。
此外,我們可以自定義代碼檢測的執(zhí)行規(guī)則,根據(jù)實際的項目需求自己開發(fā)插件,比如:我們自己開發(fā)了mybatis插件,掃描mapper和xml文件名稱不一致的情況。
特別推薦一個分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長按關(guān)注一下:
長按訂閱更多精彩▼
如有收獲,點個在看,誠摯感謝
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!