【前言】
本系列主要講述sonarqube的安裝部署以及如何整合jenkins自動化分析.netcore專案。目錄如下:
- SonarQube系列一、Linux安裝與部署
- SonarQube系列二、分析dotnet core/C#程式碼
- SonarQube系列三、Jenkins整合SonarQube(dotnetcore篇)
【實現功能】
這篇文章將要介紹的主要內容如下:
- 將上一篇文章中的sonarqube命令整合為shell指令碼
- 將 shell 指令碼整合到jenkins中
【整合sonarqube命令為shell指令碼】
因為使用的是 linux 伺服器,因此,我們將上一篇文章中關於 sonarqube 的相關命令整合到 shell 指令碼中,以便方便地呼叫,並且很容易整合到CI/CD工具中。
shell 指令碼另一個優勢就是不需要在 jenkins 上安裝過多的外掛,而改用指令碼呼叫,保持jenkins的單一整潔,在機器遷移的情況下會異常方便快捷。
1.整合 dotnet test 命令
首先將 dotnet test 命令整合成一個指令碼,指令碼如下:
#是否執行當前指令碼 execute=$1 #test專案全路徑 testDir=$2 if [ ${execute} == false ];then echo "7tiny: There is nothing to execute!" exit 0 fi echo "7tiny:begin test..." #使用這個方法需要在test專案裡安裝nuget包:dotnet add package coverlet.msbuild dotnet test ${testDir} --logger:"trx;LogFileName=test.trx" /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:CoverletOutput='./TestResults/' if [ $? != 0 ];then exit 1 fi echo "7tiny:test finished!" exit 0
引數:
- execute:是否執行指令碼(便於和jenkins的checkbox結合,如不需要傳true即可)
- testDir:test專案 xxxtexst.csproj 檔案完整目錄地址
2.整合 dotnet sonarscanner 命令
#是否執行當前指令碼 execute=$1 #要構建的解決方案名稱 solutionName=$2 #.sln檔案全路徑 solutionDir=$3 if [ ${execute} == false ];then echo "7tiny: There is nothing to execute!" exit 0 fi echo "7tiny:begin scanner..." export PATH=${PATH}:${HOME}/.dotnet/tools dotnet sonarscanner begin /k:${solutionName} /n:${solutionName} /v:${BUILD_NUMBER} if [ $? != 0 ];then exit 1 fi dotnet build ${solutionDir} if [ $? != 0 ];then exit 1 fi dotnet sonarscanner end if [ $? != 0 ];then exit 1 fi echo "7tiny:scanner finished!" exit 0
引數:
- execute:是否執行指令碼(便於和jenkins的checkbox結合,如不需要傳true即可)
- solutionName:要構建的解決方案名稱
- solutionDir:.sln檔案全路徑
指令碼里面預設將解決方案的名稱當作 sonarqube 中的專案名稱;將 jenkins 編譯的版本號當作 sonarqube 的活動編號;
3.將shell指令碼到伺服器 jenkins 可以訪問的目錄
我們將上述兩個 shell 指令碼存為 xxx.shell 並存放到伺服器上,以便使用 jenkins 呼叫執行,比如我這裡將兩個檔案存到了伺服器某位置:
【將shell指令碼整合到jenkins中】
有了shell 指令碼,那麼 jenkins 的整合便非常容易了,我們只需要在 jenkins 的 shell 命令框呼叫寫好的 shell 指令碼, 並將引數傳遞進去即可。
例如:
開啟 jenkins 中的的某個專案的專案配置:
然後在最下面的 Build 區域 Execute Shell 框內填寫相應的 shell 命令,當然是呼叫我們的 shell 指令碼:
依次呼叫了:
- 編譯打包釋出nuget
- 執行test
- 執行sonar canner
每個指令碼的第一個引數都是是否執行,以便於我們配置 checkbox 決定是否執行某個指令碼,其他引數按順序傳入即可。
checkbox 的配置方式:
我這裡選擇 boolean 引數的配置,然後我們在 build 的時候就可以自行決定是否選擇。
【Jenkins編譯執行程式碼分析】
我們本次不進行nuget打包,只進行程式碼分析,因此選擇程式碼分析的 checkbox :
點選 Build 然後靜候執行的結果,通過 jenkins 的日誌,我們可以看出程式碼分析結果已經成功推送到了 sonarqube。
我們可以開啟 sonarqube 的對應專案進行檢視:
通過結果我們可以看出,本次構建相對於上次構建的結果,新加的程式碼的單元測試覆蓋達到了百分百,且沒有任何程式碼不規範和漏洞,但是歷史的程式碼還有很多的漏洞需要填補。
【總結】
使用 sonarqube 分析dotnet core/C#程式碼的全部過程以及整合jenkins已經完成了,通過通用的指令碼,我們可以方便地應用到多個專案中。
如有任何疑問,歡迎在評論區討論~