161 lines
5.3 KiB
YAML
161 lines
5.3 KiB
YAML
name: Deploy Frontend via Git
|
|
|
|
# 触发条件
|
|
on:
|
|
# 当推送到主分支且修改前端相关文件时自动触发
|
|
push:
|
|
branches: [ main ]
|
|
paths:
|
|
- 'frontend/**'
|
|
- '.github/workflows/deploy_frontend.git.yml'
|
|
# 支持手动触发
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
build-and-deploy:
|
|
runs-on: ubuntu-latest
|
|
|
|
steps:
|
|
# 检出代码
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
|
|
# 设置Node.js环境
|
|
- name: Set up Node.js
|
|
uses: actions/setup-node@v4
|
|
with:
|
|
node-version: '18'
|
|
cache: 'npm'
|
|
cache-dependency-path: frontend/package-lock.json
|
|
|
|
# 缓存node_modules和构建输出
|
|
- name: Cache dependencies and build
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: |
|
|
frontend/node_modules
|
|
frontend/production
|
|
key: ${{ runner.os }}-frontend-${{ hashFiles('frontend/package-lock.json', 'frontend/src/**/*', 'frontend/vite.config.ts') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-frontend-${{ hashFiles('frontend/package-lock.json') }}
|
|
${{ runner.os }}-frontend-
|
|
|
|
# 安装依赖
|
|
- name: Install dependencies
|
|
run: |
|
|
cd frontend
|
|
npm ci
|
|
|
|
# 并行执行类型检查和构建
|
|
- name: Type check and build
|
|
run: |
|
|
cd frontend
|
|
# 并行执行类型检查和构建以节省时间
|
|
npm run type-check &
|
|
npm run build:prod &
|
|
wait
|
|
# 检查构建结果
|
|
echo "Build completed, checking production directory:"
|
|
ls -la production/
|
|
|
|
# 准备临时部署目录
|
|
- name: Prepare temp directory
|
|
uses: appleboy/ssh-action@v1.0.3
|
|
with:
|
|
host: ${{ secrets.HOST_PI }}
|
|
username: pi
|
|
password: ${{ secrets.PASS_PI }}
|
|
port: 22
|
|
script: |
|
|
sudo rm -rf /home/pi/lm-www/frontend_tmp
|
|
sudo mkdir -p /home/pi/lm-www/frontend_tmp
|
|
sudo chown -R pi:pi /home/pi/lm-www/frontend_tmp
|
|
|
|
# 安装 rsync(用于带进度显示的文件传输)
|
|
- name: Install rsync
|
|
run: sudo apt-get update && sudo apt-get install -y rsync sshpass
|
|
|
|
# 计算要传输的文件总大小
|
|
- name: Calculate total size
|
|
id: calc_size
|
|
run: |
|
|
cd frontend/production
|
|
TOTAL_SIZE=$(du -sb . | cut -f1)
|
|
echo "total_size=$TOTAL_SIZE" >> $GITHUB_OUTPUT
|
|
echo "Total size to transfer: $(numfmt --to=iec-i --suffix=B $TOTAL_SIZE)"
|
|
|
|
# 将构建产物传输到服务器(带进度显示)
|
|
- name: Copy build files to server with progress
|
|
run: |
|
|
set -e
|
|
echo "Starting file transfer with rsync..."
|
|
|
|
# 启动后台传输(使用 --info=progress2 只显示总体进度,减少输出)
|
|
sshpass -p "${{ secrets.PASS_PI }}" rsync -avz --info=progress2 \
|
|
-e "ssh -o StrictHostKeyChecking=no" \
|
|
frontend/production/ \
|
|
pi@${{ secrets.HOST_PI }}:/home/pi/lm-www/frontend_tmp/ > /tmp/rsync.log 2>&1 &
|
|
RSYNC_PID=$!
|
|
|
|
# 每10秒显示一次进度
|
|
TOTAL_SIZE=${{ steps.calc_size.outputs.total_size }}
|
|
echo "📦 Total size: $(numfmt --to=iec-i --suffix=B $TOTAL_SIZE 2>/dev/null || echo "${TOTAL_SIZE}B")"
|
|
|
|
while kill -0 $RSYNC_PID 2>/dev/null; do
|
|
sleep 10
|
|
# 通过SSH检查目标目录大小
|
|
TRANSFERRED=$(sshpass -p "${{ secrets.PASS_PI }}" ssh -o StrictHostKeyChecking=no \
|
|
pi@${{ secrets.HOST_PI }} \
|
|
"du -sb /home/pi/lm-www/frontend_tmp 2>/dev/null | cut -f1" || echo "0")
|
|
|
|
if [ "$TRANSFERRED" != "0" ] && [ "$TOTAL_SIZE" != "0" ]; then
|
|
PERCENT=$((TRANSFERRED * 100 / TOTAL_SIZE))
|
|
TRANSFERRED_HR=$(numfmt --to=iec-i --suffix=B $TRANSFERRED 2>/dev/null || echo "${TRANSFERRED}B")
|
|
TOTAL_HR=$(numfmt --to=iec-i --suffix=B $TOTAL_SIZE 2>/dev/null || echo "${TOTAL_SIZE}B")
|
|
echo "📦 Transfer progress: $PERCENT% ($TRANSFERRED_HR / $TOTAL_HR)"
|
|
else
|
|
echo "📦 Transfer in progress..."
|
|
fi
|
|
done
|
|
|
|
# 等待传输完成并检查退出码
|
|
wait $RSYNC_PID
|
|
EXIT_CODE=$?
|
|
|
|
# 显示 rsync 的最后几行输出
|
|
echo "--- rsync output (last 20 lines) ---"
|
|
tail -20 /tmp/rsync.log || true
|
|
|
|
if [ $EXIT_CODE -eq 0 ]; then
|
|
echo "✅ File transfer completed!"
|
|
else
|
|
echo "❌ File transfer failed with exit code $EXIT_CODE"
|
|
exit $EXIT_CODE
|
|
fi
|
|
env:
|
|
DEBIAN_FRONTEND: noninteractive
|
|
|
|
# 完成部署:直接替换并重启 nginx
|
|
- name: Deploy to production
|
|
uses: appleboy/ssh-action@v1.0.3
|
|
with:
|
|
host: ${{ secrets.HOST_PI }}
|
|
username: pi
|
|
password: ${{ secrets.PASS_PI }}
|
|
port: 22
|
|
script: |
|
|
set -e
|
|
|
|
echo "Deploying to production..."
|
|
sudo rm -rf /home/pi/lm-www/frontend
|
|
sudo mv /home/pi/lm-www/frontend_tmp /home/pi/lm-www/frontend
|
|
|
|
echo "Setting permissions..."
|
|
sudo chown -R www-data:www-data /home/pi/lm-www/frontend/
|
|
sudo chmod -R 644 /home/pi/lm-www/frontend/
|
|
sudo find /home/pi/lm-www/frontend/ -type d -exec chmod 755 {} \;
|
|
|
|
echo "Reloading nginx..."
|
|
sudo systemctl reload nginx
|
|
|
|
echo "✅ Deployment completed!" |