[Jenkins]持續整合之路(九)程式碼度量(SourceMonitor)

上一篇,我們用cloc.exe 自動計算程式碼行數作為程式碼開發進度的概觀,但如果想調查專案中的程式有沒有波動拳的情形(很深的巢狀邏輯),觀察程式碼複雜度、可維護性指數都是找出快打旋風Ryu與Ken的方法。

在時間還是充裕的時候,也許我們人工Review時可以用上Visual Studio擴充套件的CodeMaid或是Visual Studio 內建的程式碼度量(Code Metrics)功能來識別出潛在的技術債,不過,在自動化持續整合階段,如果沒用SonarQube,要找一個設定方便,資訊又完整的就令人傷腦筋。

 

來試試SourceMonitor.exe,同時用上兩個plugin來產生線上報表。

波動拳.gif圖片來源: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

1.下載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 Version 3.5

SourceMonitor License Agreement

Command Line Transformation Utility (msxsl.exe)下載

ithome鐵人賽 kirkchen 使用Jenkins打造.Net CI Server系列 第 16 篇 CI Server 16 - 整合程式碼複雜度及深度報表 (Source Monitor)