Files
soul-yongping/.github/workflows/deploy.yml

118 lines
3.7 KiB
YAML

name: Deploy Next.js to Baota (Standalone)
on:
push:
branches:
- soul-content # 你的分支名
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 22
- name: Install pnpm
run: npm install -g pnpm
- name: Install dependencies
run: pnpm install
- name: Build project (standalone mode)
run: pnpm build
env:
NODE_ENV: production
- name: Package standalone output
run: |
# 创建临时打包目录
mkdir -p /tmp/deploy_package
# 复制 standalone 目录内容
cp -r .next/standalone/* /tmp/deploy_package/
# 复制 static 目录
mkdir -p /tmp/deploy_package/.next/static
cp -r .next/static/* /tmp/deploy_package/.next/static/
# 复制 public 目录
cp -r public /tmp/deploy_package/ 2>/dev/null || true
# 复制 PM2 配置文件
cp ecosystem.config.cjs /tmp/deploy_package/
# 打包
cd /tmp/deploy_package
tar -czf /tmp/deploy.tar.gz .
cd -
- name: Deploy to server via SCP
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
source: "/tmp/deploy.tar.gz"
target: "/tmp/"
strip_components: 0
- name: Extract and restart on server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /www/wwwroot/soul
# 备份当前版本(可选)
if [ -d ".next" ]; then
echo "备份当前版本..."
tar -czf /tmp/soul_backup_$(date +%Y%m%d_%H%M%S).tar.gz .next public ecosystem.config.cjs server.js package.json 2>/dev/null || true
fi
# 清理旧文件(保留 node_modules 如果存在)
rm -rf .next public ecosystem.config.cjs server.js package.json 2>/dev/null || true
# 解压新版本
echo "解压新版本..."
tar -xzf /tmp/deploy.tar.gz -C /www/wwwroot/soul
# 验证关键文件
if [ ! -f "server.js" ]; then
echo "错误: server.js 不存在,部署失败"
exit 1
fi
if [ ! -d ".next/static" ]; then
echo "警告: .next/static 目录不存在"
fi
# 设置权限
chmod +x server.js 2>/dev/null || true
# 重启 PM2 应用
echo "重启 PM2 应用..."
pm2 restart soul || pm2 start ecosystem.config.cjs || pm2 start server.js --name soul --env production
# 清理临时文件
rm -f /tmp/deploy.tar.gz
echo "部署完成!"
- name: Verify deployment
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
pm2 list
pm2 logs soul --lines 10 --nostream || echo "无法获取日志"