# ════════════════════════════════════════════════════════════════ # 光湖 · 自动部署到预览环境 # Trigger: push to main # 部署到测试+预览环境,正式环境需冰朔在Gitea点Merge # ════════════════════════════════════════════════════════════════ name: 自动部署预览 on: push: branches: [main] paths: - 'server/**' - 'frontend/**' - 'scripts/**' - '.gitea/workflows/**' workflow_dispatch: jobs: # ── 第一阶段:测试 ────────────────────────────────── test: runs-on: ubuntu steps: - name: 拉取最新代码 run: | cd /data/guanghulab 2>/dev/null || exit 0 git fetch origin git reset --hard origin/main - name: 安装依赖 run: | cd /data/guanghulab/server/secrets-vault 2>/dev/null || exit 0 npm install --production 2>/dev/null || true - name: 健康检查 run: | echo "═══ 服务健康检查 ═══" FAILED="" # Nginx if systemctl is-active --quiet nginx; then echo "✅ Nginx" else echo "❌ Nginx 宕机" FAILED="$FAILED nginx" fi # Gitea if curl -sf http://127.0.0.1:3000/ > /dev/null 2>&1; then echo "✅ Gitea" else echo "❌ Gitea 宕机" FAILED="$FAILED gitea" fi # Vault if curl -sf http://127.0.0.1:8080/admin/__healthz > /dev/null 2>&1; then echo "✅ Vault" else echo "⚠️ Vault 未运行" fi # Runner if systemctl is-active --quiet gitea-runner; then echo "✅ Runner" else echo "⚠️ Runner 未运行" fi if [[ -n "$FAILED" ]]; then echo "❌ 关键服务宕机: $FAILED" echo "⚠️ 跳过部署,等待修复" exit 1 fi echo "═══ 测试通过 ✅ ═══" # ── 第二阶段:预览部署 ────────────────────────────── preview: needs: test runs-on: ubuntu steps: - name: 同步代码到预览目录 run: | REPO="/data/guanghulab" PREVIEW="/data/guanghulab-preview" if [[ ! -d "$REPO" ]]; then echo "仓库目录不存在,跳过" exit 0 fi # 创建预览目录 mkdir -p "$PREVIEW" # 同步代码(排除.git和node_modules) rsync -a --delete \ --exclude='.git' \ --exclude='node_modules' \ --exclude='.runtime' \ "$REPO/" "$PREVIEW/" echo "✅ 预览环境已同步" - name: 重启预览服务 run: | PREVIEW="/data/guanghulab-preview" if [[ ! -d "$PREVIEW/server/secrets-vault" ]]; then exit 0 fi cd "$PREVIEW/server/secrets-vault" # 安装依赖 npm install --production 2>/dev/null || true # 如果vault在跑,重启它 if pm2 describe guanghulab-vault &>/dev/null; then pm2 restart guanghulab-vault echo "✅ Vault 已重启(使用最新代码)" else echo "ℹ️ Vault 未运行,不自动启动" fi - name: 部署完成通知 run: | echo "═════════════════════════" echo "✅ 预览环境已更新" echo "时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "冰朔可在浏览器查看预览效果" echo "正式部署需在Gitea创建PR并Merge" echo "═════════════════════════"