当前位置: 首页 > article >正文

使用 GitHub Actions 部署到开发服务器的详细指南

使用 GitHub Actions 部署到开发服务器的详细指南

在本篇博客中,我们将介绍如何使用 GitHub Actions 实现自动化部署,将代码从 GitHub 仓库的 dev 分支自动部署到开发服务器。通过这种方式,可以确保每次在 dev 分支推送代码时,服务器上的代码会自动更新,为开发和测试带来极大的便利。

前置条件

在开始之前,请确保以下条件已经满足:

  1. GitHub 仓库配置:仓库中需要一个名为 dev 的分支。
  2. SSH 配置:需要一个 SSH 私钥用于登录到服务器,并将其配置为 GitHub 仓库的秘密变量(例如,SSH_PEM_KEY)。
  3. 服务器配置:服务器上已经配置了用于部署的用户(如 www),并且该用户有权限更新代码。

配置服务器的相关信息到Github仓库

  • 找到项目中的 Settings -> General -> Security -> Actions 点击 New repository secret 添加一个新的环境变量
  • Name 写自己配置相关的名称(后面会配置到Github Action当中)
  • Secret则写Name相对应的值
  • 我这里配置了三个值,分别为:
    • SERVER_ADDRESS 服务器地址
    • SERVER_USER 服务器登录用户名
    • SSH_PEM_KEY 登录使用的密钥文件内容

在这里插入图片描述

后端自动拉取 工作流

在你的项目根目录下,创建 .github/workflows/deploy-dev.yml 文件,内容如下:

  • deploy-dev.yml 为按照自己使用场景命名
name: Deploy to Dev Server

on:
  push:
    branches:
      - dev

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Code
        uses: actions/checkout@v3

      - name: Add SSH Key
        run: |
          echo "${{ secrets.SSH_PEM_KEY }}" > deploy_key.pem
          chmod 600 deploy_key.pem

      - name: Run deployment script over SSH
        uses: appleboy/ssh-action@master
        with:
            host: ${{ secrets.SERVER_ADDRESS }}
            username: ${{ secrets.SERVER_USER }}
            key_path: deploy_key.pem
            script_stop: true
            script: |
              sudo -u www bash -c '
              cd /www/wwwroot/DaziBackend
              git pull origin dev'
    
      - name: Cleanup
        run: rm -f deploy_key.pem

接下来,我们将对上述代码逐行进行详细解释。


配置文件结构

  • name: 定义工作流的名称。在 GitHub Actions 界面中显示为 “Deploy to Dev Server”。
  • on: 指定触发条件。这里配置为 pushdev 分支时触发工作流。

作业配置 (jobs)

  • deploy: 定义一个名为 deploy 的作业,表示执行实际的部署过程。
  • runs-on: 指定运行环境,ubuntu-latest 表示使用最新的 Ubuntu 系统作为虚拟环境。

步骤配置 (steps)

每个步骤代表自动化任务中的一个执行单元,按顺序依次执行。

1. Checkout Code
- name: Checkout Code
  uses: actions/checkout@v3
  • 作用:从 GitHub 仓库中检出代码。
  • 说明:该步骤会将 dev 分支的代码拉取到 GitHub Actions 虚拟机中,为后续步骤做好准备。
2. Add SSH Key
- name: Add SSH Key
  run: |
    echo "${{ secrets.SSH_PEM_KEY }}" > deploy_key.pem
    chmod 600 deploy_key.pem
  • 作用:将存储在 GitHub Secrets 中的 SSH 私钥写入文件 deploy_key.pem 中,并将文件权限设置为 600(只有文件拥有者有读写权限)。
  • 说明:GitHub Secrets 存储的敏感信息可以通过 ${{ secrets.<VARIABLE_NAME> }} 引用。这里的 SSH_PEM_KEY 包含服务器的私钥信息,用于后续的 SSH 连接。
3. Run deployment script over SSH
- name: Run deployment script over SSH
  uses: appleboy/ssh-action@master
  with:
      host: ${{ secrets.SERVER_ADDRESS }}
      username: ${{ secrets.SERVER_USER }}
      key_path: deploy_key.pem
      script_stop: true
      script: |
        sudo -u www bash -c '
        cd /www/test-project
        git pull origin dev'
  • 作用:通过 SSH 连接到远程服务器并执行部署命令。
  • 说明
    • host:服务器地址,保存在 GitHub Secrets 中(如 SERVER_ADDRESS)。
    • username:用于登录服务器的用户名(如 SERVER_USER)。
    • key_path:私钥文件的路径,指定为刚才创建的 deploy_key.pem
    • script_stop:设置为 true,表示如果 SSH 脚本执行中发生错误,会停止整个工作流。
    • script:SSH 会话中执行的具体命令。
      • sudo -u www bash -c ‘…’:切换到 www 用户执行脚本,以确保文件的所有者正确。
      • git pull origin dev:从远程仓库的 dev 分支拉取最新代码,更新服务器端代码。
4. Cleanup
- name: Cleanup
  run: rm -f deploy_key.pem
  • 作用:删除 SSH 私钥文件,防止在后续步骤或其他作业中被意外泄露。
  • 说明:安全性考虑,这一步非常重要,防止密钥文件在虚拟机中遗留。

自动化前端构建工作流

name: Deploy to Dev Server

on:
  push:
    branches:
      - dev

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Code
        uses: actions/checkout@v3

      - name: Add SSH Key
        run: |
          echo "${{ secrets.SSH_PEM_KEY }}" > deploy_key.pem
          chmod 600 deploy_key.pem

      - name: Run deployment script over SSH
        uses: appleboy/ssh-action@master
        with:
            host: ${{ secrets.SERVER_ADDRESS }}
            username: ${{ secrets.SERVER_USER }}
            key_path: deploy_key.pem
            script_stop: true
            script: |
              sudo -u www bash -c '
              cd /www/test-project
              git pull origin dev
              npm install
              npm run build'

      - name: Cleanup
        run: rm -f deploy_key.pem

详细说明

  • 我们在 GitHub Actions 工作流中增加了自动安装依赖和构建前端项目的步骤。
    • npm install:在拉取最新代码后自动安装项目的所有依赖包。
    • npm run build:安装完依赖后,执行前端项目的构建命令,生成打包后的文件。

在原有的部署流程上,我们扩展了前端代码的自动化构建,以便每次在 dev 分支推送更新后,GitHub Actions 自动完成以下任务:

  • 拉取代码:将最新代码更新到服务器。
  • 安装依赖:使用 npm install 自动安装前端项目的依赖。
  • 执行构建:运行 npm run build 构建打包文件,确保服务器始终运行最新的前端版本。

这种工作流能够确保前端和后端代码在服务器上保持同步且自动化地更新和构建,避免了在本地打包后上传造成的开发环境不一致导致运行出现Bug等问题。

进一步优化

  • 配置自动通知:可以添加 GitHub Actions 的通知功能,配置为每次部署完成后自动通知开发者团队。可以通过 飞书、钉钉、邮件等集成方式实现。

结语

  • 通过 GitHub Actions 和 SSH 部署,极大地简化了开发流程中的部署环节,减少了手动操作,降低了人为错误的风险。
  • 更多配置场景可参考这篇Github文章

http://www.kler.cn/a/382789.html

相关文章:

  • AI - 使用LangChain请求LLM结构化生成内容
  • UML的另一个主角——用例图
  • Kubernetes(K8s)相关漏洞介绍
  • 【ChatGPT】如何通过逐步提示提高ChatGPT的细节描写
  • [mysql]mysql的DML数据操作语言增删改,以及新特性计算列,阿里巴巴开发手册mysql相关
  • 基于STM32的智能植物灌溉系统设计
  • 如何学习Python编程?
  • Qt桌面应用开发 第二天(信号和槽 Lambda表达式)
  • 中级图像处理工具
  • web——warmup——攻防世界
  • csrf令牌
  • 计算机视觉读书系列(1)——基本知识与深度学习基础
  • 【计算机网络】TCP协议面试常考(一)
  • 2024 Web3.0创新大赛在沪正式启动
  • 微服务之间的信息传递---OpenFeign拦截器
  • [OS] Prerequisite Knowledge about xv6
  • 【LeetCode】【算法】155. 最小栈
  • 常用查找算法count_if
  • 基于JavaWeb的宿舍管理系统的设计与实现
  • 【游戏引擎之路】登神长阶(十二)——DirectX11教程:If you‘re going through hell, keep going!
  • 英伟达的cuda和人工智能快车
  • ubuntu 22.04 server 安装 anaconda3
  • 【Zynq FPGA】基于 Zynq FPGA 的雷龙 SD NAND 测试
  • Java 8 Lambda 表达式和函数式接口的底层实现机制详解
  • 【Linux】【守护进程】总结整理
  • 【AI开源项目】FastGPT - 快速部署FastGPT以及使用知识库的两种方式!