當前位置:
首頁 > 最新 > 使用SonarCloud為.NET/.NET Core項目集成靜態檢查

使用SonarCloud為.NET/.NET Core項目集成靜態檢查

Hi,朋友們,大家好,歡迎大家關注我的博客,我是Payne,我的博客地址是http://qinyuanoei.github.io。在不知不覺間,5月份已然度過大半,最近無論是讀書還是寫作均停滯不前,被拖延症支配的我深感有虛度時光之嫌。今天這篇文章,我將為大家介紹如何使用SonarCloud,來為.NET/.NET Core項目集成靜態檢查。如果大家使用過SonarCube的話,對接下來我要講的內容一定不會感到陌生,因為SonarCloud實際上就是SonarCube的「雲」版本。在雲計算概念深入人心的今天,我們可以通過互聯網來訪問各種各樣的服務。譬如,我曾經為大家介紹過的TravisCI就是一個在線的持續集成(CI)服務。這些雲服務可以讓我們不再關心基礎設施如何去搭建,進而集中精力去解決最核心、最關鍵的問題。和持續集成關注「持續」不同,靜態檢查關注的是代碼質量。目前,SonarCloud支持.NET Framework 4.6以上及.NET Core版本。通過這篇文章,你將了解到SonarCloud的基本使用、SonarCloud與TravisCI的服務集成這兩方面的內容。


SonarCloud

??靜態檢查,顧名思義就是通過掃描源代碼來發現代碼中隱藏的缺陷,譬如潛在的Bug、重複/複雜的代碼等等,這些通常被稱為代碼中的「壞味道」,靜態檢查就是通過工具去掃描這些「壞味道」。Sonar是一個基於Java的代碼質量管理工具,由Sonar和SonarScanner兩個主要部分組成,前者是一個Web系統用以展示代碼掃描結果,而後者是真正用以掃描代碼的工具。Sonar具備良好的擴展性,眾多的插件使得它可以和Jenkins等集成工具結合使用,同時可支持不同語言項目的掃描分析。在.NET中我們可以使用Stylecop來進行靜態檢查,無獨有偶,ReShaper中同樣提供了靜態檢查的特性。在這篇文章中我們主要使用Sonar來作為.NET項目的靜態檢查工具。

??通常使用Sonar來構建靜態檢查工具時,需要我們在本地搭建一套運行環境,而SonarCloud是針對Sonar推出的一個「雲」版本。我們只需要執行腳本就可以完成代碼分析,而分析的結果則可以直接在SonarCloud網站中看到。這就是「雲計算」的魅力所在,我們無需關心Sonar是如何安裝以及配置的,當我們需要使用這種服務的時候直接使用就好了。目前,SonarCloud對開源項目是免費提供的。因此,如果你不想親自去搭建一個靜態分析的環境,那麼你可以選擇使用SonarCloud來對代碼進行靜態分析。SonarCloud支持17種語言的掃描分析,支持和Travis、VSTS、AppVeyor等CI工具集成,甚至你可以在SonarCloud上找到大量實際的項目。

??我對SonarCloud感興趣的一個重要原因是,它可以和TravisCI完美地集成在一起,而且在此之前,我曾經使用過一段時間的Sonar。在使用SonarCloud前,我們需要註冊一個賬號,這裡建議使用Github賬號授權登錄,因為我們需要授權給SonarCloud來拉取代碼,尤其當你使用TravisCI來集成SonarCloud的時候。除此之外,我們需要準備好以下工具:

JDK,即Java SE Development Kit,運行SonarScanner時依賴Java環境。

Git,版本控制工具,如果身為一名程序員而沒有安裝Git,請面壁思過並自我檢討。

MSBuild,.NET平台項目構建工具,推薦一個無腦安裝的方法,安裝全宇宙無敵的IDE:Visual Studio。

SonarScanner,即Sonar的代碼掃描器,注意這裡有兩個版本:.NET Framework 4.6 + 和 .NET Core,本文以.NET Framework 4.6 +為例。


第一個.NET項目

??好了,下面我們來使用SonarCloud對博主的一個項目HttpServer進行分析。首先,我們需要在SonarCloud中創建一個項目。如下圖所示,我們首先選擇Organization,默認情況下,通過Github授權登錄以後,會生成一個格式為:$-github的組織名稱,例如我這裡是:qinyuanpei-github。這裡我們選擇默認組織,然後點擊:Continue。

設置組織名稱

??接下來,我們需要設置一個Token,其目的是通過這個Token登錄SonarCloud,然後把SonarScanner在本地掃描的結果發送到SonarCloud。這裡我們可以選擇生成一個新的Token或者是使用一個已經存在的Token。建議使用一個Token來管理所有的項目,因為這個Token顯示一次後就不再顯示,同時維護多個Token實在是太痛苦啦,當然,如果你能管理好所有Token的Key的話。設置完Token點擊下一步:

設置Token

??設置完Token以後需要選擇項目類型以及設置項目名稱,在這個例子中,博主的項目名稱是HttpServer,建議使用Sonar-$的形式來為項目命名,而項目類型顯然應該選擇「C# or VB.NET」。

設置項目名稱

??接下來我們就得到最關鍵的信息,如圖所示,這裡有三條命令,我們將其複製下來,然後將其寫到批處理(.bat)或者PowerShll腳本里。以後運行這三條命令,就可以對當前項目進行靜態檢查,是不是很簡單啊?簡單分析下,這三條命令,第一條命令根據我們設置的Token、項目名稱、組織等信息「開始」對項目進行分析,注意到這裡有一個「begin」;第二條命令是一個MSBuild命令,其目的是對整個項目重新構建;第三條命令是將靜態分析的提交到SonarCloud,注意到這裡有一個「end」。具體文檔可以參考這裡哦!

複製3條命令

??好了,現在我們在SonarCloud中就可以看到掃描結果啦,開心!如果執行命令出現問題,請確保正確安裝了相關工具,並檢查這些工具是否被添加到系統變數中,特別是Java需要設置JAVA_HOME。

掃描結果

TravisCI與SonarCloud的集成

??現在我們來回顧下整個過程,我們需要在本地安裝SonarScanner,這是一個Java編寫的應用程序,因此我們需要一個Java運行環境。每次都需要通過SonarCloud來創建項目,獲得項目相關的信息以後,在命令中攜帶這些參數並執行命令,就可以在SonarCloud中獲得本地的掃描結果。在整個過程中,我們依然需要一個本地的環境,這一點都不靈活。現實世界的複雜性,就在於我們無法為還原出完全一致的處境,

??所以,托爾斯泰開宗明義地說道:「幸福的家庭都是相似的,不幸的家庭各有各的不幸」,況且作為一個執著於讓重複的事情自動化的人,如果讓我做這件事情,我保證第一次會意外地覺得好奇,而等到第二次、第三次的時候我就會感到厭煩,這就是人們所說的三分鐘熱度。誠然,我的確是一個花心的雙子座。我們提到,SonarCloud支持TravisCI,所以,接下來我們來考慮如何讓TravisCI幫助我們運行Sonar。

??常規的思路是,下載SonarScanner並執行腳本。這種思路的問題在於TravisCI運行在Linux下,我們確定SonnarScanner是否可以支持Linux平台,儘管SonarScanner使用Java開發。通過閱讀TravisCI的文檔,我們發現TravisCI本身是支持SonarCloud的插件的,由此我們就可以著手將這一切交給TravisCI來做啦!

??關於如何使用TravisCI,這裡不再贅述啦!大家可以參考我的這兩篇博客,這兩篇博客分別是:持續集成在Hexo自動化部署上的實踐、基於Travis CI實現 Hexo 在 Github 和 Coding 的同步部署。當然第一手的資料必然是官方文檔,我是不好意思隨便對別人說RTFM的。按照文檔說明,我們首先需要一個名為sonar-project.properties的配置文件,在該配置文件中配置了諸如項目名稱、組織名稱等關鍵信息,Sonar會自動讀取這個配置文件里的信息並攜帶到命令中去,這個配置文件是在是太熟悉啦,假如你認真地讀了這篇文章,並注意到了SonarCloud生成的三條命令。這個配置文件內容如下:

??配置文件中有來自官方的注釋,我就不再狗尾續貂的去做相應的解釋了。我們發現,這個裡面是沒有token的,按照官方文檔中的說明,token應該配置在.travis.yml這個文件中,熟悉TravisCI的朋友就會知道,這個文件通常用來配置持續集成的流程。按照約定,SonarCloud屬於TravisCI的一個插件,應該配置在addons節點下,我們注意到,在這裡可以配置組織名稱和token兩個節點的信息。組織信息這個簡單,直接按照前面的流程填寫即可,需要注意的是這裡的token。

??因為token採用明文配置的話,難免會存在安全風險,所以官方的建議是:使用TravisCI的終端工具進行加密。這是一個基於Ruby的命令行工具,直接在命令行中對token進行加密即可。不過想起很多年前,第一次接觸Jekyll時被Ruby支配的恐懼感,我決定尋找新的出路。官方文檔說可以在TravisCI中配置全局變數,這種方式我們接入Coding Page 時曾使用過,不過經過博主嘗試,這種方式一直無法獲得許可權,所以,我不得不在配置文件中寫明文,大家不要學我啊:

??原本走到這一步時,我就該和大家對本文進行小結啦!可偏偏我注意到了SonarCloud生成命令中有MSBuild的身影,於是我開始嘗試在TravisCI腳本中編寫.NET相關的命令,因為我從未在TravisCI中對.NET項目進行持續集成,所以我很好奇它如果跑起來會是什麼樣子的。同樣參照官方文檔,發現目前TravisCI支持Mono和.NET Core的兩個版本的構建工具,Mono我可以理解,因為TravisCI運行在Linux環境下,這和我們以前運行在Windows環境下是不一樣的。而.NET Core原本就支持跨平台,目前官方釋放出了2.0預覽版,同時3.0的計劃開始提上日程。無論或早或晚,我們面對的都將是一個多平台化的未來,永遠不要固執地封閉在一個生態系統里,技術是如此,人生何嘗不是如此呢?

??好啦,言歸正傳,了解到這種可能性以後,我開始嘗試編寫TravisCI腳本,官方默認的構建系統是XBuild,實際使用中遇到些問題,開始考慮能不能替換成MSBuild,事實上MSBuild目前已經是跨平台的,Nuget同樣跨平台。微軟收購Mono以後,Visual Studio基本上算是跨平台了,況且我們還有一個編輯器中的黑馬Visual Studio Code。IIS目前可以考慮用Jexus替換,而有了OWIN這個伺服器介面以後,我們有更多的Host可以去選擇,現在剩下的只有SQL Server啦,可想而知,除了WinForm/WPF/COM等這種系統依賴性強的東西,大多數的服務其實都可以跑在Linux上。經過反覆嘗試,最終我們實現了:在TravisCI下使用MSBuild構建項目、使用Nuget在線安裝NUnit並運行單元測試、使用SonarCloud對代碼進行靜態檢查。一起來看腳本怎麼寫:

??好啦,感受技術的魅力吧!可以注意到,我這裡有4個單元測試,其中2個通過、2個失敗。雖然單元測試沒有通過,可我代碼沒有Bug呀!

NUnit運行結果


本文小結

??本文介紹了一個「雲」服務:SonarCloud。SonarCloud是一個基於SonarCube的靜態分析工具,通過SonarCloud我們無需搭建Sonar環境就可以對項目進行靜態分析。為了驗證和實現這個訴求,我們首先提供了通過SonarScanner來掃描代碼的示例,其原理是在命令行參數中攜帶相關信息,通過token來驗證和登錄SonarCloud,在完成對代碼的掃描以後,就可以在SonarCloud中查看整個項目的分析結果。

??接下來,為了驗證SonarCloud和TravisCI進行集成的可行性,我們嘗試通過travisCI腳本的方式來調用SonarCloud,其原理是通過配置文件獲得相關信息由TravisCI完成所有的分析工作,這裡需要注意的是要對token進行加密。在編寫TravisCI腳本的過程中,我們一同驗證了MSBuild、Nuget、NUnit等.NET常規工具或者類庫在Linux平台下使用的可能性,最終在TravisCI的幫助下完成了從項目構建、單元測試再到代碼的分析的整個流程。

??雖然靜態分析並不能完全保證代碼沒有問題,可人類總是不情願承認自己僅僅是一種高等動物而已,這個世界上有好多東西人們不一定會喜歡,因為它們要麼是正確的要麼是有益的。本文這個方案需要把代碼暴露在Github,對於一般的服務集成,我們更推薦Jenkins + Sonar這樣的組合,前者可以替換TravisCI提供持續集成服務,同Github、Gitlib等代碼託管服務進行集成、同Stylecop、Sonar等靜態檢查工具進行集成,這方面的資料非常豐富,我們這裡就不再多說啦,總而言之,讓一切更好就是我們的目的,晚安!


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 5厘米的理想 的精彩文章:

羅馬數字與阿拉伯數字的相互轉換
一念執著,千山無阻

TAG:5厘米的理想 |