totok22's space - CI/CD
type: channel
link: https://www.p0li.space/index.php/tag/CI-CD/
items: Nuxt CI/CD 部署

Nuxt CI/CD 部署
type: item
date: 2026-02-12T18:22:00+08:00
description: 概述CI/CD（持续集成/持续部署）是现代 Web 开发的标准实践。对于 Nuxt 应用而言，由于涉及服务端渲染、预渲染、环境变量等多个环节，部署流程相对复杂。本文记录了 Nuxt 应用的 CI/CD 部署实践。部署架构流程概览开发者推送代码到 GitHub │ ▼ ┌─────────────────────────────┐ │ GitHub Actions 触发 │ │ ┌─────────────────────────┐│ │ │ 1. Checkout 代码 ││ │ │ 2. Setup Node.js ││ │ │ 3. npm ci ││ │ │ 4. 构建项目 ││ │ │ 5. 打包构建产物 ││ │ └─────────────────────────┘│ └─────────────────────────────┘ │ ▼ ┌─────────────────────────────┐ │ SCP 上传到服务器 │ └─────────────────────────────┘ │ ▼ ┌─────────────────────────────┐ │ SSH 远程执行部署 │ │ ┌─────────────────────────┐│ │ │ 1. 清理旧构建产物 ││ │ │ 2. 解压新构建产物 ││ │ │ 3. PM2 重启服务 ││ │ └─────────────────────────┘│ └─────────────────────────────┘ │ ▼ 部署完成服务器架构 ┌─────────────┐ 用户请求 ──────►│ Nginx │ │ (端口 80) │ └──────┬──────┘ │ 反向代理 ▼ ┌─────────────┐ │ Nuxt │ │ (端口 3000)│ │ PM2 集群 │ └─────────────┘GitHub Actions 配置官方文档：https://docs.github.com/en/actions工作流文件创建 .github/workflows/deploy.yml：name: Deploy on: push: branches: - main workflow_dispatch: # 支持手动触发 jobs: build-and-deploy: runs-on: ubuntu-latest steps: # 1. 检出代码 - name: Checkout uses: actions/checkout@v4 # 2. 设置 Node.js 环境 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '22' cache: 'npm' # 3. 安装依赖 - name: Install dependencies run: | npm ci npm install --platform=linux --arch=x64 sharp # 4. 安装 jemalloc（可选，解决 sharp 内存问题） - name: Install jemalloc run: | sudo apt-get update -qq sudo apt-get install -y -qq libjemalloc2 > /dev/null 2>&1 # 5. 构建项目 - name: Build Project run: npm run build env: NODE_ENV: production NODE_OPTIONS: '--max-old-space-size=6144 --no-node-snapshot' VIPS_WARNING: '0' LD_PRELOAD: /usr/lib/x86_64-linux-gnu/libjemalloc.so.2 # 6. 打包构建产物 - name: Zip Output run: tar -czf release.tar.gz .output ecosystem.config.cjs # 7. 上传到服务器 - name: Upload to Server uses: appleboy/scp-action@v0.1.4 with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SERVER_SSH_KEY }} source: 'release.tar.gz' target: '/tmp' # 8. 执行部署 - name: Execute Deploy uses: appl…