(圖片出處 : http://ezvivi2.com/article/200483.asp)
有在處理 CI/CD 的人應該都碰到過維護建置環境的問題,舉例來說,當今天開發 C# 專案可能有 dotnet framework、dotnet core、有些人開發前端會需要 npm …等等,CI 機器就需要裝一堆為了建置佈署的軟體,如果開發人員變多,建置排隊久候,可能就會將環境升級為 Master、Slave 架構,但又面臨了多台 Slave 如何快速增長(通常只有上班時間才會同時這麼多人在建置,所以動態增長 CI 機器有其必要),如何維護多台 Slave 環境,有時候遇到需要的套件版本打架的時候,處理起來真的是會抓狂。
透過容器來建置專案
其實綜觀上述的問題可以發現,每個專案建置所需要的東西可能不盡相同,為了讓 CI 機器能夠滿足所有建置的條件往往會把環境搞得過於複雜,這時候容器就是一個非常好的選擇,它滿足了每次建置環境都是獨立、隔離的條件且方便佈署。
一旦使用容器來做為建置的媒介,需要長一台新的 CI 機器時,只要將機器開起來並安裝完 docker 就搞定了(甚至 AWS 都有做好的現成 AMI 連自己安裝都省了),不再需要寫一狗票的腳本來安裝機器。
實例
以下是我一個專案建置時的 dockerfile,沒幾行的 script 就快速講一下,因為我這個專案裡面同時有 dotnet framework 與 dotnet core ,所以找個微軟官方提供的 mcr.microsoft.com/dotnet/framework/sdk:4.8
, 裡面已經安裝了下列套件。 Docker Hub 連結
1 | .NET Framework Runtime |
我用這個 base image 開了 workspace 資料夾並把 source code 複製進去後,接著就是大家熟悉的 nuget restore 、 dotnet build、 dotnet publish 在容器的環境內建置專案。
第二段是起另一個 base image windows servercore 2019
,將剛剛建置好的 artifact 放到指定的資料夾,最後這一包會建置成 image 並推到公司的 Artifact management 上,其它人只要拉下這個 image 就可以執行了。
1 | FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS build-env |
從建置到最後要交付的 container image 一氣呵成,全部都濃縮在一份 dockerfile 裡面,這份 dockerfile 會跟著專案內,只要任何一台機器可以執行 docker container 就可以建置佈署這個專案,是不是方便許多 XD