GitHub Action 通过SSH 自动部署到云服务器上

准备

正式开始之前,你需要掌握 GitHub Action 的基础语法:

  • workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。
  • name: 工作流的名称。
  • on: 指定次工作流的触发器。push 表示只要有人将更改推送到仓库就会触发工作流运行。(点击这里了解如何指定特定分支,路径或标签)
  • jobs: 将工作流运行的所有作业组合到一起。
  • build-and-deploy: 定义的作业的名称。
  • runs-on: 将作业配置为在最新版本的 Ubuntu Linux 上运行。这意味着作业将在 GitHub 托管的新虚拟机上执行。有关使用其他运行器的语法示例,请参阅 GitHub 操作的工作流语法。
  • steps: 将作业中运行的所有步骤组合在一起。嵌套在此部分下的每个项都是一个单独的操作或 shell 脚本。
  • uses: 指定需要运行的 action。
  • env: 指定运行 action 时需要用到的环境变量的值。

一、密钥准备

为了方便运行GitHub Actions时登录GitHub账号,我们使用SSH方式登录。就是要把设备的私钥交给GitHub Actions,公钥交给GitHub,需要去Settings里去配置。

使用ssh-keygen生成一组公私秘钥对

javascript 复制代码
ssh-keygen -t rsa -C "Github 的邮箱地址"

如 ssh-keygen -t rsa -C "123@gmail.com"
  • 配置公钥,配置路径:github你的首页-->Settings-->SSH and GPG keys
  • 配置私钥,项目私有仓库的Settings->Secrets里添加私钥,名称为PRIVATE_KEY

二、新建项目仓库

在仓库的Actions选项卡下点击新建.github/workflow/blank.yml,名称默认或者自定义修改,配置如下:

javascript 复制代码
# This is a basic workflow to help you get started with Actions

name: Deploy My Server

on:
  push:
    branches: [ master ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v2

      - name: use Node.js
        # 使用action库  actions/setup-node安装node
        uses: actions/setup-node@v1
        with:
          node-version: 16.x
      # 安装依赖
      - name: npm install
        run: npm install
      # 打包
      - name: npm build
        run: npm run build
      # 部署到服务器
      - name: deploy
        uses: easingthemes/ssh-deploy@v2.1.1
        env:
          # 本地.ssh文件下的私钥id_rsa,存在secrets的PRIVATE_KEY中
          SSH_PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
          # 复制操作的参数。"-avzr --delete"意味部署时清空服务器目标目录下的文件
          ARGS: "-avzr --delete" 
          # 源目录,相对于$GITHUB_WORKSPACE根目录的路径
          SOURCE: "./public/"
          # 服务器域名/IP
          REMOTE_HOST: ${{ secrets.HOST }}
          # 服务器默认用户名为root
          REMOTE_USER: "root"
          # 目标目录
          TARGET: '/usr/local/xxx/dist'
          # 排除目录
          EXCLUDE: "/node_modules/"

参数项:

  • 部署到云服务器上需要用到 easingthemes/ssh-deploy@main
  • SSH_PRIVATE_KEY: 是在服务器上生成的 SSH 私钥,可以使用命令 ssh-keygen -m PEM -t rsa -b 4096 生成,并配置到仓库的 Secrets 中。
  • ARGS: 默认即可。
  • SOURCE: 需要上传到服务器上的文件的目录。
  • REMOTE_HOST: 服务器公网 IP 或域名。
  • REMOTE_USER: 服务器 SSH 用户名。
  • TARGET: 文件上传到服务器上保存的目录。
  • EXCLUDE: 可指定部分文件不上传。

文件同步原理请参考rsync教程

三、push分支到仓库

push内容到仓库后,Action会自动执行工作流,此时你再看看你配置的TARGET服务器目录,就会发现文件dist被拷贝过去了

相关推荐
Danileaf_Guo4 小时前
256台H100服务器算力中心的带外管理网络建设方案
运维·服务器
拾贰_C6 小时前
【Linux | Windows | Terminal Command】 Linux---grep | Windows--- findstr
linux·运维·服务器
JustHappy7 小时前
「chrome extensions🛠️」我写了一个超级简单的浏览器插件Vue开发模板
前端·javascript·github
alengan7 小时前
linux上面写python3日志服务器
linux·运维·服务器
阿里嘎多学长8 小时前
2025-12-16 GitHub 热点项目精选
开发语言·程序员·github·代码托管
小卒过河01049 小时前
使用apache nifi 从数据库文件表路径拉取远程文件至远程服务器目的地址
运维·服务器·数据库
土星云SaturnCloud9 小时前
液冷“内卷”:在局部优化与系统重构之间,寻找第三条路
服务器·人工智能·ai·计算机外设
五月底_9 小时前
上传大量文件到github repo
git·github
Trouvaille ~10 小时前
【Linux】理解“一切皆文件“与缓冲区机制:Linux文件系统的设计哲学
linux·运维·服务器·操作系统·进程·文件·缓冲区