[DevOps自動化-6] Jenkins持續整合、發布

透過Jenkins pipeline來達到視覺化的持續整合和持續發布

前言

前文分享了利用Msbuild封裝網站成package,再利用產生的deploy.cmd將package發布到IIS上的流程。現在萬事俱備,只欠東風,而CI、CD工具就是最後一塊拼圖,這篇主要是要分享老字號的Jenkins來完成此任務。

Jenkins做了近10年來最大的一次改版,多了一個Pipeline的功能,可以讓你視覺化的管理建置流程,廢話不多說,趕快來體驗一下。

 

安裝Jenkins

Windows的用戶要安裝Jenkins非常容易,點選官網選擇download,勾選Windows版本,解壓縮之後,點擊執行檔進入Next到底安裝即可。

附帶一提,Jenkins是跑在java環境,所以必須要先下載java,並且要重新啟動Jenkins才會生效,預設jenkins的位置是在localhost:8080,當然,如果你的這個port已經被佔用,就無法順利啟動,要更改port也相當容易,只需要到jenkins的資料夾下找到jenkins.xml,裡面直接搜尋8080便會看到預設port的設定,把它改成你喜歡的數字即可。

安裝完成後,在網址列中輸入localhost:8080就可以看到Jenkins的管理畫面,如下圖所示。

接下來安裝Pipeline的Plugin,點選管理Jenkins => 管理外掛程式 =>  選擇"可用的"頁籤 => 搜尋字串輸入Pipeline,勾選Pipeline並安裝即可,安裝完記得要重新啟動。

 

牛刀小試 Hello World

安裝完成後,接下來的重點就是要把之前的bat指令結合Pipeline。Pipeline的語法是使用Groovy撰寫,不過別擔心,這裡只需要了解三個基本單字,剩下的事情可以交由Jenkins幫忙。

  • Step  : 負責告訴Jenkins你想要做些甚麼。
  • Node : 想像成是一個容器,裝載著你要執行的Step。
  • Stage : Pipeline視覺化圖形,會把每個Stage呈現成獨立的區塊。

來看看範例可以幫助了解,依照慣例,先來個Hello World。點選新增作業,

輸入名稱之後,選擇Pipeline類型。

拉到下方Pileline script的地方,在下方填入

node {
   stage 'Stage 1'
   echo 'Hello World 1'
   stage 'Stage 2'
   echo 'Hello World 2'
}

如下圖所示,接著按存檔,可參考下圖。

點選馬上建置,如下圖所示

接著會得到視覺化的結果,如下圖所示。

切換到Output可以更容易了解那三個單字,請直接看下圖說明。

完整的CI (持續整合) CD(持續發布)

雖然已經成功實作Hello world,但當然不能因此而滿足,我們要做到的持續整合和持續發布,但問題是如果不懂Groovy語法怎辦? 前篇文章所產生的編譯和發布語法都是透過Windows的command line來做執行,要如何轉換成Groovy呢?其實,很簡單,Jenkins都幫你想到了。

回到剛剛要填入Pipescripte的地方,點選Pipeline Syntax,如下圖所示。

會另外開啟一個頁面,Jenkins很好心地把所有Step範本都準備好了!第一步選擇你要的範本類型。

接著輸入相關參數,簡單來說,就是把你原本要跑編譯的Windows指令,貼在參數欄中,請直接看下圖。

接著點選產生語法,請看下圖。

萬歲,編譯的Step指令很簡單的就產生了,接著依樣畫葫蘆把發布的指令也依照這個方法產生。接著回到Pipeline script的設定畫面。將內容填入。

node {
   stage '編譯站點'
   bat 'MSBuild "HelloWeb.csproj"  /T:Package /p:VisualStudioVersion=14.0 /P:Configuration=Release;PackageLocation="C:\\\\WebDeployFileCN\\\\HelloWeb.zip"\'\'\''
   stage '站點發布'
   bat 'HelloWeb.deploy.cmd /t  /m:https://172.16.22.18:8172/MSDeploy.axd /u:CN-AP-01/Administrator /p:*******; /a:basic -allowUntrusted:true'
}

可參考下圖,並按儲存。

接著按下馬上建置,就可以看到功能已經正常運行。後續只要再設定當Git的branch被更新就觸發本作業,就能做到持續整合和持續發布的工作了。

真的夠完整嗎?

到這裡,我們已經做到了可編譯並發布站點,但不覺得在那小小的Pipeline script框框內寫script,一來可讀性不好,二來沒有原始碼版控的功能呀,要是流程變得更加複雜,會增加維護的難度。

沒錯,單單這樣還是不夠完整,如果能把建置的指令也納入原始碼控管,這樣不但可以控管版本,而且只要branch更新,建置的流程就會跟著跟新,這樣才算達到真正的烏托邦境界。

要做到這一點,也非常容易,Jenkins本身就支援原始碼管控Build file的功能。話不多說,直接來實作。

點選指令碼來源是Pipeline script from SCM,設定Git的Url和Credentials。

接下來在設定branch來源,以及檔案的路徑,這樣就大功告成了。

再來跑一次建置,很好,完全沒有問題!!!

結論

將編譯和部署的指令碼結合Jenkins這一塊拼圖,完成了視覺化的CI和CD功能,而Jenkins的彈性非常之大,功能也非常完整,如果專案本身還有包含測試,也能將其納入,並將測試結果轉成報表呈現。

透過這樣的自動化流程,將可讓程式開發人員只需專注Commit、Pull Request,剩下的事情就交給自動化來解決,讓程式人員能專注在有產值的輸出上面。下一篇文章會分享如何透過Jenkins整合MSBuild、MSTest,完成編譯、測試、出測試報表的相關動作。