04.使用 github actions+docker 自动部署前后端分离项目 zhontai (.net core+vue)

这篇具有很好参考价值的文章主要介绍了04.使用 github actions+docker 自动部署前后端分离项目 zhontai (.net core+vue)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

Github Actions是什么?是 GitHub 提供的一种持续集成/持续部署(CI/CD)工作流程自动化服务,助力项目的自动化构建、测试和部署。
依托于平台,本文将分享使用 GitHub Actions 完成对一个.Net Core+Vue 的前后端分离项目 zhontai 的构建,并使用 docker 部署到云服务器(阿里云)

使用说明

经过一番尝试学习,个人感受是其功能齐全,文档完善,使用 GitHub 托管仓库完成自己的 CI/CD,不再需要自己搞构建服务了。
关于使用费用问题:每个用户/组织都有免费的使用额度:2000 分钟/月, 不同的项目归类到不同的组织,完全足够使用了。

本文环境

  • GitHub 项目
    • .Net Core 项目:https://github.com/yimogit/Admin.Core fork 自 zhontai/Admin.Core
    • Vue 项目:https://github.com/yimogit/admin.ui.plus fork 自 zhontai/admin.ui.plus
  • 安装了 docker 的 Linux 服务器

后端 asp.net core7.0 项目的部署

执行步骤及重点

  • 仓库地址:https://github.com/yimogit/Admin.Core
  • 部署文件:.github\workflows\test-deploy.yml
  • 目录结构
    ├─.github
    │  └─workflows
    │    └─test-deploy.yml
    ├─docker
    │    ├─Dockerfile
    │    - publish_output publish生成的文件会复制到此,rsync上传到linux服务器
    ├─src
    │    ├─hosts
    ├─...
    
  1. 新建 github actions 配置文件: .github\workflows\test-deploy.yml

    • 仓库的 .github/workflows 目录中定义将会被 github actions 识别
    • 测试可以用,生产则可以用 on: workflow_dispatch 指定手动构建
  2. 拉取分支

    • actions 库:actions/checkout@v3
  3. 安装 Dotnet7

    • actions 库:actions/setup-dotnet@v3
  4. 执行打包生成 publish_output 目录

    • dotnet publish ./src/hosts/ZhonTai.Host -c Release -o ./publish_output --self-contained true --runtime linux-x64 --framework net7.0
  5. 使用 ssh 部署到服务器

    • actions 库:easingthemes/ssh-deploy@v4.1.8
    • 将 publish_output 复制到 docker 目录,在将 docker 目录,将其上传到服务器后执行脚本
    • ssh 连接后需要创建挂载目录,一个数据库的目录,一个上传目录
    • 默认 ZhonTai.Host 的端口是 8000
    • 创建挂载目录:mkdir /root/zhontai/volumns/upload -p
    • docker 运行:docker run --name my-zhontai-apihost -d -p 9902:8000 -e -v /root/zhontai/volumns/admindb.db:/app/admindb.db -v /root/zhontai/volumns/upload:/app/wwwroot/upload zhontai/apihost:latest
  6. ssh 使用需要配置的环境变量

    • ${{ secrets.SSH_PRIVATE_KEY }}:服务器的 ssh 密钥:~/.ssh/id_rsa 内容
    • ${{ secrets.REMOTE_HOST }}:服务器 IP: xxx.xxx.xxx.xxx
    • ${{ secrets.REMOTE_USER }}:用户名 root
    • ${{ secrets.REMOTE_TARGET }}:远程目录 /root/zhontai/api
  7. 配置需要的环境变量

    • 配置路径:项目->Settings->Security->Secrets and variables->Actions->New repository secret
    • 04.使用 github actions+docker 自动部署前后端分离项目 zhontai (.net core+vue)
    • ssh 的生成参考ssh-deploy 配置部分
    • ssh-keygen -m PEM -t rsa -b 4096 生成 ssh,然后复制公钥到 authorized_keys
    • 设置完最好是重启下
  8. 构建完成

    • 记得开启云服务器的防火墙端口:9902,即可在浏览器中访问到前台页面
    • 04.使用 github actions+docker 自动部署前后端分离项目 zhontai (.net core+vue)

.github/workflows/test-deploy.yml

# test-deploy.yml
name: 后端测试环境直接部署
# 手动构建
#on: workflow_dispatch
on:
  push:
    branches:
      - master
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      # 拉取仓库文件
      - name: 拉取master分支代码
        uses: actions/checkout@v3
        with:
          # 默认当前分支
          ref: 'master'
      # action命令,安装Dotnet7
      - name: 安装 Dotnet7
        uses: actions/setup-dotnet@v3
        with:
          dotnet-version: 7.0.400
      # 执行打包命令
      - run: dotnet --version && dotnet publish ./src/hosts/ZhonTai.Host -c Release -o ./publish_output --self-contained true --runtime linux-x64 --framework net7.0
      # 将dist复制到docker目录中
      - run: cp ./publish_output ./docker -rf
      # 使用 ssh 将api-dist文件拷贝到 linux
      - name: 使用ssh部署
        uses: easingthemes/ssh-deploy@v4.1.8
        with:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          ARGS: '-rlgoDzvc -i --delete'
          SOURCE: 'docker'
          REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
          REMOTE_USER: ${{ secrets.REMOTE_USER }}
          TARGET: ${{ secrets.REMOTE_TARGET }}
          EXCLUDE: '/node_modules/'
          SCRIPT_BEFORE: |
            mkdir ${{ secrets.REMOTE_TARGET }} -p
          SCRIPT_AFTER: |
            cd ${{ secrets.REMOTE_TARGET }}
            cd docker
            docker build --rm -f ./Dockerfile -t zhontai/apihost:latest .
            # 检查容器是否存在
            if docker container ls -a | grep -q "my-zhontai-apihost"; then
                echo "容器已存在"
                # 停止并移除容器
                docker stop my-zhontai-apihost
                docker rm my-zhontai-apihost
            fi
            # 容器挂载的路径
            mkdir /root/zhontai/volumns/upload -p
            docker run --name my-zhontai-apihost -d -p 9902:8000  -e ASPNETCORE_ENVIRONMENT=Testing  -v /root/zhontai/volumns/admindb.db:/app/admindb.db -v /root/zhontai/volumns/upload:/app/wwwroot/upload zhontai/apihost:latest

docker/Dockerfile

  • 打包在 GitHub Actions 完成,生成了 publish_output,所以只需要运行时镜像部署即可
  • 指定工作目录为 /app
  • 指定监听应用端口,Admin.Core 默认端口为 8000,启动库为 ZhonTai.Host
# 使用 ASP.NET Core 运行时镜像作为最终镜像
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS runtime

WORKDIR /app

# 复制构建好的应用程序文件
COPY ./publish_output /app

# 设置运行时环境变量
ENV ASPNETCORE_URLS=http://+:8000

# 指定容器启动时要执行的命令
ENTRYPOINT ["dotnet", "ZhonTai.Host.dll"]

前台 vue 项目的部署

整个过程类似镜像构建一样,一步步设置自己需要的环境,然后执行命令或者设置对应的操作,可以在使用前过一遍中文文档有个大概的了解,本文就跳过基础介绍直接说实现方式及重点

执行的步骤及重点

  • 仓库地址:https://github.com/yimogit/admin.ui.plus
  • 部署文件:.github\workflows\test-deploy.yml
  • 目录结构
    ├─.github
    │  └─workflows
    │    └─test-deploy.yml
    ├─docker
    │    ├─Dockerfile
    │    └─nginx.conf
    │    - dist build生成的dist会复制到此,rsync上传到linux服务器
    ├─public
    ├─src
    ├─...
    
  1. 新建 github actions 配置文件: .github\workflows\test-deploy.yml

    • 仓库的 .github/workflows 目录中定义将会被 github actions 识别
    • 测试可以用,生产则可以用 on: workflow_dispatch 指定手动构建
  2. 拉取分支

    • actions 库:actions/checkout@v3
  3. 安装 node v18.17.1

    • actions 库:actions/setup-node@v3
  4. 执行打包生成 dist 目录

    • npm install && npm run build
    • 默认打包使用的 production 环境的配置,如需打包其他环境则可以使用npm run build --mode testing 指定环境 testing,并使用 .env.testing 环境变量文件
    • 使用echo -e "\nVITE_API_URL=${{ secrets.API_HOST }}" >> .env.production 将配置中的 API_HOST 写入环境变量中
  5. 使用 ssh 部署到服务器

    • actions 库:easingthemes/ssh-deploy@v4.1.8
    • 将 dist 复制到 docker 目录,在将 docker 目录,将其上传到服务器后执行脚本
  6. ssh 使用需要配置的环境变量

    • ${{ secrets.SSH_PRIVATE_KEY }}:服务器的 ssh 密钥
    • ${{ secrets.REMOTE_HOST }}:服务器 IP
    • ${{ secrets.REMOTE_USER }}:用户名
    • ${{ secrets.REMOTE_TARGET }}:远程目录
    • ${{ secrets.API_HOST }}: 接口地址,配置后写入VITE_API_URL=xxx.com
  7. 配置需要的环境变量

    • 配置路径:项目->Settings->Security->Secrets and variables->Actions->New repository secret
    • 04.使用 github actions+docker 自动部署前后端分离项目 zhontai (.net core+vue)
    • ssh 的生成参考ssh-deploy 配置部分
    • ssh-keygen -m PEM -t rsa -b 4096 生成 ssh,然后复制公钥到 authorized_keys
  8. 构建完成

    • 记得开启云服务器的防火墙端口:9901,即可在浏览器中访问到前台页面
    • 04.使用 github actions+docker 自动部署前后端分离项目 zhontai (.net core+vue)

.github/workflows/test-deploy.yml

  • 完整的部署配置
# test-deploy.yml
name: 前端直接部署
# 手动构建
# on: workflow_dispatch
# 自动构建
on:
  push:
    branches:
      - master
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      # 拉取仓库文件
      - name: 拉取master分支代码
        uses: actions/checkout@v3
        with:
          # 默认当前分支
          ref: 'master'
      # action命令,安装Node v18.17.1
      - name: 安装 node
        uses: actions/setup-node@v3
        with:
          node-version: 18.17.1
          cache: 'npm'
      # 执行打包命令
      - run: |
          if [ -n "${{ secrets.API_HOST }}" ]; then
            # 使用设置中的接口地址
            echo -e "\nVITE_API_URL=${{ secrets.API_HOST }}" >> .env.production
          fi
      - run: node -v && npm -v && npm install && npm run build
      # 将dist复制到docker目录中
      - run: cp ./dist ./docker -rf
      # 使用 ssh 将dist文件拷贝到 linux
      - name: 使用ssh部署到服务器
        uses: easingthemes/ssh-deploy@v4.1.8
        with:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          ARGS: '-rlgoDzvc -i --delete'
          SOURCE: 'docker'
          REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
          REMOTE_USER: ${{ secrets.REMOTE_USER }}
          TARGET: ${{ secrets.REMOTE_TARGET }}
          EXCLUDE: '/node_modules/'
          SCRIPT_BEFORE: |
            mkdir ${{ secrets.REMOTE_TARGET }} -p
          SCRIPT_AFTER: |
            cd ${{ secrets.REMOTE_TARGET }}
            cd docker
            docker build --rm -f ./Dockerfile -t zhontai/adminui:latest .
            # 检查容器是否存在
            if docker container ls -a | grep -q "my-zhontai-adminui"; then
                echo "容器已存在,停止并移除容器"
                docker stop my-zhontai-adminui
                docker rm my-zhontai-adminui
            fi
            docker run --name my-zhontai-adminui -d -p 9901:80 zhontai/adminui:latest

docker/Dockerfile

  • 使用 nginx 1.18 镜像,添加前端页面及 nginx 配置
  • 对应使用脚本:docker build --rm -f ./Dockerfile -t zhontai/adminui:latest .
FROM nginx:1.18
EXPOSE 80
COPY ./dist /usr/share/nginx/html
COPY ./nginx.conf /etc/nginx/conf.d/default.conf

docker/nginx.conf

  • nginx v1.18 的配置,外层没有 http 节点了
  • 并且会覆盖默认的 default.conf 才行
server {
    listen       80;
    server_name  localhost;
    charset utf-8;
    location / {
        root   /usr/share/nginx/html;
        try_files $uri $uri/ /index.html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

一些碎碎念

  1. 本文的做法适用于测试,如果要构建生产,还需要更加严谨,比如需要手动执行,而不是自动构建,以及可以将打包和部署分开,生成构建物体,快速回滚部署
  2. 本文为了演示远程 docker,所以每次都是构建了 docker,其实也可以直接上传到服务器目录,不需要重启 docker
  3. 文章大部分都是用命令完成,方便迁移到其他构建工具,后续也可以直接在Github使用。

不完全踩坑记录

  • ssh部署:看了好久才看明白,一开始生成了没有复制到authorized_keys,然后生成了密钥没重启就是连接不上
  • docker nginx:nginx.conf挂载的地址不对,之前的旧版本是在/etc/nginx/nginx.conf,新的在/etc/nginx/conf.d/default.conf
  • nginx.conf的格式新版去掉了http节点,直接配置server节点就行,配置文件没对,导致误以为是我history模式nginx写法不对
  • 覆盖.env.production中接口地址的配置,想要换行加一句,试了好多次才行:echo -e "\nVITE_API_URL=xxx" >> .env.production
  • api项目挂载的位置搞错了几次:数据库和文件上传的地址分别是:/app/admindb.db,/app/wwwroot/upload
  • api项目挂载文件需要先行创建目录,启动后将会生成数据库
  • api项目的端口默认8000

时间过得太快了,周末两天第一次沉下心研究了一天Github Actions,各种尝试踩坑,第二天将过程整理分享出来,写完这句,发现眨眼间就周一了。
似乎学习,能让我在迷茫中找到些许方向吧。

By 易墨 转载请注明出处

相关资料

项目说明

如果对部署的项目感兴趣可以参考前两篇文章文章来源地址https://www.toymoban.com/news/detail-676080.html

  • zhontai Admin.Core: 01.前后端分离中台框架后端 Admin.Core 学习-介绍与配置说明
  • zhontai admin.ui.plus:02.前后端分离中台框架前端 admin.ui.plus 学习-介绍与简单使用
  • zhontai 代码生成:03.前后端分离中台框架 zhontai 项目代码生成器的使用

Github Actions 相关地址

  • GitHub Actions 中文文档
  • GitHub Actions 计费
  • GitHub Actions 个人使用情况

本文使用到的 action 库

  • actions/checkout@v3 拉取仓库代码:v3.6.0 文档
  • actions/setup-node@v3 安装 node v3.8.1 文档
  • actions/setup-dotnet@v3 安装 dotnet v3.2.0 文档
  • easingthemes/ssh-deploy@v4.1.8 ssh 连接服务器 v4.1.8 文档
  • 其他
    • actions/upload-artifact@v3 上传文件 v3.1.2 文档
    • actions/download-artifact@v3 下载文件 v3.0.2 文档

到了这里,关于04.使用 github actions+docker 自动部署前后端分离项目 zhontai (.net core+vue)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Docker】Linux中使用Docker安装Nginx部署前后端分离项目应用

    目录 一、概述 1. Nginx介绍 2. Nginx优势 3. Nginx的工作原理 二、容器创建 1. Mysql容器 2. Tomcat容器 3. Nginx容器 每篇一获 Nginx(发音为 \\\"engine x\\\")是一个开源的、高性能的 HTTP 服务器和反向代理服务器。它也可以作为一个 IMAP/POP3/SMTP 代理服务器。Nginx 是由 Igor Sysoev 开发的,最

    2024年01月21日
    浏览(43)
  • 【Docker】github Actions自动构建

    通过github的Actions 实现代码push仓库后自动构建容器并发布到DockerHub. 首先我们创建一个项目,这里我就用Vue项目进行演示. 进去项目,按照提示执行 npm install npm run dev 启动项目. 首先保证项目的正常启动。 控制台显示如下,启动成功。 在项目根目录创建 .githubworkflowsdocker-bui

    2024年02月07日
    浏览(52)
  • Java——Linux使用Docker部署若依前后端分离版【保姆级教程】

    目录 一、项目规划与前置工作 1.1、docker所需镜像 1.2、使用工具  1.3、防火墙与安全组的配置  1.4、域名解析、备案、SSL证书的准备(可选) 二、Docker和镜像安装 2.1、Docker安装 2.1.1、检查环境 2.1.2、搭建gcc环境(gcc是编程语言译器) 2.1.3、安装需要的软件包 2.1.4、装镜像仓

    2024年02月02日
    浏览(60)
  • 利用 GitHub Action 对项目进行自动部署

    说一下项目背景,这是一个基于 Docusaurus 搭建的个人博客平台:Yopth.github.io ⚛️ Docusaurs 是一个优秀的搭建网站框架,基于 React 和 MDX,插件化、国际化、SEO 等做的都很不错,有需要搭建网站的同学可以考虑。 该网站利用 GitHub Pages 部署,这个方式也是 Docusaurus 所支持的,详

    2023年04月24日
    浏览(33)
  • GitHub Actions自动化部署+定时百度链接推送

    # 前言 最近用VuePress搭建了一个静态网站,由于是纯静态的东西,每次修改完文章都要重新打包上传很是麻烦。虽然vuepress-theme-vdoing主题作者提供了GitHub Actions自动化部署的教程文章,但是过于简陋且是19年发布的。。 # 1. 创建一个GitHub仓库(私有仓库也可以) # 2. 设置服务器地

    2024年02月12日
    浏览(47)
  • Github Actions实现Spring Boot自动化部署(第二弹)

    ​ 今天就来讲述一下如何使用GitHub结合Actions实现Spring Boot程序从提交代码到打包、容器化、部署全过程自动化。首先咱们得现有一个能够在本地运行的Spring Boot程序,并且在Github上拥有一个仓库。 1.1 提交代码到Github 1.2 设置服务器密钥、GitHub私钥、DockerHub账号 secret value rem

    2024年02月08日
    浏览(40)
  • 【日常记录】自动化部署与持续交付:GitHub Actions CICD

    当我们做项目的时候,如果做完了,要发布,就需要打包,扔到服务器上,如果改了一点东西,还得打包,扔到服务器上,重复的执行 打包= 扔到服务器上 详细记录如何使用github actions自动化部署项目 自动化部署与持续交付:GitHub Actions CICD 自动化部署一般以下方式 Jenkins

    2024年02月02日
    浏览(54)
  • GitHub Action 通过SSH 自动部署到云服务器上

    准备 正式开始之前,你需要掌握 GitHub Action 的基础语法: workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。 name: 工作流的名称。 on: 指定次工作流的触发器。push 表示只要有人将更改推送到仓库就会触发工作流运行。(点击这里了解如何指定特定分支,路径

    2024年01月19日
    浏览(37)
  • 尝鲜!最新 VitePress 1 版本 + Github action,自动部署个人静态站点 SSG

    今天查看 vue 文档时,刚好看到 vue 官网宣布 VitePress 1 更新了: 然后在路上走着走着,突然想着,也许我可以把我的笔记仓库转换成在线文档(毕竟纯粹的 md 笔记,喜欢的人不多)。 同时,由于我很久之前有过这 vuepress 的使用经验,而且前段时间又复习了一下 github action,

    2024年04月08日
    浏览(49)
  • 从零用VitePress搭建博客教程(7) -– 如何用Github Actions自动化部署到Github Pages?

    接上一节: 从零用VitePress搭建博客教程(6) -– 第三方组件库的使用和VitePress搭建组件库文档  我们搭建完成vitePress后,那么接下来就是如何部署到线上服务器,这里使用Github Pages,免得自己购买服务器,当然你也可以自己购买服务器来部署(比如阿里云服务器)。 在部署之

    2024年02月08日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包