Azure DevOps in Action - 在Build Pipeline當中加入自動化程式碼檢查

enter image description here
在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:
enter image description here

接著在出現的畫面中,選擇你的組織(站台),然後按下Install即可:
enter image description here

安裝完成後,你會發現在建立Pipeline的時候,多了幾個Tempalte:

enter image description here

上面這幾個『…With SonarCloud』的Build Process Tempalte,就是安裝套件後,自動幫您加上的。針對 .Net Core和傳統 .Net Framework環境的開發專案,都有著適合的建置範本可供參考。

申請帳號

在使用之前,我會建議你,先到https://sonarcloud.io/ 這個站台建立帳號,你只需要透過Azure DevOps帳號(也就是MS Account)即可以Single-Sign-On的方式,取得SonarCloud帳號:
enter image description here

進入SonarCloud的Portal後,你可以在畫面右上角看到你的個人帳號,你可以依照需要,新增組織(organization)或專案(project):
enter image description here

你可以選擇上圖1,在既有的組織之下,建立一個新的專案:

enter image description here

首先選擇的是組織名稱(或是建立新組織,上圖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)並且似乎無法修改:
enter image description here

沒錯,因為你採用的是免費方案,預設狀況下無法修改,如果想要改成Private專案,則必須升級(付費)。

那免費專案有什麼缺點呢?

嗯…其實倒也還好,就是你的掃描報告是公開在網際網路上的,任何人只要知道了你的Project key,都有機會可以看到你的掃描結果(其中還包含你該部分的source code)。這一點確實可能造成一些資安顧慮。你可能會擔心如果有人猜到你專案的這個key,豈不是全被看光了嗎? 是啊,所以或許你可以考慮把project key再設定的長一點。(或是乾脆付費成為正式會員吧…) 😊

好,不管如何,最後請按下『Set up』鈕,並牢記你的Project key,我們要接著後續的步驟了…

建立含有SonarCloud掃描的Pipeline

得到了Project Key之後,接著,我們可以回到Pipeline,後面我們以 .net core為例子,底下是填寫Task的參數時幾個主要的關鍵:

enter image description here

首先是上圖A的部分,我們必須建立一個SonarCloud的Service Endpoint,你可以點選『+New』,在跳出的視窗中,輸入Token與連線名稱:

enter image description here

但這個Token該如何取得呢?

你可以在剛才的SonarCloud的Portal,點選My Account --> Security即可產生一個新的Token:

enter image description here

好的,順利取得Token,建立好連線之後,我們重新回到Pipeline:

enter image description here

若連線建立正確,這時候你應該可以很順利地下拉出你的組織(如上圖),選定組織之後,填寫剛才一開始我們取得的Project Key:

enter image description here

完成之後, Pipeline也就設定完成了。

運行程式碼掃描

接著,你可以試著運行這個Pipeline,你會發現,在運行完SonarCloud的『Run Code Analysis』Task之後,報告就出現在底下的網址了

如果你仔細觀察,該網址其實就是剛才你設定的Project Key。

enter image description here

開啟該頁面,你會看到類似底下這樣的畫面:

enter image description here

其中包含了我們最關心的Bugs(上圖B),以及安全性問題(上圖E),技術債(上圖C)以及程式碼壞味道(上圖D)。

我們可以點進去細看問題來源,例如當你點選上圖E中的安全性問題,會發現,它幫我們檢查到我們的 .net core程式碼中有一行潛在的風險:

enter image description here

上面這行code(34行),是讓專案在開發階段碰到執行階段錯誤時,呈現較多錯誤訊息的指令,一般來說我們會建議在正式機上不要這樣寫,以避免可能的資安風險。

你會發現SonarCloud不只幫你掃描,也告訴你為何它認為這是一個問題:
enter image description here

另外,像底下這個建議,則是潛在的技術債建議:
enter image description here

這是因為我們在程式碼中把一個變數設為Public了,其實是沒有必要的。

凡此種種,都是SonarCloud幫我們透過掃描程式碼所發現的可能問題。妥善地逐一檢視這些問題並著手解決,絕對會有效地提升開發品質。

SonarCloud和Azure DevOps算整合得很相當緊密,是一個很值得使用的工具。

留言

風~寫道…
請問如何在SQL SEVER中載入linebot做警示通知用

這個網誌中的熱門文章

在POC或迷你專案中使用 LiteDB

使用Qdrant向量資料庫實作語意相似度比對

使用 Airtable 在小型需求上取代傳統資料庫

專業的價值...

周末讀書會 - 一如既往