前端项目自动化部署改造方案

前端项目自动化部署改造方案

背景

传统的静态网站部署通常需要手动执行以下步骤:

  1. 本地构建项目
  2. 手动上传构建文件到服务器
  3. 配置Nginx虚拟主机
  4. 重启Web服务

这种手动部署方式存在以下问题:

  • 部署过程繁琐,容易出错
  • 无法保证部署的一致性
  • 缺乏版本控制和回滚机制
  • 部署效率低下,影响开发节奏

解决方案

采用 GitHub Actions + SSH 的自动化部署方案,通过 easingthemes/ssh-deploy 实现代码推送即自动部署。

⚠️ 重要提示

  1. 本文档面向已配置好 Nginx 的用户,假设您已经知道如何配置 Nginx 虚拟主机
  2. SSH 密钥最好不设置密码短语,否则 GitHub Actions 无法自动认证
  3. 请根据您的实际部署目录调整配置 ,本文档以 /var/www/pic-admin 为例

ssh-deploy 介绍

easingthemes/ssh-deploy 是一个基于 NodeJS 的 GitHub Action,专门用于通过 rsync over SSH 部署代码到远程服务器。

核心特性

  • 高效传输:使用 rsync 协议,只传输变更文件,比 Docker 版本快 1 分钟以上
  • 灵活配置:支持多种 rsync 参数和 SSH 配置选项
  • 脚本执行:支持部署前后执行自定义脚本
  • 安全可靠:基于 SSH 密钥认证,支持多种安全配置

主要参数

参数 类型 必需 说明
SSH_PRIVATE_KEY string SSH 私钥内容
REMOTE_HOST string 服务器 IP 或域名
REMOTE_USER string 服务器用户名
REMOTE_PORT string SSH 端口,默认 22
ARGS string rsync 参数,默认 -rlgoDzvc -i
SOURCE string 源目录,相对于工作空间根目录
TARGET string 目标目录,默认 /home/REMOTE_USER/
EXCLUDE string 排除路径,用逗号分隔
SCRIPT_BEFORE string 部署前执行的脚本
SCRIPT_AFTER string 部署后执行的脚本

部署架构

复制代码
本地开发 → GitHub仓库 → GitHub Actions → 服务器 → Nginx服务

详细实施步骤

1. 服务器环境准备

1.1 确认部署目录

我这里以我需要部署到的目录:/var/www/pic-admin为例。

确保您的 Nginx 已配置好,并确认部署目录路径。通常为:

bash 复制代码
# 检查您的 Nginx 配置中的 root 目录
# 例如:/var/www/html、/var/www/your-site、/usr/share/nginx/html 等
# 本文档以 /var/www/pic-admin 为例,请根据实际情况调整

# 确保部署目录存在且有正确权限
sudo mkdir -p /var/www/pic-admin
sudo chown -R $USER:$USER /var/www/pic-admin
sudo chmod -R 755 /var/www/pic-admin

注意 :请将 /var/www/pic-admin 替换为您实际的部署目录路径。

1.2 生成 SSH 密钥对
bash 复制代码
# 生成 SSH 密钥对(用于 GitHub Actions)
ssh-keygen -m PEM -t rsa -b 4096 -C "github-actions" -f ~/.ssh/github_actions

# ⚠️ 重要:不要设置密码短语,保持为空!
# 如果设置了密码短语,GitHub Actions 无法自动输入密码,会导致认证失败
# 将公钥添加到 authorized_keys
cat ~/.ssh/github_actions.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

常见问题:如果之前生成的密钥设置了密码短语,需要重新生成:

bash 复制代码
# 删除旧密钥
rm -f ~/.ssh/github_actions*

# 重新生成(注意:当提示输入密码短语时,直接按回车,不要输入任何内容)
ssh-keygen -m PEM -t rsa -b 4096 -C "github-actions" -f ~/.ssh/github_actions

# 将公钥添加到 authorized_keys
cat ~/.ssh/github_actions.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

# 设置权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/github_actions
chmod 644 ~/.ssh/github_actions.pub

2. GitHub 仓库配置

2.1 配置 Secrets

在 GitHub 仓库中配置以下 Secrets:

  1. 进入仓库 SettingsSecrets and variablesActions
  2. 点击 New repository secret 添加以下配置:
makefile 复制代码
ALIYUN_SSH_KEY: 服务器私钥内容 (~/.ssh/github_actions)
ALIYUN_HOST: 服务器IP地址
ALIYUN_USER: 服务器用户名(如 root 或 ubuntu)

我这里还配置了一个REMOTE_TARGET,如果可以,也可以更改TARGET的值为设置的这个变量。

2.2 获取私钥内容

在服务器上执行:

bash 复制代码
cat ~/.ssh/github_actions

将输出的完整内容复制到 GitHub Secrets 的 ALIYUN_SSH_KEY 中。

3. 项目配置

3.1 GitHub Actions 工作流

创建 .github/workflows/deploy.yml 文件:

yaml 复制代码
name: 部署图床管理后台到阿里云

on:
  push:
    branches:
      - main  # 推送到 main 分支时触发部署

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      # 获取代码
      - name: 迁出代码
        uses: actions/checkout@v4

      # 安装 Node.js 环境
      - name: 安装 Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'pnpm'

      # 安装依赖
      - name: 安装依赖
        run: pnpm install

      # 构建项目
      - name: 构建项目
        run: pnpm run build

      # 部署到阿里云服务器
      - name: 部署到阿里云服务器
        uses: easingthemes/ssh-deploy@main
        env:
          # SSH私钥
          SSH_PRIVATE_KEY: ${{ secrets.ALIYUN_SSH_KEY }}
          # SCP参数
          ARGS: '-avzr --delete'
          # 源目录(Vite构建后的dist目录)
          SOURCE: 'dist/'
          # 服务器IP
          REMOTE_HOST: ${{ secrets.ALIYUN_HOST }}
          # 服务器用户名
          REMOTE_USER: ${{ secrets.ALIYUN_USER }}
          # 目标目录
          TARGET: '/var/www/pic-admin'

      # 部署完成通知
      - name: 部署完成
        run: echo "图床管理后台部署完成!"
3.2 项目构建配置

确保 package.json 中有正确的构建脚本:

json 复制代码
{
  "scripts": {
    "dev": "vite --mode development",
    "build": "vite build --mode production",
    "preview": "vite preview"
  }
}

4. 部署流程

4.1 自动部署流程
  1. 代码推送:开发者推送代码到 main 分支
  2. 触发构建:GitHub Actions 自动检测到代码变更
  3. 环境准备:在 Ubuntu 环境中安装 Node.js 和依赖
  4. 项目构建 :执行 pnpm run build 生成 dist 目录
  5. 文件传输:使用 rsync 将构建文件传输到服务器
  6. 服务更新:Nginx 自动提供新的静态文件
4.2 手动触发部署

如果需要手动触发部署,可以:

  1. 在 GitHub 仓库的 Actions 页面
  2. 选择对应的工作流
  3. 点击 "Run workflow" 按钮

5. 监控和维护

5.1 部署状态监控
  • 在 GitHub 仓库的 Actions 页面查看部署状态
  • 绿色勾号表示部署成功
  • 红色叉号表示部署失败,可查看详细日志
5.2 常见问题排查

SSH 认证失败(Permission denied)

bash 复制代码
# 检查 SSH 服务状态
sudo systemctl status ssh

# 检查 authorized_keys 文件权限
ls -la ~/.ssh/authorized_keys

# 如果密钥设置了密码短语,需要重新生成(无密码)
rm -f ~/.ssh/github_actions*
ssh-keygen -m PEM -t rsa -b 4096 -C "github-actions" -f ~/.ssh/github_actions
# 注意:当提示输入密码短语时,直接按回车,不要输入任何内容

文件权限问题

bash 复制代码
# 修复文件权限
sudo chown -R $USER:$USER /var/www/pic-admin
sudo chmod -R 755 /var/www/pic-admin

网络连接问题

bash 复制代码
# 检查阿里云安全组是否开放SSH端口22
# 确保允许 0.0.0.0/0 访问SSH端口(临时测试用)

# 检查服务器防火墙
sudo ufw status
sudo iptables -L

部署目录不存在

bash 复制代码
# 确保目标目录存在
sudo mkdir -p /var/www/pic-admin
sudo chown -R $USER:$USER /var/www/pic-admin

6. 高级配置

6.1 多环境部署

可以配置多个环境(开发、测试、生产):

yaml 复制代码
# 开发环境
- name: 部署到开发环境
  if: github.ref == 'refs/heads/develop'
  uses: easingthemes/ssh-deploy@v5.1.0
  with:
    SSH_PRIVATE_KEY: ${{ secrets.DEV_SSH_KEY }}
    REMOTE_HOST: ${{ secrets.DEV_HOST }}
    TARGET: '/var/www/pic-admin-dev'

# 生产环境
- name: 部署到生产环境
  if: github.ref == 'refs/heads/main'
  uses: easingthemes/ssh-deploy@v5.1.0
  with:
    SSH_PRIVATE_KEY: ${{ secrets.PROD_SSH_KEY }}
    REMOTE_HOST: ${{ secrets.PROD_HOST }}
    TARGET: '/var/www/pic-admin'
6.2 部署前备份
yaml 复制代码
- name: 备份当前版本
  uses: easingthemes/ssh-deploy@v5.1.0
  with:
    SCRIPT_BEFORE: |
      if [ -d "/var/www/pic-admin" ]; then
        sudo cp -r /var/www/pic-admin /var/www/pic-admin-backup-$(date +%Y%m%d-%H%M%S)
        echo "备份完成"
      fi
6.3 部署后验证
yaml 复制代码
- name: 验证部署
  uses: easingthemes/ssh-deploy@v5.1.0
  with:
    SCRIPT_AFTER: |
      # 检查关键文件是否存在
      if [ -f "/var/www/pic-admin/index.html" ]; then
        echo "部署验证成功"
      else
        echo "部署验证失败"
        exit 1
      fi

优势总结

1. 自动化程度高

  • 代码推送即自动部署,无需手动干预
  • 减少人为错误,提高部署一致性

2. 部署效率高

  • 使用 rsync 只传输变更文件,传输速度快
  • 并行执行构建和部署,节省时间

3. 安全可靠

  • 基于 SSH 密钥认证,安全性高
  • 支持回滚和版本控制

4. 易于维护

  • 集中化的配置管理
  • 详细的部署日志和状态监控

5. 成本效益

  • 利用 GitHub Actions 的免费额度
  • 减少服务器维护成本

总结

通过使用 easingthemes/ssh-deploy 实现自动化部署,我们成功将传统的手动部署流程改造为现代化的 CI/CD 流程。这种方案不仅提高了部署效率,还增强了系统的可靠性和可维护性,为项目的持续发展奠定了坚实的基础。

相关推荐
Soulkey3 小时前
Grid布局
前端·css
springfe01013 小时前
react useCallback应用
前端
毛骗导演3 小时前
从零构建现代化 CLI 应用:Claude CI 技术实现详解
前端·javascript
CUGGZ3 小时前
前端开发的物理外挂来了,爽到飞起!
前端·后端·程序员
console.log('npc')3 小时前
前端性能优化,给录音播放的列表加个播放按键,点击之后再播放录音。减少页面的渲染录音文件数量过多导致加载缓慢
前端·javascript·vue.js·算法
江城开朗的豌豆3 小时前
React-Redux性能优化:告别"数据一变就刷屏"的烦恼!
前端·javascript·react.js
努力往上爬de蜗牛3 小时前
文件下载 针对安卓系统
前端·javascript·vue.js
一粒马豆3 小时前
excel表格通过前端fetch上传至后端flask处理流程示例
前端·python·flask·excel·h5·js·fetch
江城开朗的豌豆4 小时前
前端异步难题?用Redux-Thunk轻松搞定!
前端·javascript·react.js