今年公司開始要導入CI(終於...),
所以就做了些研究和測試,
整合的技術如下:
Jenkins + SVN + C# + MSBuild + VSTest +Slack
====本文開始====
把近期用Jenkins做CI的一些流程和遇到的問題稍微整理一下。
建置的流程大致上是:
安裝Jenkins => 取得程式原始碼(SVN) => 安裝套件 => 建置(MSBuild) => 測試(VSTest) => 結果通知
- 安裝Jenkins
- 下載Jenkins
- 設定Proxy
如果所在的網路環境有Proxy,要正確設定,才能連到Jenkins Server下載Plug-In,
詳細的設定要請各位跟公司的MIS確認了.... - 下載Plug-In
在Jenkins主畫面 -> 管理Jenkins -> 管理外掛程式 中可以看到相關的Plug-In,
各種Plug-In原則上也在這個畫面下載。
!!!提醒!!!
一個新手可能會遇到的問題:
Jenkins 的 Plug-In,只是提供使用者在Jenkins上能做相關設定的介面,
實際上的執行檔案,還是要自行安裝喔~~~
- 新增專案
從Jenkins主畫面的"新增作業"新增專案,選擇"Free-Style"就可以了。
- 連線SVN
- 下載Plug-In:SubVersion Plug-In
- 設定原始碼位置
- 設定登入資訊
- Nuget package
因為專案用了很多Nuget套件,下載套件幾乎是一種必要之惡,
偏生公司的網路很給力,下載動作一直被擋,
後來的作法是手動把套件Copy Paste到Jenkins的專案資料夾下。
- 建立MSBuild與障礙排除
正如第一點的"提醒"說的,
建立MSBuild第一個遇到的問題就是要找到MSBuid的安裝檔,
我後來安裝了VS2017 BuildTools。- 安裝MSBuild:
有需要可以直接到官網下載,然後安裝自己需要的套件,
我主要安裝.net網站開發套件(C#)。 - 下載Plug-In:MSBuild PlugIn
在 Jenkins主畫面 -> 管理Jenkins -> 管理外掛程式 查詢並下載 - Jenkins 設定 MSBuild Tool
在 Jenkins主畫面 -> 管理Jenkins -> Global Tool Configuration 中設定使用MSBuild的路徑與版本,
因為我安裝的是VS2017 Build Tools,
所以MSBuild.exe的檔案路徑在"C:\Program File (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\"
如果電腦有裝很多版本的BuildTools,可以在這裡新增,
新增完之後,下一個步驟會用到
!!!提醒!!! 這邊的路徑,填入時沒有雙引號 - 專案中設定使用MSBuild
在專案-> 組態 -> 建置 中設定
我選擇的是"Build a Visual Studio project or solution using MSBuild",
需要設定的參數就是使用的BuildTools(在上一個步驟中設定),
設定的參數可以參考網路上的文章 - 障礙排除
建置時會遇到的幾個問題包含套件找不到(安裝Nuget)、套件版本錯誤等,
另外可能會遇到設定路徑錯誤等等。
- 安裝MSBuild:
- 建立VSTest與障礙排除
- 安裝VSTest
網路上看了一圈,微軟派目前應該會推薦採用VSTest.console.exe,
原因:MSTest只支援MSTest,VSTest支援MSTest / MSTest v2。
VSTest在前面安裝BuildTools時理論上會一起安裝,
我還好傻好天真的在網路上找了一大圈。
其實位置就在電腦裡,等下告訴你。 - 下載Plug-In:MSTest Plug-In / VSTest Runner Plug-In
在 Jenkins主畫面 -> 管理Jenkins -> 管理外掛程式 查詢並下載 - Jenkins 設定 VSTest Tool
在 Jenkins主畫面 -> 管理Jenkins -> Global Tool Configuration 中設定使用VSTest的路徑與版本,
因為我前面已經安裝了VS2017 Build Tools,
所以電腦中已經有VSTest.console.exe,
檔案路徑在"C:\Program File (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Extensions\TestPlatform\vstest.console.exe"
新增完之後,下一個步驟會用到
!!!提醒!!! 這邊的路徑,填入時有雙引號,而且需要填入完整路徑(含檔案名稱與副檔名) - 專案中設定使用VSTest
在專案-> 組態 -> 建置 中設定
在建置程序中加入Test,
我選的是"Run unit tests with VSTest.console",
建置跟測試的順序應該無關,但邏輯上要建置成功再進行測試比較合理。 - 障礙排除
建置時是指定建置的solution或project檔,
但測試時是指定測試專案的dll檔。
有幾個可能遇到的問題:- VSTest.console.exe的路徑設定錯誤:記得寫完整路徑以及確認是否有雙引號
- 找不到System.web.http套件:
這個問題我卡好久,
但原因很簡單,就是系統的套件版本(較新)和config中的套件版本(過舊)不符,
修正config的套件資訊就可以了。
- 安裝VSTest
- 發送通知
Jenkins有很多通知可以用,最常見的應該是email,
但礙於公司的email Server設定麻煩,
加上應該是防火牆被擋了,沒辦法用Gmail送信,
所以最後是以Slack發送建置與測試通知。- Email:請參考網路設定,看起來不難設定
- Slack
詳細的操作可以參考這一篇,基本上我就是手把手跟著做。
大致的流程是- Slack加入Channel
- Channel加入Jenkins app,加入app會需要紀錄Base Url和Token。
- 接著到Jenkins安裝Plug-In: Global Slack Notifier Plug-In
- 安裝完Plug-In後,到 Jenkins主畫面 -> 管理Jenkins -> 設定系統,
找到 Global Slack Notifier Settings 填入Url和Token,
然後測試連線。 - 到專案-> 組態 -> 建置後動作,選擇加入 Slack Notifications,
勾選需要進行通知的動作
基本上走到這裡大概就完成八九成的工作了。
接下來就是在專案 中點選 馬上建置,
就可以看整個建置結果、測試結果了。
後續還需要處理的工作:
- 建置時機
建置時機可以選擇定期(很笨)、輪詢(一般笨)或是遠端(例如SVN以scrip觸發),
邏輯上遠端觸發比較合理,
但因為目前公司資安架構關係,需要請伺服器管理人員協助,
暫時就擱著了。 - 發送Email
問題跟前一個一樣,需要請伺服器管理人員處理的,我們就都先擱著吧~~ - 測試報告
VSTest的測試報告好像有些Bug(檔案數會累加),需要透過一些小技巧避免,
這部分因為公司規畫還沒跑到這....
所以也就等需要時再處理了 - CD(部署)
再看看囉~~~~
Jenkins的CI整合之路大致上就先到這了,
有問題歡迎討論,
型男要來去寫扣了~~~