0%

透過容器建置專案

希望學會這個技巧後,以後大家弄CI/CD環境都能海闊天空

(圖片出處 : 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
2
3
4
5
6
.NET Framework Runtime
Visual Studio Build Tools
Visual Studio Test Agent
NuGet CLI
.NET Framework Targeting Packs
ASP.NET Web Targets

我用這個 base image 開了 workspace 資料夾並把 source code 複製進去後,接著就是大家熟悉的 nuget restore 、 dotnet build、 dotnet publish 在容器的環境內建置專案。

第二段是起另一個 base image windows servercore 2019,將剛剛建置好的 artifact 放到指定的資料夾,最後這一包會建置成 image 並推到公司的 Artifact management 上,其它人只要拉下這個 image 就可以執行了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS build-env

WORKDIR c:/workspace

COPY . ./

RUN nuget restore src\nmqv3.sln
RUN dotnet restore --configfile src\.nuget\NuGet.Config src\my_project.sln

run dotnet build -c release src\my_project.sln
run dotnet publish -c Release -r win-x64 --self-contained true src\Router\Router.csproj


FROM mcr.microsoft.com/windows/servercore:ltsc2019

WORKDIR c:/worker
COPY --from=build-env c:/workspace/src/Worker/bin/release/ .

WORKDIR c:/router
COPY --from=build-env c:/workspace/src/Router/bin/Release/netcoreapp3.0/win-x64/publish/ .

從建置到最後要交付的 container image 一氣呵成,全部都濃縮在一份 dockerfile 裡面,這份 dockerfile 會跟著專案內,只要任何一台機器可以執行 docker container 就可以建置佈署這個專案,是不是方便許多 XD