SonarQube系列三、Jenkins整合SonarQube(dotnetcore篇)

7tiny發表於2019-08-14

【前言】

本系列主要講述sonarqube的安裝部署以及如何整合jenkins自動化分析.netcore專案。目錄如下:

  1. SonarQube系列一、Linux安裝與部署
  2. SonarQube系列二、分析dotnet core/C#程式碼
  3. SonarQube系列三、Jenkins整合SonarQube(dotnetcore篇)

【實現功能】

  這篇文章將要介紹的主要內容如下:

  1. 將上一篇文章中的sonarqube命令整合為shell指令碼
  2. 將 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 指令碼:

依次呼叫了:

  1. 編譯打包釋出nuget
  2. 執行test
  3. 執行sonar canner

每個指令碼的第一個引數都是是否執行,以便於我們配置 checkbox 決定是否執行某個指令碼,其他引數按順序傳入即可。

checkbox 的配置方式:
我這裡選擇 boolean 引數的配置,然後我們在 build 的時候就可以自行決定是否選擇。

【Jenkins編譯執行程式碼分析】

我們本次不進行nuget打包,只進行程式碼分析,因此選擇程式碼分析的 checkbox :

點選 Build 然後靜候執行的結果,通過 jenkins 的日誌,我們可以看出程式碼分析結果已經成功推送到了 sonarqube。

我們可以開啟 sonarqube 的對應專案進行檢視:

通過結果我們可以看出,本次構建相對於上次構建的結果,新加的程式碼的單元測試覆蓋達到了百分百,且沒有任何程式碼不規範和漏洞,但是歷史的程式碼還有很多的漏洞需要填補。

【總結】

使用 sonarqube 分析dotnet core/C#程式碼的全部過程以及整合jenkins已經完成了,通過通用的指令碼,我們可以方便地應用到多個專案中。

如有任何疑問,歡迎在評論區討論~

相關文章