[學習筆記]使用Docker+Jenkin自動化流水線釋出.Net應用

2022-06-08 21:01:24
使用Docker容器方案可以快速安全地將專案部署到客戶的伺服器上,作為公司專案,需要解決兩個問題:

1. 需要搭建一個私有的Docker倉庫,以便安全的儲存映象

2. 需要一套自動化釋出方案,實現程式碼到應用部署的自動化流程

大致流程如下

在java世界中有很多文章介紹了Docker+Jenkin的自動化部署方式,這次來看看如何用這一套工具實現.Net 應用的釋出。

編寫DockerFile

以Soa專案為例MatoApps/Soa: 一個輕量級的微服務庫,基於.Net 6 + Abp框架 可快速地將現有專案改造成為面向服務體系結構,實現模組間鬆耦合。 (github.com)

Soa/sample/MainHost/Soa.GatewaySample.Web.Host/Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
EXPOSE 44311

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["sample/MainHost/Soa.GatewaySample.Web.Host/Soa.GatewaySample.Web.Host.csproj", "sample/MainHost/Soa.GatewaySample.Web.Host/"]
COPY ["sample/MainHost/Soa.GatewaySample.Web.Core/Soa.GatewaySample.Web.Core.csproj", "sample/MainHost/Soa.GatewaySample.Web.Core/"]
COPY ["sample/MainHost/Soa.GatewaySample.Application/Soa.GatewaySample.Application.csproj", "sample/MainHost/Soa.GatewaySample.Application/"]
COPY ["sample/MainHost/Soa.GatewaySample.Core/Soa.GatewaySample.Core.csproj", "sample/MainHost/Soa.GatewaySample.Core/"]
COPY ["sample/Services.Abstract/Soa.Sample.IService2/Soa.Sample.IService2.csproj", "sample/Services.Abstract/Soa.Sample.IService2/"]
COPY ["src/Soa/Soa.csproj", "src/Soa/"]
COPY ["sample/Services.Abstract/Soa.Sample.IAuthorizedService/Soa.Sample.IAuthorizedService.csproj", "sample/Services.Abstract/Soa.Sample.IAuthorizedService/"]
COPY ["sample/Services.Abstract/Soa.Sample.IService1/Soa.Sample.IService1.csproj", "sample/Services.Abstract/Soa.Sample.IService1/"]
COPY ["sample/MainHost/Soa.GatewaySample.EntityFrameworkCore/Soa.GatewaySample.EntityFrameworkCore.csproj", "sample/MainHost/Soa.GatewaySample.EntityFrameworkCore/"]
COPY ["src/Soa.Client/Soa.Client.csproj", "src/Soa.Client/"]
RUN dotnet restore "sample/MainHost/Soa.GatewaySample.Web.Host/Soa.GatewaySample.Web.Host.csproj"
COPY . .
WORKDIR "/src/sample/MainHost/Soa.GatewaySample.Web.Host"
RUN dotnet build "Soa.GatewaySample.Web.Host.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Soa.GatewaySample.Web.Host.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Soa.GatewaySample.Web.Host.dll"]

 

搭建CI/CD伺服器

CI/CD伺服器用於將程式碼端到倉庫的自動化釋出,假設你已經擁有一臺CentOS 7的伺服器,IP地址為192.168.31.69,並且已經安裝好了Docker和Jenkins。

安裝私有倉庫

sudo docker pull registry

設定啟動方式為後臺任務,埠為5000,並設定隨docker服務一同啟動

sudo docker run -d -p 5000:5000 --restart always  registry

更改docker.service

sudo nano /usr/lib/systemd/system/docker.service

在ExecStart命令後面新增引數,新增本機IP地址到registry中 

[Service]
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.31.69:5000

重啟docker服務 

sudo systemctl daemon-reload
sudo systemctl restart docker

[可選]安裝並執行whalerator,whalerator是一個docker映象倉庫視覺化工具,可以提供類似Docker Hub的方式瀏覽映象

 jevonsflash/whalerator: Portable front end for Docker Registry (github.com)

sudo docker run -d -p 8081:80 --restart always whalerator/whalerator

 測試

下載從dockerhub上下載一個倉庫,再將他提交到私有倉庫中

sudo docker pull jevonsflash/soasampleauthorizedservicehost:latest
sudo docker tag jevonsflash/soasampleauthorizedservicehost:latest 192.168.31.69:5000/soasampleauthorizedservicehost:latest
sudo docker push 192.168.31.69:5000/soasampleauthorizedservicehost

防火牆開啟8081與8082埠以便外部環境可以存取

firewall-cmd --zone=public --add-port=8081/tcp --permanent
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload

在同網段下的瀏覽器中輸入 http://192.168.31.69:8081, 將跳轉至管理頁面

選擇Anonymous匿名登陸,輸入192.168.31.69:5000,點選Submit

 可以看到soasampleauthorizedservicehost:latest已經存在於倉庫內了

設定Jenkins 

首先設定Jenkins的shell指令碼許可權

sudo visudo

 在檔案末尾新增規則,這樣執行sudo命令時將跳過root管理員密碼驗證

jenkins         ALL=(ALL) NOPASSWD:ALL

重啟jenkins 

sudo systemctl restart jenkins

在同網段下的瀏覽器開啟http://192.168.31.69:8080, 開啟Jenkins管理介面

Dashboard - 新建任務,選擇「構建一個自由風格的軟體專案」 

這裡暫且命名為test

 在原始碼管理中填寫Git倉庫地址,並且填寫正確的鑑權資訊

 在構建中新增一個「執行 shell」 步驟

 在命令中輸入以下內容

sudo docker build -f ./sample/MainHost/Soa.GatewaySample.Web.Host/Dockerfile -t 192.168.31.69:5000/soasampleauthorizedservicehost --no-cache --target final ./
sudo docker push 192.168.31.69:5000/soasampleauthorizedservicehost

這些命令將在構建時,在原始碼拉取後執行

  1. 將指定 ./sample/MainHost/Soa.GatewaySample.Web.Host/Dockerfile構建映象,並命名為192.168.31.69:5000/soasampleauthorizedservicehost
  2. 將192.168.31.69:5000/soasampleauthorizedservicehost映象推播至私有docker倉庫

  至此搭建CI/CD伺服器工作結束。

測試和釋出

返回Dashboard,在test專案下選擇「立即構建」

等待構建成功

 再次開啟 http://192.168.31.69:8081, 開啟Docker倉庫管理頁面,可以發現釋出時間已更新

 至此部署工作結束。

在客戶機上需要安裝Docker並且設定好IP地址,當然CI/CD伺服器需要對映到一個公網IP地址上,以便客戶的伺服器拉取映象

[Service]
ExecStart=/usr/bin/dockerd --insecure-registry [CI/CD伺服器地址]