Jenkins持續整合設定 for .Net

DevOps的領域未來越夯,持續整合也越來越被許多團隊所重視。而在持續整合的過程中,自動化測試也是團隊在開發上很重要的一道流程。此外,在持續整合的過程中,自動化產生Live doucment也是很重要的。Live document由CI server根據BDD的測試案例自動化產生,可以避免系統功能改變了,系統文件卻沒有跟著修正的問題。

本篇文章將說明如何使用Jenkins建置並設定CI server,並且讓CI Server上的Job可以從抓取得程式碼、編譯、自動化測試、產生報表、發佈報表,所有動作只需要一鍵完成。

Plugin 下載與設定

大家可以從Jenkins官網下載Jenkins安裝黨,當安裝好Jenkins後,可以透過瀏覽器連到http://localhost:8080就可以看到Jenkins的管理畫面,點選左方的Manage Jenkins就可以進入到Jenkins的系統管理畫面,

接著,進入Manager Plugins進行Plugins的安裝,在這邊總共需要安裝三個Plugin,分別是

  • Git plugin
  • MsBuild plugin
  • Html Publisher plugin

安裝的Plugin時,可以先透過右上方的搜尋,搜尋到想要安裝的Plugin,例如搜尋"git",會列出符合的Plugin,找到Git Plugin後將左邊的框框打勾,就可以按下方的 "Download new and install after restart"

接著就會進入到安裝畫面,雖然剛剛選的是 "Download new and install after restart",但是不知道為什麼安裝完成後並重新啟動Server的選項並沒有打勾,所以這邊需要手動勾選一下

請依照上述流程將三個套件都安裝完成。安裝完成後就可以回到Jenkins的系統管理畫面,對剛剛安裝的Plugins進行設定

在這邊需要對Git plugin和MsBuild plugin進行設定。

這邊需要針對Git plugin和MsBuild plugin設定.exe的路徑,這個路徑會隨著每個人安裝Git和MsBuild的路徑有所不同。

設定完成後,就可以回到一開始的管理畫面新增一個Job了。點選左邊的 "New Item"會進入到新增Job的畫面,填入Item name並且點選下面的 "Freestyle project",就完成新增一個Job。

完成新增Job後,還需要設定這一個Job需要做哪些事,這邊我們希望Jenkins幫我們做的事有

  • 從 Git server取得最新的程式碼
  • 編譯程式碼
  • 自動化測試
  • 產生測試結果報表
  • 產生Live document

首先,先設定Git的部分,填入Git server repository URL以及要抓的分支名稱,如果有需要身分驗證的話,可以在下方新增

當按下 "Add"後,會彈出一個視窗可以新增帳號密碼

Git的部分完成設定後,就可以接著設定MsBuild的部分,按下 "Add build step",選擇 "Build a Visual Studio project or solution using MSBuild",就可以新增一個Build的步驟

在 "MSBuild Version"的地方選到剛剛在系統管理畫面新增的MsBuild,再填入.sln的名稱

在 "MSBuild Build File"的地方很容易會有路徑的問題。

通常設定到這邊,筆者會先習慣進行Jenkins Build的動作,確認這兩個步驟設定上是否正確,待確認設定上沒有問題後再繼續其他設定。

執行Job

當要執行一個Job時,可以到Job的管理畫面按下 "Build Now"就會啟動Job

當整個過程沒有發生任何錯誤就會看到藍燈

但是,通常在設定上不會那麼順利,一定都會遇到一些錯誤,當Job執行結果是失敗的話,點選Build History裡的編號,可以進到這一次Build的管理畫面

再點選 "Console Output",就可以看到Build整個過程的輸出

而Build失敗的原因有很多可能,不過常見的設定錯誤大概有幾種

  • Git Server設定錯誤,Repository URL有誤、帳號密碼不正確
  • Job的MsBuild設定有誤,最常見的就是.sln路徑錯誤
  • MsBuild所需要的系統檔案不存在Server上
  • 執行的.bat .cmd .ps1有誤。

可能還會有其他原因,不過重點在於查看Build過程的輸出,通常都是可以找到Build失敗的原因。例如在下方的圖片就可以看到Console output的輸出中,明確告知了有一些檔案不在預設的路徑中

查看Console Output很重要

由Specflow feature檔產生MSTest的測試案例

如果專案的測試案例是利用Specflow撰寫BDD的Feature檔,則必須先利用Specflow.exe產生MSTest.ext看得懂的測試案例。

set "jobName=%1"
set "testProjectName1=%2"
set "specflowVersion=%3"

set "projectPath=C:\Program Files (x86)\Jenkins\jobs\%jobName%\workspace"
set "projectPackagePath=packages\%specflowVersion%\tools"

cd "%projectPackagePath%"
specflow.exe generateAll "%projectPath%\%testProjectName1%" /force /verbose
指令中的路徑會因為安裝或設定而有所不同。

在Job的設定需要新增一個 "Execute Windows batch command",按下 "Add build step"即可看到這一個選項。此外,在batch command的輸入框中可以使用 "%JOB_NAME%"取得現在Job的名稱。

MSTest and Specflow report

產生完了MSTest的測試案例,就可以執行MSTest.exe進行測試

set "projectPath=C:\Program Files (x86)\Jenkins\jobs\%1\workspace"
set "projectTestPath=%projectPath%\%2"
set "projectName=%3"
set "environment=%4"
set "packagePath=%projectPath%\packages\%5\tools"
set "resultName=%projectName%"

if not exist "%projectPath%\TestResults" mkdir "%projectPath%\TestResults"
if not exist "%projectPath%\SpecflowResults" mkdir "%projectPath%\SpecflowResults"

if Exist %projectPath%\TestResults\%resultName%.trx
del "%projectPath%\TestResults\%resultName%.trx

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\MSTest.exe" /testcontainer:"%projectTestPath%\bin\%environment%\%projectName%.dll" /resultsfile:"%projectPath%\TestResults\%resultName%.trx" 

set "testResult=%errorlevel%"   

"%packagePath%\specflow.exe" mstestexecutionreport "%projectTestPath%\%projectName%.csproj" /testResult:"%projectPath%\TestResults\%projectName%.trx" /out:"%projectPath%\SpecflowResults\%projectName%.html"

exit /b %testResult%

這一個部分的指令會稍微長一點,因為除了進行MSTest.exe外,還使用Specflow.exe來產生比較容易看的測試報告。這邊稍微解釋一下指令做了哪些事

  1. 先檢查要放測試報告的資料夾是否存在,不存在則新增資料夾
  2. 檢查MSTest.exe所產生的測試報告是否已經存在,由於MSTest.exe比較特別,當已經有同檔名的測試報告存在時則會執行失敗,所以這邊需要特別檢查是否需要刪除同檔名的檔案
  3. 執行MSTest,並且將執行結果記錄下來,稍後會使用到
  4. 產生Specflow的測試報告
  5. 回傳執行結果

在Job的設定一樣也是新增一個 "Execute Windows batch command",比較特別的是這邊必須判斷收到的執行結果,如果收到執行失敗則需要中斷整個Build的流程。

產生Live document

這一個步驟主要和這一篇Pickles與Jenkins的結合中,所提到的步驟差不多,只是這邊會更貼近於實務上的應用,主要的差異為在這邊會將路徑都使用參數的方式傳入.cmd中。

set "projectPath=C:\Program Files (x86)\Jenkins\jobs\%1\workspace"
set "projectTestPath=%projectPath%\%2"
set "projectName=%3"

cd c:\Tools\Pickles.CommandLine.*.*.*\tools

pickles.exe run --feature-directory="%projectTestPath%" --output-directory="%projectPath%\PicklesResults\%projectName%" --documentation-format="dhtml" --test-results-format=mstest --link-results-file="%projectPath%\TestResults\%projectName%.trx"

在Job的設定一樣也是新增一個 "Execute Windows batch command"

Publish Test Report

在一開始有提到需要安裝 Html Publisher plugin,就是為了能夠在Jenkins Server上直接可以看到上述步驟所產生的檔案。按下 "Add post-build action"後,可以看到新增 "Publish HTML reports",新增後需要設定路徑及HTML的名稱。附帶一提,在 "Index page[s]"的地方是可以填入多個HTML名稱,中間只需要用逗號隔開,在Report的頁面上則會使用頁籤方式供瀏覽者切換。

Specflow report

Live document

Live document的部分,請依照Pickles與Jenkins的結合文章中提及的安全性設定修改設定。

小結

雖然CI Server在第一次設定上相當的麻煩,但是這卻是CP值非常高的投資。怎麼說呢,當CI設定完成後,之後透過定期的建置可以讓專案整合或是建置上的問題在最早的時間被發現。此外,當團隊已經花時間寫測試,更是需要透過CI Server來定期執行自動化測試,因為工程師在寫完一個功能並且有包含測試,但在本機往往不會執行全部的測試案例,而只針對新開發的功能執行測試。如此一來,當改A壞B的情況發生就不會立即被發現,而這個時候CI Server絕對會是最後一道有力的防線,因為CI Server上會定期執行全部的測試案例,這個時候改A壞B的情形就會被及早發現。

而當完成持續整合,也才有辦法繼續進行持續佈署,但是因為持續佈署牽涉到的環境、程式類型、佈署方式有太多的變因,所以在這邊就不多做討論。但是,持續佈署絕對也是一個非常有價值的投資項目。

參考資料

免責聲明:

"文章一定有好壞,文章內容有對有錯,使用前應詳閱公開說明書"