• 使用Docker+Jenkin自动化流水线


    使用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 baseWORKDIR /appEXPOSE 80EXPOSE 443EXPOSE 44311FROM mcr.microsoft.com/dotnet/sdk:6.0 AS buildWORKDIR /srcCOPY ["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/buildFROM build AS publishRUN dotnet publish "Soa.GatewaySample.Web.Host.csproj" -c Release -o /app/publishFROM base AS finalWORKDIR /appCOPY --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-reloadsudo 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:latestsudo docker tag jevonsflash/soasampleauthorizedservicehost:latest 192.168.31.69:5000/soasampleauthorizedservicehost:latestsudo docker push 192.168.31.69:5000/soasampleauthorizedservicehost
    

    防火墙开启8081与8082端口以便外部环境可以访问

    firewall-cmd --zone=public --add-port=8081/tcp --permanentfirewall-cmd --zone=public --add-port=8080/tcp --permanentfirewall-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服务器地址]
  • 相关阅读:
    【爬虫作业】使用scrapy爬取菜谱,存入elasticsearch中建立菜谱搜索引擎
    Vue3:用vite创建Vue3项目
    5G建网初期SSB波束设置策略
    OpenTelemetry 实践指南:历史、架构与基本概念
    【网络教程】IPtables官方教程--学习笔记1
    SpringBoot SpringBoot 基础篇(第一篇) 第1章 SpringBoot 入门 1.4 HelloWorld 执行分析
    Web前端—盒子模型:选择器、PxCook、盒子模型、正则表达式、综合案例(产品卡片与新闻列表)
    [附源码]java毕业设计医院门诊信息管理系统
    Java基础错题集(一)
    新注册的Linkedin账号如何拓展人脉
  • 原文地址:https://blog.csdn.net/weixin_62421895/article/details/126281239