Visual Studio 的 Managed Code 程式碼分析有兩種, 本文件採用 FxCop 靜態程式碼分析配合閘道簽入強制簽入時進行程式碼分析
(1) Project (Right-click) > Properties
(2) Code Analysis > Enable Code Analysis on Build > Select the rule set
(3) [Option] 建立自定義 Rule Sets
a. 選取 Code Analysis > Enable Code Analysis on Build > 選取 Microsoft Managed Minimum Rules > 選取 Open
b. 取消 Show rules that are not enabled, 點選 Add or remove child rule sets
c. 新增 Microsoft Security Rules
d. 將自定義的 Rule set 存檔, File > Save ManagedMinimunRules.ruleset as
e. 儲存為自定義的 Ruleset 檔案, 例如 ContosoCA2017.ruleset
(4) [Option] 選擇自定義 Rule Sets
(5) 將專案重新 Build, 測試 Code Analysis 結果
(6) 確認 Output 結果
(7) 從 Error List 點選 Code Analysis 紀錄連線
(8) 開啟錯誤說明網頁, 參考說明文件進行修正
閘道簽入 (Gated Check-in) 功能主要是防止有缺陷的 Code 被簽入 Repository 中, 造成共同開發者取得有缺陷的原始碼, 導致無法正常編譯. 在程式碼控制的一種策略會考慮將開發環境 (Dev), 整合測試環境(SIT), 驗證環境(UAT)與生產環境(PROD)獨立開發. 以下分支的結構範例 Dev -> SIT -> UAT -> PROD. 在過版的流程中, 當 UAT 程式碼要過版到 PROD 環境時, 可以利用 閘道簽入來確保程式碼必須要完成 Code Analysis 才能夠簽入.
(1) 建立 PROD Build Pipeline
a. 開啟 TFS, 選取 Build & Release > + New 建立 Build Pipeline
b. 選取 Empty process
c. 加入以下的 Task
(a) 設定 Get Sources Task: Map 部分, 請選擇 PROD, 目的是 Gated Check-in 將會以這個路徑下的檔案 Tigger 簽入檢查
(b) NuGet restore 使用預設值
(c) MSBuild 參數需要加入 /p:RunCodeAnalysis=true;CodeAnalysisRuleSet=C:\RuleSets\ContosoCA2017.ruleset 啟用 Code Analysis, 此外需要將 專案中的 ContosoCA2017.ruleset 客製 Rule Set 複製到 Build Server 中的 C:\RuleSets 路徑
(d) Publish Artifact 使用以下的設定
(2) 設定閘道簽入: 在 Build Pipeline 選取 Triggers > 設定 Trigger 為啟用狀態 > 確認 Use workspace mapping for filters 為啟用
(3) 模擬閘道簽入情境
a. 在 Visual Studio 修改 UAT 程式碼 (Views/Home/index.cshtml)
b. 簽入 UAT 程式碼
c. Merge UAT 程式碼到 PROD
(a) Source Control Explorer, 選取 UAT > 按滑鼠右鍵 > Branching and Merging > Merge
(b) Target Branch 選取 PROD
(c) Merge 最新版本
(d) Finish 完成 Merge 精靈設定, 進行 Merge
d. 簽入 PROD 程式碼
(a) 開啟 PROD 專案, 選取 Source Control > Check in...
(b) Check in merge from UAT
(c) 出現 Gated Check-in 提示, 選取 Build Changes
(d) 檢查 TFS Server 上的 Build 結果, 從 Pending Changes console 點選 here
(e) 從 Visual Studio Build Request Console 點選 Build Id.
(5) 檢視 Build 結果, 可以確認 Gated Check-in 已經將 Merge 的程式碼 Build 完成 Code Analysis 並且順利 Check in 到 Repository