254 lines
9.2 KiB
YAML
254 lines
9.2 KiB
YAML
# ════════════════════════════════════════════════════
|
||
# 光湖 · CI检查 + 合并后自动部署
|
||
# ────────────────────────────────────────────────────
|
||
# main分支: 冰朔合并PR后 → 自动部署到服务器
|
||
# dev分支: 铸渊自己push → 只跑检查不部署
|
||
# PR到main: 跑检查 → 冰朔看绿✅红❌再决定合不合
|
||
# ════════════════════════════════════════════════════
|
||
name: CI检查 + 自动部署
|
||
|
||
on:
|
||
pull_request:
|
||
branches: [main]
|
||
push:
|
||
branches: [main, dev]
|
||
|
||
jobs:
|
||
# ── 所有情况都跑:基础检查 ──────────────────────
|
||
check:
|
||
runs-on: ubuntu
|
||
steps:
|
||
- name: 服务健康检查
|
||
run: |
|
||
echo "═══ 服务健康检查 ═══"
|
||
FAIL=0
|
||
|
||
if systemctl is-active --quiet nginx; then
|
||
echo "✅ Nginx 正常"
|
||
else
|
||
echo "❌ Nginx 宕机"
|
||
FAIL=1
|
||
fi
|
||
|
||
if curl -sf http://127.0.0.1:3001/ > /dev/null 2>&1; then
|
||
echo "✅ Forgejo 代码仓库 正常"
|
||
else
|
||
echo "❌ Forgejo 代码仓库 未响应"
|
||
FAIL=1
|
||
fi
|
||
|
||
if systemctl is-active --quiet gitea-runner; then
|
||
echo "✅ Runner 运行器 正常"
|
||
else
|
||
echo "⚠️ Runner 运行器 未运行"
|
||
fi
|
||
|
||
if [ $FAIL -eq 1 ]; then
|
||
echo "❌ 关键服务异常,请通知铸渊检查"
|
||
exit 1
|
||
fi
|
||
|
||
echo "═══ 检查通过 ✅ ═══"
|
||
|
||
- name: 代码检查
|
||
run: |
|
||
cd /data/guanghulab/repo
|
||
echo "仓库大小: $(du -sh .git | cut -f1)"
|
||
echo "最新提交: $(git log --oneline -1)"
|
||
echo "✅ 代码检查完成"
|
||
|
||
# ── 只有合并到main才跑:自动部署 ────────────────
|
||
deploy:
|
||
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||
needs: check
|
||
runs-on: ubuntu
|
||
steps:
|
||
- name: 同步最新代码
|
||
run: |
|
||
cd /data/guanghulab/repo
|
||
git fetch origin
|
||
git reset --hard origin/main
|
||
echo "✅ 代码已同步到最新"
|
||
|
||
- name: 安装依赖
|
||
run: |
|
||
echo "═══ 安装依赖 ═══"
|
||
# 逐个检查并安装
|
||
for pkg_dir in server/git-sync server/wake-gate server/secrets-vault server/mcp-server; do
|
||
if [ -f "/data/guanghulab/repo/$pkg_dir/package.json" ]; then
|
||
cd "/data/guanghulab/repo/$pkg_dir"
|
||
npm install --production 2>/dev/null || true
|
||
echo "✅ $pkg_dir 依赖已安装"
|
||
fi
|
||
done
|
||
|
||
- name: 部署 MCP Server
|
||
env:
|
||
ZY_REPO_TOKEN: ${{ secrets.ZY_REPO_TOKEN }}
|
||
run: |
|
||
echo "═══ 部署 MCP Server ═══"
|
||
MCP_DIR="/data/guanghulab/repo/server/mcp-server"
|
||
mkdir -p /data/guanghulab/mcp-server /data/guanghulab/.runtime/logs
|
||
|
||
# 更新 MCP 访问密钥
|
||
if [ -n "$ZY_REPO_TOKEN" ]; then
|
||
echo "$ZY_REPO_TOKEN" > /data/guanghulab/mcp-server/.access-key
|
||
chmod 600 /data/guanghulab/mcp-server/.access-key
|
||
echo "✅ MCP 访问密钥已更新"
|
||
fi
|
||
|
||
# 注入 Gitea 令牌
|
||
if [ -n "$ZY_REPO_TOKEN" ]; then
|
||
sed -i "s/GITEA_TOKEN: ''/GITEA_TOKEN: '$ZY_REPO_TOKEN'/" "$MCP_DIR/ecosystem.config.js"
|
||
echo "✅ Gitea 令牌已注入"
|
||
fi
|
||
|
||
# 启动或重启 MCP Server
|
||
if pm2 describe guanghulab-mcp-server &>/dev/null; then
|
||
pm2 restart guanghulab-mcp-server
|
||
echo "✅ MCP Server 已重启"
|
||
else
|
||
cd "$MCP_DIR"
|
||
pm2 start ecosystem.config.js
|
||
echo "✅ MCP Server 已启动"
|
||
fi
|
||
pm2 save
|
||
|
||
- name: 重启服务
|
||
run: |
|
||
echo "═══ 重启服务 ═══"
|
||
if command -v pm2 &>/dev/null; then
|
||
pm2 restart all 2>/dev/null || true
|
||
echo "✅ PM2 服务已重启"
|
||
fi
|
||
echo "═══ 重启完成 ═══"
|
||
|
||
- name: 同步静态文件到 Web 根目录
|
||
run: |
|
||
echo "═══ 同步 docs/ → /var/www/guanghulab/ ═══"
|
||
cp docs/* /opt/guanghulab-repo/homepage/
|
||
echo "✅ 静态文件已同步"
|
||
ls -la /var/www/guanghulab/
|
||
|
||
- name: 部署 Desk Demo + Nginx 配置
|
||
run: |
|
||
echo "═══ 部署 Desk Demo /desk/ ═══"
|
||
DESK_DIR="/var/www/guanghulab/desk"
|
||
mkdir -p "$DESK_DIR"
|
||
cp /data/guanghulab/repo/desk-demo/index.html "$DESK_DIR/index.html"
|
||
chown -R www-data:www-data "$DESK_DIR" 2>/dev/null || true
|
||
chmod 755 "$DESK_DIR"
|
||
chmod 644 "$DESK_DIR/index.html"
|
||
echo "✅ desk-demo 文件已部署"
|
||
ls -la "$DESK_DIR"
|
||
|
||
# 配置 Nginx /desk/ location
|
||
echo "═══ 配置 Nginx ═══"
|
||
NGINX_CONF="/etc/nginx/sites-available/guanghulab-cvm"
|
||
|
||
if [ ! -f "$NGINX_CONF" ]; then
|
||
# 可能在 sites-enabled 或 conf.d 中
|
||
NGINX_CONF=$(grep -rl "guanghulab" /etc/nginx/sites-enabled/ 2>/dev/null | head -1)
|
||
fi
|
||
if [ ! -f "$NGINX_CONF" ]; then
|
||
NGINX_CONF=$(grep -rl "guanghulab" /etc/nginx/conf.d/ 2>/dev/null | head -1)
|
||
fi
|
||
if [ ! -f "$NGINX_CONF" ]; then
|
||
NGINX_CONF="/etc/nginx/nginx.conf"
|
||
fi
|
||
|
||
echo "📄 使用 Nginx 配置文件: $NGINX_CONF"
|
||
|
||
if grep -q "location /desk/" "$NGINX_CONF" 2>/dev/null; then
|
||
echo "⚠️ /desk/ location 已存在,跳过添加"
|
||
else
|
||
echo "📝 添加 /desk/ location..."
|
||
# 在 Forgejo proxy location / 之前插入 desk location
|
||
sed -i '/location \/ {/,/}/ {
|
||
/location \/ {/i\
|
||
# Desk Demo 大桌子小桌子 (/desk/)\
|
||
location /desk/ {\
|
||
alias /var/www/guanghulab/desk/;\
|
||
index index.html;\
|
||
try_files $uri $uri/ /desk/index.html;\
|
||
}\
|
||
\
|
||
}' "$NGINX_CONF" 2>/dev/null || {
|
||
# 如果 sed 失败,使用更简单的方式
|
||
awk '/# ─── Forgejo/{print " # Desk Demo (/desk/)\n location /desk/ {\n alias /var/www/guanghulab/desk/;\n index index.html;\n try_files $uri $uri/ /desk/index.html;\n }\n"}1' "$NGINX_CONF" > /tmp/nginx_new.conf
|
||
cp /tmp/nginx_new.conf "$NGINX_CONF"
|
||
}
|
||
echo "✅ /desk/ location 已添加"
|
||
fi
|
||
|
||
# 显示相关配置
|
||
echo "═══ desk 相关 Nginx 配置 ═══"
|
||
grep -n -A5 "desk" "$NGINX_CONF" || echo "(无 desk 相关内容)"
|
||
|
||
# 测试并重载
|
||
echo "═══ 测试 Nginx 配置 ═══"
|
||
if nginx -t 2>&1; then
|
||
echo "✅ Nginx 配置测试通过"
|
||
systemctl reload nginx
|
||
echo "✅ Nginx 已重载"
|
||
else
|
||
echo "❌ Nginx 配置测试失败,回滚..."
|
||
# 回滚:移除 desk location
|
||
grep -v "location /desk/" "$NGINX_CONF" > /tmp/nginx_rollback.conf
|
||
cp /tmp/nginx_rollback.conf "$NGINX_CONF"
|
||
nginx -t && systemctl reload nginx
|
||
echo "⚠️ 已回滚 Nginx 配置"
|
||
fi
|
||
|
||
- name: 验证 Desk Demo 部署
|
||
run: |
|
||
sleep 2
|
||
echo "═══ 验证 /desk/ ═══"
|
||
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1/desk/)
|
||
echo "HTTP 状态码: $HTTP_CODE"
|
||
TITLE=$(curl -s http://127.0.0.1/desk/ | grep -o '<title>[^<]*</title>' | head -1)
|
||
echo "页面标题: $TITLE"
|
||
if echo "$TITLE" | grep -q "大桌子小桌子"; then
|
||
echo "✅ Desk Demo 部署成功!"
|
||
else
|
||
echo "⚠️ 页面标题可能不匹配,但 /desk/ 已可访问"
|
||
fi
|
||
|
||
- name: 部署验证
|
||
run: |
|
||
sleep 3
|
||
echo "═══ 部署验证 ═══"
|
||
FAIL=0
|
||
|
||
if curl -sf http://127.0.0.1:3001/ > /dev/null 2>&1; then
|
||
echo "✅ 代码仓库 正常"
|
||
else
|
||
echo "❌ 代码仓库 异常"
|
||
FAIL=1
|
||
fi
|
||
|
||
if curl -sf http://127.0.0.1:8081/api/health > /dev/null 2>&1; then
|
||
echo "✅ 唤醒门 正常"
|
||
else
|
||
echo "⚠️ 唤醒门 未响应"
|
||
fi
|
||
|
||
if curl -sf http://127.0.0.1:8082/health > /dev/null 2>&1; then
|
||
echo "✅ 代码同步服务 正常"
|
||
else
|
||
echo "⚠️ 代码同步服务 未响应"
|
||
fi
|
||
|
||
if curl -sf http://127.0.0.1:8083/health > /dev/null 2>&1; then
|
||
echo "✅ MCP Server 正常"
|
||
else
|
||
echo "⚠️ MCP Server 未响应"
|
||
fi
|
||
|
||
if [ $FAIL -eq 1 ]; then
|
||
echo "❌ 部署后关键服务异常"
|
||
exit 1
|
||
fi
|
||
|
||
echo "═══ 部署完成 ✅ $(date '+%Y-%m-%d %H:%M:%S') ═══"
|