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

最近一段時間穗椅,我們團(tuán)隊(duì)在生產(chǎn)環(huán)境出現(xiàn)了幾次線上問題,有部分比較嚴(yán)重奶栖,直接影響用戶功能的使用匹表,惹得領(lǐng)導(dǎo)不高興了,讓我想辦法提升代碼質(zhì)量宣鄙,這時候項(xiàng)目工程代碼質(zhì)量檢測神器——SonarQube袍镀,出現(xiàn)在我們的視線當(dāng)中。

一 sonarqube是做什么的

SonarQube? 是一種自動代碼審查工具冻晤,用于檢測代碼中的錯誤苇羡,漏洞和代碼味道。 它可以與您現(xiàn)有的工作流程集成鼻弧,以實(shí)現(xiàn)跨項(xiàng)目分支和提取請求的連續(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ā)人員將精力過多地花費(fèi)在閱讀注釋上,亦違背初衷丘喻。

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)計并展示單元測試覆蓋率。

總覽:

image

在典型的開發(fā)過程中:

  1. 開發(fā)人員在IDE中開發(fā)和合并代碼(最好使用 SonarLint 在編輯器中接收即時反饋)讨彼,然后將其代碼嵌入ALM歉井。
  2. 組織的持續(xù)集成(CI)工具可以檢出,構(gòu)建和運(yùn)行單元測試哈误,而集成的SonarQube掃描儀可以分析結(jié)果哩至。
  3. 掃描程序?qū)⒔Y(jié)果發(fā)布到SonarQube服務(wù)器,該服務(wù)器通過SonarQube界面蜜自,電子郵件菩貌,IDE內(nèi)通知(通過SonarLint)以及對拉取或合并請求的修飾(使用 Developer Edition 及更高 版本時)向開發(fā)人員提供反饋 。

SonarQube實(shí)例包含三個組件:

image.png
  1. SonarQube服務(wù)器運(yùn)行以下過程:
  2. 提供SonarQube用戶界面的Web服務(wù)器重荠。
  3. 基于Elasticsearch的搜索服務(wù)器箭阶。
  4. 計算引擎負(fù)責(zé)處理代碼分析報告并將其保存在SonarQube數(shù)據(jù)庫中。
  5. 該數(shù)據(jù)庫存儲以下內(nèi)容:
  6. 代碼掃描期間生成的代碼質(zhì)量和安全性的度量標(biāo)準(zhǔn)和問題戈鲁。
  7. SonarQube實(shí)例配置尾膊。
  8. 在構(gòu)建或連續(xù)集成服務(wù)器上運(yùn)行的一臺或多臺掃描儀可以分析項(xiàng)目。

二 sonarqube如何搭建

官網(wǎng)地址:https://www.sonarqube.org/荞彼,選擇“文檔”菜單

image

在出現(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)榱耸∈屡萃Γ惭b了 7.6的版本,因?yàn)閙ysql數(shù)據(jù)庫我們已經(jīng)在用了命浴,無需額外安裝其他數(shù)據(jù)庫娄猫,并且JDK8也在使用鸠儿,安裝成本最小阶淘。但是后來發(fā)現(xiàn)叠必,如果需要安裝漢化版插件孩饼,或者mybatis插件芹壕,這些插件要求的 SonarQube 版本必須在7.9以上啤它,并且需要運(yùn)行在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ù)集的大小彼宠。除了免費(fèi)和開源之外鳄虱,PostgreSQL也是高度可擴(kuò)展的。例如凭峡,您可以定義自己的數(shù)據(jù)類型拙已,構(gòu)建自定義函數(shù),甚至可以使用不同的編程語言編寫代碼摧冀,而無需重新編譯數(shù)據(jù)庫倍踪。

PostgreSQL的安裝與使用可以參數(shù):http://www.reibang.com/p/7d133efccaa4

2.3 從zip文件安裝sonarqube

SonarQube無法在 root 基于Unix的系統(tǒng)上 運(yùn)行 系宫,因此,如有必要建车,請為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)實(shí)例。 相反戒突,您應(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 )。第一次訪問這個地址比較會停留在這個頁面一段時間钓株,因?yàn)?SonarQube會做一些初始化工作实牡,包含往空數(shù)據(jù)庫中建表

image

初始化成功后運(yùn)行的頁面:

image

同時會生成20多張表:

image

2.3 安裝插件

根據(jù)個人需要,可以安裝漢化插件轴合,sonarqube默認(rèn)是英文界面创坞。

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

將項(xiàng)目下載編譯打包后,將jar放到 $SONARQUBE-HOME \extensions \plugins

目錄下即可受葛,然后執(zhí)行:./sonar.sh restart命令重啟sonarqube服務(wù)题涨。

此外,還有mybatis插件

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

我個人用過总滩,覺得作用不大纲堵,不過可以基于這個代碼擴(kuò)展自己需要的功能。

三 sonarqube如何使用

3.1 在maven項(xiàng)目中集成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>

在項(xiàng)目目錄下運(yùn)行代碼檢測命令: mvn clean complie -U -Dmaven.test.skip=true sonar:sonar

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

image

然后在sonar后臺查看檢測報告

image

報告里面包含:bug席函、漏洞、異味冈涧、安全熱點(diǎn)向挖、覆蓋蝌以、重復(fù)率等,對有問題的代碼能夠快速定位何之。

點(diǎn)擊某個bug可以查看具體有問題代碼:

沒有關(guān)閉輸入流問題:

image

空指針問題:

image

錯誤的用法:

image

SimpleDateFormat不應(yīng)該被定義成static的。

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

彩蛋

sonarqube非常強(qiáng)大辐赞,上面只介紹了它的基本用法。一般情況下硝训,我們可以使用jenkins配置需要代碼檢測的項(xiàng)目响委,從gitlab上下載代碼,執(zhí)行maven編譯打包代碼測試命令窖梁,可直接生成報告赘风。jenkins觸發(fā)執(zhí)行代碼檢測的時機(jī)是:1.有代碼提交,或者指定比如test分支有代碼提交纵刘,項(xiàng)目數(shù)量少可以這樣做邀窃。2.定時執(zhí)行,我們公司就是配置在凌晨定時執(zhí)行假哎,因?yàn)閖enkins部署的項(xiàng)目太多了瞬捕,為了不影響正常的項(xiàng)目部署。

此外舵抹,我們可以自定義代碼檢測的執(zhí)行規(guī)則肪虎,根據(jù)實(shí)際的項(xiàng)目需求自己開發(fā)插件,比如:我們自己開發(fā)了mybatis插件掏父,掃描mapper和xml文件名稱不一致的情況笋轨。

image.png

總之,sonar的功能非常強(qiáng)大赊淑,強(qiáng)烈建議大家在項(xiàng)目中使用爵政,真的可以減少很多隱藏的bug,提高代碼質(zhì)量陶缺,如果你用過就會發(fā)現(xiàn)它的好處钾挟。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市饱岸,隨后出現(xiàn)的幾起案子掺出,更是在濱河造成了極大的恐慌徽千,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汤锨,死亡現(xiàn)場離奇詭異双抽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)闲礼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門牍汹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柬泽,你說我怎么就攤上這事慎菲。” “怎么了锨并?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵露该,是天一觀的道長。 經(jīng)常有香客問我第煮,道長解幼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任空盼,我火速辦了婚禮书幕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘揽趾。我一直安慰自己台汇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布篱瞎。 她就那樣靜靜地躺著苟呐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俐筋。 梳的紋絲不亂的頭發(fā)上牵素,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音澄者,去河邊找鬼笆呆。 笑死,一個胖子當(dāng)著我的面吹牛粱挡,可吹牛的內(nèi)容都是我干的赠幕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼询筏,長吁一口氣:“原來是場噩夢啊……” “哼榕堰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嫌套,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤逆屡,失蹤者是張志新(化名)和其女友劉穎圾旨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體魏蔗,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砍的,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了莺治。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挨约。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖产雹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翁锡,我是刑警寧澤蔓挖,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站馆衔,受9級特大地震影響瘟判,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜角溃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一拷获、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧减细,春花似錦匆瓜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至萧吠,卻和暖如春左冬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纸型。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工拇砰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狰腌。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓除破,卻偏偏與公主長得像,于是被迫代替她去往敵國和親癌别。 傳聞我的和親對象是個殘疾皇子皂岔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容