Azure DevOps in Action - 在Build Pipeline當中加入自動化程式碼檢查
在CI Pipeline當中,想要持續提升開發品質,除了單元測試,靜態程式碼檢查也很重要。在Build Pipeline運行過程中,適度的加上程式碼檢查工具,可以幫助我們掃描程式碼的狀況,檢查是否有具有潛在風險的程式碼。
我們常聽到的程式碼壞味道(code bad smells),或是技術債(technical debt),都是靜態程式碼檢查的主要標的。
技術債這個概念是1992年,由Ward Cunningham首次提出。而後常出現於Martin Fowler等大師的文章中。泛指為了縮短開發時程,而在開發過程中做出的妥協(像是安全性、測試、變數的命名…等)雖然可以得到立即的效果,但未來將可能連本帶利付上更大代價。
而SonarCloud,就是這類掃描工具中的翹楚,他是一個獨立的第三方產品,但可以跟Azure DevOps Pipeline做很好的整合。
要在Build Pipeline當中加入SonarCloud進行程式碼檢查非常容易,你只需要到SonarCloud.io申請帳號,並且在Azure DevOps站台上安裝免費套件後,即可進行這樣的掃描。
整個服務完全免費。
安裝SonarCloud
要使用該服務在Build Pipeline上,首先得安裝套件,請至底下網址:
https://marketplace.visualstudio.com/items?itemName=SonarSource.sonarcloud
在出現下列畫面時,選擇 Get it free:
接著在出現的畫面中,選擇你的組織(站台),然後按下Install即可:
安裝完成後,你會發現在建立Pipeline的時候,多了幾個Tempalte:
上面這幾個『…With SonarCloud』的Build Process Tempalte,就是安裝套件後,自動幫您加上的。針對 .Net Core和傳統 .Net Framework環境的開發專案,都有著適合的建置範本可供參考。
申請帳號
在使用之前,我會建議你,先到https://sonarcloud.io/ 這個站台建立帳號,你只需要透過Azure DevOps帳號(也就是MS Account)即可以Single-Sign-On的方式,取得SonarCloud帳號:
進入SonarCloud的Portal後,你可以在畫面右上角看到你的個人帳號,你可以依照需要,新增組織(organization)或專案(project):
你可以選擇上圖1,在既有的組織之下,建立一個新的專案:
首先選擇的是組織名稱(或是建立新組織,上圖2),建立專案比較重要的是設定專案的Key(上圖3),這個Key必須是唯一的,它會跟你的Build Pipeline連結在一起,我會建議你可以把你的Azure DevOps站台名稱,加上專案名稱再加上特定的序號,以此作為Project Key即可,因為該Project Key必須是全球唯一的。這個Key將會作為Build Pipeline將要生成的報表、與SonarCloud專案連結的關鍵。
舉例來說,我在Azure Devops中有一個站台『mytestaz400』,而其中有個專案『testBmiBuild』,該專案的網址就會是:
https://dev.azure.com/mytestaz400/testBmiBuild
那用在這個專案上的project key,我可能就會用底下這樣:
mytestaz400-testBmiBuild-001
其實,你用『mytestaz400-testBmiBuild』當然也行,但有鑑於你的專案中可能有多個Repos,而每一個Repos都可能會有多條Pipeline,所以後面加上『-001』似乎比較理想。
當然,你要在key中再加上Repo Name + Pipeline Bame也可以,看起來更無敵,但這樣就會顯得Project key很長,似乎有些不便。
好,總之填好一個唯一的Project key,並且確認無誤之後,預設狀況下,display name(下圖)會和project key相同,其實無須修改。
有一個地方稍微留意一下,你會發現該專案目前是Public的(下圖A)並且似乎無法修改:
沒錯,因為你採用的是免費方案,預設狀況下無法修改,如果想要改成Private專案,則必須升級(付費)。
那免費專案有什麼缺點呢?
嗯…其實倒也還好,就是你的掃描報告是公開在網際網路上的,任何人只要知道了你的Project key,都有機會可以看到你的掃描結果(其中還包含你該部分的source code)。這一點確實可能造成一些資安顧慮。你可能會擔心如果有人猜到你專案的這個key,豈不是全被看光了嗎? 是啊,所以或許你可以考慮把project key再設定的長一點。(或是乾脆付費成為正式會員吧…) 😊
好,不管如何,最後請按下『Set up』鈕,並牢記你的Project key,我們要接著後續的步驟了…
建立含有SonarCloud掃描的Pipeline
得到了Project Key之後,接著,我們可以回到Pipeline,後面我們以 .net core為例子,底下是填寫Task的參數時幾個主要的關鍵:
首先是上圖A的部分,我們必須建立一個SonarCloud的Service Endpoint,你可以點選『+New』,在跳出的視窗中,輸入Token與連線名稱:
但這個Token該如何取得呢?
你可以在剛才的SonarCloud的Portal,點選My Account --> Security即可產生一個新的Token:
好的,順利取得Token,建立好連線之後,我們重新回到Pipeline:
若連線建立正確,這時候你應該可以很順利地下拉出你的組織(如上圖),選定組織之後,填寫剛才一開始我們取得的Project Key:
完成之後, Pipeline也就設定完成了。
運行程式碼掃描
接著,你可以試著運行這個Pipeline,你會發現,在運行完SonarCloud的『Run Code Analysis』Task之後,報告就出現在底下的網址了
如果你仔細觀察,該網址其實就是剛才你設定的Project Key。
開啟該頁面,你會看到類似底下這樣的畫面:
其中包含了我們最關心的Bugs(上圖B),以及安全性問題(上圖E),技術債(上圖C)以及程式碼壞味道(上圖D)。
我們可以點進去細看問題來源,例如當你點選上圖E中的安全性問題,會發現,它幫我們檢查到我們的 .net core程式碼中有一行潛在的風險:
上面這行code(34行),是讓專案在開發階段碰到執行階段錯誤時,呈現較多錯誤訊息的指令,一般來說我們會建議在正式機上不要這樣寫,以避免可能的資安風險。
你會發現SonarCloud不只幫你掃描,也告訴你為何它認為這是一個問題:
另外,像底下這個建議,則是潛在的技術債建議:
這是因為我們在程式碼中把一個變數設為Public了,其實是沒有必要的。
凡此種種,都是SonarCloud幫我們透過掃描程式碼所發現的可能問題。妥善地逐一檢視這些問題並著手解決,絕對會有效地提升開發品質。
SonarCloud和Azure DevOps算整合得很相當緊密,是一個很值得使用的工具。
留言