使用 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/test-project
              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文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/913401.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Logrus入门

Logrus入门 1. 下载 go get github.com/sirupsen/logrus2. logrus常用方法 logrus.Debugln("Debugln") logrus.Infoln("Infoln") logrus.Warnln("Warnln") logrus.Errorln("Errorln") logrus.Println("Println")// 输出如…

告别重启大法,CPU飙高问题如何排查详细教程以及解决方案

文章目录 0 前言1.确定问题进程2.获取线程信息3.转换线程ID为十六进制4.获取线程堆栈5.分析代码6.性能分析工具7. 查看GC日志8.检查系统资源总结 0 前言 本篇是本人认为最实用的一篇&#xff0c;在日常开发运维工作中&#xff0c;经常遇到CPU较高的情况&#xff0c;一开始时还不…

在 Jupyter Notebook 中使用 Matplotlib 进行交互式可视化的教程

在 Jupyter Notebook 中使用 Matplotlib 进行交互式可视化的教程 引言 数据可视化是数据分析的重要组成部分&#xff0c;能够帮助我们更直观地理解数据。Matplotlib 是 Python 中最流行的绘图库之一&#xff0c;而 Jupyter Notebook 则是进行数据分析和可视化的理想环境。本文…

数据库SQL——什么是实体-联系模型(E-R模型)?

目录 什么是实体-联系模型&#xff1f; 1.实体集 2.联系集 3.映射基数 一对一&#xff08;1:1&#xff09; 一对多&#xff08;1:n&#xff09; 多对一&#xff08;n:1&#xff09; 多对多&#xff08;m:n&#xff09; 全部参与&#xff1a; 4.主码 弱实体集&#xf…

机器学习4_支持向量机_核函数——MOOC

目录 核函数的定义 核函数以及低维到高维的映射 的相互关系 例1&#xff1a;已知 求 K 例2&#xff1a;已知核函数 K 求 映射 的例子 核函数 K 求 映射 是一一对应的关系 支持向量机优化问题 K 满足交换性和半正定性 内积的形式 例如&#xff1a;可以证明 核函数…

LRU-LFU缓存算法

文章目录 缓存算法LRU缓存算法LFU缓存算法定义实现方法一&#xff1a;哈希表平衡二叉树方法二&#xff1a;双哈希表哈希链表方法三&#xff1a;双哈希表 缓存算法 LRU缓存算法 https://labuladong.online/algo/data-structure/lru-cache/ LRU&#xff08;Least Recently Use…

斯坦福泡茶机器人DexCap源码解析:涵盖收集数据、处理数据、模型训练三大阶段

前言 因为我司「七月在线」关于dexcap的复现/优化接近尾声了&#xff0c;故准备把dexcap的源码也分析下。​下周则分析下iDP3的源码——为队伍「iDP3人形的复现/优化」助力 最开始&#xff0c;dexcap的源码分析属于此文《DexCap——斯坦福李飞飞团队泡茶机器人&#xff1a;带…

DICOM标准:DICOM医学影像中的覆盖层(Overlay)概念详解

引言 DICOM&#xff08;数字成像和通信医学&#xff09;标准在医学影像的存储、传输和交换中起着关键作用。覆盖层&#xff08;Overlay&#xff09;作为DICOM标准中的一个重要组成部分&#xff0c;用于在医学影像上叠加图形信息&#xff0c;如注释、标记、测量结果等。本文将深…

Windows搭建流媒体服务并使用ffmpeg推流播放rtsp和rtmp流

文章目录 搭建流媒体服务方式一安装mediamtx启动meidamtx关闭meidamtx 方式二安装ZLMediaKit启动ZLMediaKit关闭ZLMediaKit 安装FFmpeg进行推流使用FFmpeg进行rtmp推流使用VLC播放rtmp流停止FFmpeg的rtmp推流使用FFmpeg进行rtsp推流使用VLC播放rtmp流停止FFmpeg的rtsp推流 本文…

[ Linux 命令基础 5 ] Linux 命令详解-网络管理命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

深入浅出WebSocket(实践聊天室demo)

文章目录 什么是WebSocket?WebSocket连接过程WebSocket与Http的区别重连机制完整代码使用方法心跳机制实现聊天室demo(基于Socket.io)参考文章、视频小广告~什么是WebSocket? WebSocket 是一种在单个TCP连接上进行全双工通信的协议(计算机网络应用层的协议) 在 WebSocket A…

时序预测 | 改进图卷积+informer时间序列预测,pytorch架构

时序预测 | 改进图卷积informer时间序列预测&#xff0c;pytorch架构 目录 时序预测 | 改进图卷积informer时间序列预测&#xff0c;pytorch架构预测效果基本介绍参考资料 预测效果 基本介绍 改进图卷积informer时间序列预测代码 CTR-GC卷积,informer&#xff0c;CTR-GC 图卷积…

vue+Leaflet.PM插件实现创建和编辑几何图形(点、线、面、圆等)

场景 VueLeaflet实现加载OSM显示地图&#xff1a;https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/122317394在上面加载显示OSM的基础上&#xff0c;使用Leaflet.pm插件实现在页面上绘制、编辑、剪切、移动几何元素。Leaflet.pm插件 用于创建和编辑几何图层的插件可…

网站架构知识之Ansible进阶2(day023)

1.include文件 应用场景: 1个ansible剧本内容过多,涉及到多个play(- host:web),可读性变弱&#xff0c;不方便调试。 于是人们想出把单个大的剧本拆分为多个小的剧本&#xff0c; 多个小的剧本可以通过include功能合并使用。 使用方法&#xff0c;书写好对应的剧本文件&#…

订单日记助力“实峰科技”提升业务效率

感谢北京实峰科技有限公司选择使用订单日记&#xff01; 北京实峰科技有限公司&#xff0c;成立于2022年&#xff0c;位于北京市石景区&#xff0c;是一家以从事生产、销售微特电机、输配电及控制设备等业务为主的企业。 在业务不断壮大的过程中&#xff0c;想使用一种既能提…

论文阅读:DualDn Dual-domain Denoising via Differentiable ISP

这篇文章是 2024 ECCV 的一篇文章&#xff0c;介绍的是降噪相关的工作。 Abstract 图像去噪是相机图像信号处理 (ISP) 流程中的一个关键组成部分。将去噪器融入 ISP 流程有两种典型方式&#xff1a;直接对拍摄的原始帧&#xff08;RAW域&#xff09;应用去噪器&#xff0c;或…

详解MySQL安装

目录 Ubantu 1. 使⽤apt安装MySQL 2.查看MySQL状态 3. MySQL 安装安全设置 4.设置密码 卸载MySQL Centos 1. 确认当前的系统版本 2.下载MySQL源 3.安装MySQL 4.启动mysqld 5.查看MySQL状态 6.设置开机自启动 7.查看MySQL密码&#xff0c;并登录 8.修改密码 Ubant…

AndroidStudio-视图基础

一、设置视图的宽高 1.在XML文件中设置视图宽高 视图宽度通过属性android:layout_width表达&#xff0c;视图高度通过属性android:layout_height表达&#xff0c;宽高的取值主要有下列三种: &#xff08;1&#xff09;wrap_content:表示与内容自适应。对于文本视图来说&…

【LQ_tips】在DEVc++中的带空格的输入格式

目标输入&#xff1a; 3 4 5 6 关于cin.ignore();的解释&#xff1a; 在 DEV C 或任何其他 C 环境中&#xff0c;如果你的代码没有输出&#xff0c;这可能是由于输入缓冲区的问题。当你使用 cin 读取输入时&#xff0c;如果输入中包含空格&#xff0c;cin 会停止读取。因此&a…

dolphin 配置data 从文件导入hive 实践(一)

datax 支持多种数据源的相互读写&#xff0c;作为开源软件&#xff0c;提供了离线采集功能&#xff0c;方便系统开发&#xff0c;过程中遇到诸多配置&#xff0c;需要开发者自己探索&#xff0c;免费同样有成本 配置模板 {"setting": {},"job": {"s…