[学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用

虚幻大学 xuhss 135℃ 0评论

? 优质资源分享 ?

学习路线指引(点击解锁) 知识定位 人群定位
? Python实战微信订餐小程序 ? 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
?Python量化交易实战? 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

​使用Docker容器方案可以快速安全地将项目部署到客户的服务器上,作为公司项目,需要解决两个问题:

  1. 需要搭建一个私有的Docker仓库,以便安全的存储镜像

  2. 需要一套自动化发布方案,实现代码到应用部署的自动化流程

大致流程如下

7af1b2a3309048d6bd5ad3dd50dd0102 - [学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1aenTL9K-1654708191658)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]​

在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"]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oyXS1cSB-1654708191661)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]

搭建CI/CD服务器

CI/CD服务器用于将代码端到仓库的自动化发布,假设你已经拥有一台CentOS 7的服务器,IP地址为192.168.31.69,并且已经安装好了Docker和Jenkins。

安装私有仓库

sudo docker pull registry

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BAhIvAE5-1654708191662)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]
设置启动方式为后台任务,端口为5000,并设置随docker服务一同启动

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QFrk1ZoT-1654708191663)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]
更改docker.service

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZKqPlZpR-1654708191664)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]
在ExecStart命令后面添加参数,添加本机IP地址到registry中

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wHskGDGE-1654708191665)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]
重启docker服务

sudo systemctl daemon-reload
sudo systemctl restart docker

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z0hC9lcb-1654708191666)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]
[可选]安装并运行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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PAANiQSI-1654708191667)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]
测试

下载从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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FDirAN3c-1654708191668)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]
防火墙开启8081与8082端口以便外部环境可以访问

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iqYJn54S-1654708191669)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]
在同网段下的浏览器中输入 http://192.168.31.69:8081, 将跳转至管理页面

选择Anonymous匿名登陆,输入192.168.31.69:5000,点击Submit

00dccea5cb394d449d66d8c7aa6e3183 - [学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PBHhoirw-1654708191670)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]​

可以看到soasampleauthorizedservicehost:latest已经存在于仓库内了8db07ac0ed0e4912b4346e4b81569d96 - [学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JuZSnosC-1654708191671)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]​

配置Jenkins

首先配置Jenkins的shell脚本权限

sudo visudo

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LI0Sgzq1-1654708191672)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]
在文件末尾添加规则,这样执行sudo命令时将跳过root管理员密码验证

jenkins         ALL=(ALL) NOPASSWD:ALL

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TXepSUDA-1654708191673)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]
重启jenkins

sudo systemctl restart jenkins

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rme78MRb-1654708191674)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]
在同网段下的浏览器打开http://192.168.31.69:8080, 打开Jenkins管理界面

Dashboard - 新建任务,选择“构建一个自由风格的软件项目”

这里暂且命名为test

4b711613258447e683287802ca55373c - [学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gw1iKXZg-1654708191675)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]​

在源码管理中填写Git仓库地址,并且填写正确的鉴权信息

e0eda405c31943a3ad45d8b685e22efe - [学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yW1jkd31-1654708191676)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]​

在构建中添加一个“执行 shell” 步骤

2b4d50c0faa241358baf827384609425 - [学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nLx4C5Wn-1654708191677)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]​

在命令中输入以下内容

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e6WpcPN3-1654708191678)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]
这些命令将在构建时,在源代码拉取后执行

  1. 将指定 ./sample/MainHost/Soa.GatewaySample.Web.Host/Dockerfile构建镜像,并命名为192.168.31.69:5000/soasampleauthorizedservicehost
  2. 将192.168.31.69:5000/soasampleauthorizedservicehost镜像推送至私有docker仓库

19500187a99d40de85c75b830683158b - [学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b6xyKMsQ-1654708191678)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]​

至此搭建CI/CD服务器工作结束。

测试和发布

返回Dashboard,在test项目下选择“立即构建”

c94fa9f052c149d2b3651831a8d28a15 - [学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Worq022F-1654708191679)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]​

等待构建成功

15ec34ddd473498da5a1c39f78b6b477 - [学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oP7hJuYn-1654708191680)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]​

再次打开 http://192.168.31.69:8081, 打开Docker仓库管理页面,可以发现发布时间已更新

f9876a1b9de7416996ec6a6c456dd466 - [学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gXm6mrXh-1654708191681)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]​

至此部署工作结束。

在客户机上需要安装Docker并且配置好IP地址,当然CI/CD服务器需要映射到一个公网IP地址上,以便客户的服务器拉取镜像

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qJquaNlr-1654708191682)(https://img2022.cnblogs.com/blog/644861/202206/644861-20220608183753234-691459824.gif "点击并拖拽以移动")]

转载请注明:xuhss » [学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用

喜欢 (0)

您必须 登录 才能发表评论!