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

​使用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

在同網段下的瀏覽器中輸入 //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

在同網段下的瀏覽器打開//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項目下選擇「立即構建」

​

等待構建成功

​

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

​

 至此部署工作結束。

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

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

 

 


​