上一篇,我們用cloc.exe 自動計算程式碼行數作為程式碼開發進度的概觀,但如果想調查專案中的程式有沒有波動拳的情形(很深的巢狀邏輯),觀察程式碼複雜度、可維護性指數都是找出快打旋風Ryu與Ken的方法。
在時間還是充裕的時候,也許我們人工Review時可以用上Visual Studio擴充套件的CodeMaid或是Visual Studio 內建的程式碼度量(Code Metrics)功能來識別出潛在的技術債,不過,在自動化持續整合階段,如果沒用SonarQube,要找一個設定方便,資訊又完整的就令人傷腦筋。
來試試SourceMonitor.exe,同時用上兩個plugin來產生線上報表。
圖片來源:https://zh.wikipedia.org/wiki/%E6%B3%A2%E5%8A%A8%E6%8B%B3
步驟分為:
- Jenkins Server安裝SourceMonitor
- 使用GUI產生SourceMonitor專案檔
- 準備SourceMonitor Command File
- Jenkins安裝SourceMonitor Plugin vs HTML Publisher PlugIn
- 下載Command Line Transformation Utility (msxsl.exe)
- Config CI Job
Jenkins Server安裝SourceMonitor
首先就是在預備掃描的Jenkins Server上安裝SourceMonitor
安裝完畢
啟動SourceMonitor之後,打開選單File > Options
勾選Allow parsing of UTF-8 files,按下確定。
使用GUI產生SourceMonitor專案檔
在Jenkins Server上,打開SourceMonitor
File > New Project
選擇程式語言,確認後,按下一步按鈕
選擇SourceMonitor專案檔放置位置,確認後,按下一步按鈕
選擇程式碼位置(這邊要選Build Server上workspace\job),確認後,按下一步按鈕
....
設定完畢!按下完成按鈕。
從CI Job的workspace資料夾,多了Log.smproj專案檔
準備SourceMonitor Command File
由於我們將以Command Line的方式執行SourceMonitor,因此必須準備一個Command File。
打開Visual Studio,在Log專案下,新增一個名為SourceMonitorCommand.xml的組態檔案,Command File內容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<sourcemonitor_commands>
<write_log>true</write_log>
<command>
<project_file>C:\Program Files (x86)\Jenkins\workspace\Log-StyleCop\Log.smproj</project_file>
<source_directory>.\</source_directory>
<project_language>C#</project_language>
<file_extensions>*.cs</file_extensions>
<include_subdirectories>true</include_subdirectories>
<parse_utf8_files>true</parse_utf8_files>
<ignore_headers_footers>3</ignore_headers_footers>
<export>
<export_file>SourceMonitorReport.xml</export_file>
<export_type>2</export_type>
<export_option>Include method metrics: option 3</export_option>
</export>
</command>
</sourcemonitor_commands>
需要修改SourceMonitor專案檔.smproj所在資料夾路徑。
*export_type要設定為2(checkpoint details as XML),才會產生明細。
Jenkins Server 安裝SourceMonitor Plugin vs HTML Publisher PlugIn
雖然目前已經有SourceMonitor的plugin了,但呈現的結果比較簡單,因此我們同時也採用先將xml報表檔透過msxsl.exe轉換為HTML檔案後再使用HTML Publisher Plugin呈現。
管理Jenkins > 管理外掛程式
可用的Tab > 過濾條件輸入sourcemonitor > 勾選SourceMonitor> 按下直接安裝按鈕
可用的Tab > 過濾條件輸入HTML Publisher> 勾選HTML Publisher> 按下直接安裝按鈕
下載Command Line Transformation Utility (msxsl.exe)
透過微軟官方網址下載轉換工具後,放到Jenkins根目錄的tools資料夾
把兩個XSL轉換設定檔也從github複製下來,放到Jenkins根目錄的tools資料夾
如果有需要調整每次顯示的筆數從15筆放大到50筆,可以將SourceMonitorSummaryGeneration.xsl檔案內的16,改為51。
Config CI Job
打開Jenkins管理網頁,組態Log的CI JOB,新增建置步驟-Windows批次指令: 透過SourceMonitor.exe產生報表檔後,再呼叫msxsl.exe轉換為html
cd "C:\Program Files (x86)\SourceMonitor"
SourceMonitor.exe /C "%WORKSPACE%/Log/SourceMonitorCommand.xml"
cd "%JENKINS_HOME%\tools"
msxsl.exe "%WORKSPACE%/SourceMonitorReport.xml" SourceMonitorSummaryGeneration.xsl -o "%WORKSPACE%/SourceMonitorSummaryGeneration.xml"
msxsl.exe "%WORKSPACE%/SourceMonitorSummaryGeneration.xml" SourceMonitor.xsl -o "%WORKSPACE%/SourceMonitorResult.html"
設定完畢後,按下儲存按鈕。
新增建置後動作,按下新增按鈕
設定網頁名稱為SourceMonitorResult.html,設定完畢後,按下最下方的儲存按鈕。
建置前,我們打開log專案的log.cs程式,馬上加入波動拳的武功,然後簽入(check-in)程式。
public void ComplexWrite()
{
if (1000 % 2 == 0)
{
if (1000 % 2 == 0)
{
if (1000 % 2 == 0)
{
if (1000 % 2 == 0)
{
if (1000 % 2 == 0)
{
if (1000 % 2 == 0)
{
if (1000 % 2 == 0)
{
if (1000 % 2 == 0)
{
if (1000 % 2 == 0)
{
if (1000 % 2 == 0)
{
if (1000 % 2 == 0)
{
if (1000 % 2 == 0)
{
if (1000 % 2 == 0)
{
if (1000 % 2 == 0)
{
if (1000 % 2 == 0)
{
if (1000 % 2 == 0)
{
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
使用Visual Studio擴充套件CodeMaid觀察程式複雜度: 17
*複雜度是計算程式流程中不同程式碼路徑的數目。
好,可以起風了!
馬上建置後,回到JOB的管理頁面,多了一個HTML Report,也多了SourceMonitor Result兩個plugin呈現的結果。
SourceMonitor Result plugin呈現的結果: 最複雜的方法是log類別的ComplexWrite()方法,複雜度17。
HTML Report
小結
- 第一次設定Jenkins自動執行SourceMonitor執行掃描時,覺得動作很繁瑣,幾年後,還是覺得很繁瑣。
- 人會犯錯,程式會有Bug,使用工具實踐自動化,提升程式隱藏中的品質。
- 走向持續整合之路,專案的透明度越來越高了。
2017.6 北海道東部的摩周湖,位在阿寒國立公園內,曾測出最能見深度為41.6m,曾是世界上最透明的湖泊。
參考
SourceMonitor License Agreement
Command Line Transformation Utility (msxsl.exe)下載
ithome鐵人賽 kirkchen 使用Jenkins打造.Net CI Server系列 第 16 篇 CI Server 16 - 整合程式碼複雜度及深度報表 (Source Monitor)