Sonarqube結合Jenkins與常見問題
我們引入sonarqube元件的最終目的是要為整個Ci環境服務的,如果不能整合於當前的Jenkins CI,那麼我們做的很多關於sonarqube的工作都將是徒勞的.然而這一點幾乎不用擔心,因為我們從前面的講解可以看到我們的構建操作都是通過命令列來進進行的,從這一點來看應該是可以無縫的整合到jenkins環境,然而我們把命令原封搬到Jenkins上發現,事情並不像想像的那麼簡單,而是有各種各樣的坑存在.
我們執行以下前面章節執行過的程式碼,看看會出現什麼問題:
MSBuild.SonarQube.Runner.exe begin /k:"mytest" /n:"mytest" /v:"v8.0" /d:sonar.cs.opencover.reportsPaths="%CD%\testcover.xml"
msbuild.exe
"E:\personalproject\newTest2018\ConsoleApp1\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe" -output:"%CD%\testcover.xml" -register:user -target:"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" -targetargs:"%CD%\bin\Debug\NunitTest.dll"
MSBuild.SonarQube.Runner.exe end
執行以上命令根據可能會出現以下問題:
問題1 命令找不到
可能會有童鞋遇到MSBuild.SonarQube.Runner.exe
is not recognized as an internal or external command,operable program or batch file.
當然可能有些童鞋不會遇到這個問題,這主要取決於環境變數path的設定
可以看到這個介面有兩個地方可以設定path,上面是使用者級別的,下面是系統級別的,如果你是在上面使用者級別設定的path,則Jenkins無法讀取到(這裡僅僅是指預設情況下)當前使用者變數的,因為Jenkins執行使用者和當前使用者並不是同一個使用者.(大家可以在jenkins裡執行whoami來看下jenkins裡的執行使用者).這裡有兩個解決辦法:第一種辦法就是指定可執行檔案MSBuild.SonarQube.Runner.exe
的完整路徑(其它可執行檔案也一樣),第二,把環境變數新增到全域性配置裡.加到全域性變數裡雖然方便了,但是全域性變數的總長度是有限制的,如果配置的過多很容易超出限制,還有一點問題就是像mono在安裝的時候全自動新增很多環境變數,如果使用者裝了mono,使用全域性的msbuild編譯有時候會造成編譯的結果和指定完整路徑的編譯結果不一致,這一點請使用者自己斟酌.
問題2 相對路徑問題
以上程式碼中我們使用了%CD%
,我們前面的示例都是在工程目錄下執行的,%CD%即為當前目錄,而在Jenkins環境中,當前目錄是Jenkins\workspace\專案名
,如果處理不當,會導致編譯錯誤.
第二段msbuild.exe
也是一樣問題,它必須在工程目錄下的時候才不需要指定要編譯的專案名,如果當前目錄下沒有sln或者csproj檔案,則需要顯式指定項專案檔案的完整路徑如msbuild.exe "E:\personalproject\newTest2018\ConsoleApp1\NunitTest\NunitTest.csproj"
問題3 路徑是否需要加引號
這其實是一個常見的問題,我們會發現有時候路徑不帶引號不會出現問題,有時候會出現問題,就筆者的經驗,如果路徑中沒有空格則不用加引號,如果有則需要加引號.因此為了避免不必要的麻煩,建議的最佳實踐是路徑都加上引號.
問題4 預設Jenkins賬戶無法編譯Sonarqube專案
我們把所有的問題都解決完之後,會發現Jenkins仍然構建失敗,提示資訊如下Running the Scanner for MSBuild under Local System or Network Service account is not supported. Please, use a local or domain user account instead.
以上錯誤明確提出,Sonarqube MSbuild 掃描器不支援本地系統賬戶或者網路服務賬戶,需要使用普通賬戶登陸.下面我們講一下如何處理這個問題.
我們開啟windows cmd執行whoami檢視一下當前使用者:
右擊我的電腦
選擇管理
然後從管理介面裡面找到服務
或者在cmd介面輸入services.msc
來開啟服務管理介面,從服務管理介面找到jenkins
服務,右鍵點選屬性
,在彈出的對話方塊中切換到登陸
標籤,如果沒有登陸則是本地敗,我們選擇此賬戶
然後輸入賬戶和密碼點選確定.
完成以上操作以後重新啟動jenkins服務然後再執行指令碼,就可以編譯通過了.