Jenkins + SVN + C# + MSBuild + VSTest +Slack

今年公司開始要導入CI(終於...),
所以就做了些研究和測試,
整合的技術如下:

Jenkins + SVN + C# + MSBuild + VSTest +Slack

 

====本文開始====
把近期用Jenkins做CI的一些流程和遇到的問題稍微整理一下。

建置的流程大致上是:
安裝Jenkins => 取得程式原始碼(SVN) => 安裝套件 => 建置(MSBuild) => 測試(VSTest) => 結果通知

  1. 安裝Jenkins
    1. 下載Jenkins
    2. 設定Proxy
      如果所在的網路環境有Proxy,要正確設定,才能連到Jenkins Server下載Plug-In,
      詳細的設定要請各位跟公司的MIS確認了....
    3. 下載Plug-In
      Jenkins主畫面 -> 管理Jenkins -> 管理外掛程式 中可以看到相關的Plug-In,
      各種Plug-In原則上也在這個畫面下載。
      !!!提醒!!!
      一個新手可能會遇到的問題:
      Jenkins 的 Plug-In,只是提供使用者在Jenkins上能做相關設定的介面,
      實際上的執行檔案,還是要自行安裝喔~~~
       
  2. 新增專案
    從Jenkins主畫面的"新增作業"新增專案,選擇"Free-Style"就可以了。
     
  3. 連線SVN
    1. 下載Plug-In:SubVersion Plug-In
    2. 設定原始碼位置
    3. 設定登入資訊
       
  4. Nuget package
    因為專案用了很多Nuget套件,下載套件幾乎是一種必要之惡,
    偏生公司的網路很給力,下載動作一直被擋,
    後來的作法是手動把套件Copy Paste到Jenkins的專案資料夾下。
     
  5. 建立MSBuild與障礙排除
    正如第一點的"提醒"說的,
    建立MSBuild第一個遇到的問題就是要找到MSBuid的安裝檔,
    我後來安裝了VS2017 BuildTools。 
    1. 安裝MSBuild:
      有需要可以直接到官網下載,然後安裝自己需要的套件,
      我主要安裝.net網站開發套件(C#)。
    2. 下載Plug-In:MSBuild PlugIn
      Jenkins主畫面 -> 管理Jenkins -> 管理外掛程式 查詢並下載
    3. 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,可以在這裡新增,
      新增完之後,下一個步驟會用到
      !!!提醒!!! 這邊的路徑,填入時沒有雙引號
    4. 專案中設定使用MSBuild
      專案-> 組態 -> 建置 中設定
      我選擇的是"Build a Visual Studio project or solution using MSBuild",
      需要設定的參數就是使用的BuildTools(在上一個步驟中設定),
      設定的參數可以參考網路上的文章
    5. 障礙排除
      建置時會遇到的幾個問題包含套件找不到(安裝Nuget)、套件版本錯誤等,
      另外可能會遇到設定路徑錯誤等等。
       
  6. 建立VSTest與障礙排除
    1. 安裝VSTest
      網路上看了一圈,微軟派目前應該會推薦採用VSTest.console.exe,
      原因:MSTest只支援MSTest,VSTest支援MSTest / MSTest v2。

      VSTest在前面安裝BuildTools時理論上會一起安裝,
      我還好傻好天真的在網路上找了一大圈。
      其實位置就在電腦裡,等下告訴你。
    2. 下載Plug-In:MSTest Plug-In / VSTest Runner Plug-In
      Jenkins主畫面 -> 管理Jenkins -> 管理外掛程式 查詢並下載
    3. 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"

      新增完之後,下一個步驟會用到
      !!!提醒!!! 這邊的路徑,填入時雙引號,而且需要填入完整路徑(含檔案名稱與副檔名)
    4. 專案中設定使用VSTest
      專案-> 組態 -> 建置 中設定
      在建置程序中加入Test,
      我選的是"Run unit tests with VSTest.console",
      建置跟測試的順序應該無關,但邏輯上要建置成功再進行測試比較合理。
    5. 障礙排除
      建置時是指定建置的solution或project檔,
      但測試時是指定測試專案的dll檔。

      有幾個可能遇到的問題:
      1. VSTest.console.exe的路徑設定錯誤:記得寫完整路徑以及確認是否有雙引號
      2. 找不到System.web.http套件:
        這個問題我卡好久,
        但原因很簡單,就是系統的套件版本(較新)和config中的套件版本(過舊)不符,
        修正config的套件資訊就可以了。
  7. 發送通知
    Jenkins有很多通知可以用,最常見的應該是email,
    但礙於公司的email Server設定麻煩,
    加上應該是防火牆被擋了,沒辦法用Gmail送信,
    所以最後是以Slack發送建置與測試通知。
    1. Email:請參考網路設定,看起來不難設定
    2. Slack
      詳細的操作可以參考這一篇,基本上我就是手把手跟著做。
      大致的流程是
      1. Slack加入Channel
      2. Channel加入Jenkins app,加入app會需要紀錄Base Url和Token。
      3. 接著到Jenkins安裝Plug-In: Global Slack Notifier Plug-In
      4. 安裝完Plug-In後,到 Jenkins主畫面 -> 管理Jenkins -> 設定系統,
        找到 Global Slack Notifier Settings 填入Url和Token,
        然後測試連線。
      5. 專案-> 組態 -> 建置後動作,選擇加入 Slack Notifications,
        勾選需要進行通知的動作

基本上走到這裡大概就完成八九成的工作了。

接下來就是在專案 中點選 馬上建置
就可以看整個建置結果、測試結果了。

後續還需要處理的工作:

  1. 建置時機
    建置時機可以選擇定期(很笨)、輪詢(一般笨)或是遠端(例如SVN以scrip觸發),
    邏輯上遠端觸發比較合理,
    但因為目前公司資安架構關係,需要請伺服器管理人員協助,
    暫時就擱著了。
  2. 發送Email
    問題跟前一個一樣,需要請伺服器管理人員處理的,我們就都先擱著吧~~
  3. 測試報告
    VSTest的測試報告好像有些Bug(檔案數會累加),需要透過一些小技巧避免,
    這部分因為公司規畫還沒跑到這....
    所以也就等需要時再處理了
  4. CD(部署)
    再看看囉~~~~

Jenkins的CI整合之路大致上就先到這了,
有問題歡迎討論,
型男要來去寫扣了~~~