v10
PR合并自动部署 / deploy (pull_request) Successful in 2s

This commit is contained in:
2026-08-08 17:36:26 +08:00
parent 3da54a1827
commit 10390fee42
+156 -27
View File
@@ -1,13 +1,17 @@
name: PR合并自动部署 name: PR合并自动部署
on: on:
pull_request: pull_request:
branches: [main] branches:
types: [closed] - main
types:
- closed
jobs: jobs:
deploy: deploy:
if: github.event.pull_request.merged == true if: github.event.pull_request.merged == true
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: 配置SSH环境 - name: 配置SSH环境
run: | run: |
@@ -18,36 +22,161 @@ jobs:
- name: 远程执行部署 - name: 远程执行部署
run: | run: |
ssh -i ~/.ssh/deploy_key ${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }} <<EOF ssh -T -i ~/.ssh/deploy_key \
set -e ${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }} <<'EOF'
cd ${{ env.DEPLOY_PATH }}
git fetch origin main
# 备份运行时db set -e
if [ -f data/miniapp_v3.db ]; then
cp data/miniapp_v3.db data/miniapp_v3.db.tmp # ==============================
# 项目目录
# ==============================
PROJECT="/www/wwwroot/Hulumath-Web-Demo"
echo "========================================"
echo "🚀 开始部署"
echo "项目目录: $PROJECT"
echo "========================================"
cd "$PROJECT"
echo "当前目录:"
pwd
# 防止 Git 因目录所有者不同而报 dubious ownership
git config --global --add safe.directory "$PROJECT" || true
# ==============================
# 检查 Git 仓库
# ==============================
if [ ! -d ".git" ]; then
echo "❌ 当前目录不是 Git 仓库"
exit 1
fi
echo "✅ Git 仓库检查通过"
# ==============================
# 拉取远程 main
# ==============================
echo "📥 获取远程 main 分支..."
git fetch origin main
# ==============================
# 判断本次提交是否修改数据库
# ==============================
DB_CHANGED=0
if git diff --name-only HEAD origin/main | grep -qx "data/miniapp_v3.db"; then
DB_CHANGED=1
echo "⚠️ 本次代码提交包含数据库变更"
else
echo "✅ 本次代码提交未修改数据库"
fi
# ==============================
# 备份当前运行时数据库
# ==============================
DB_BACKUP="/tmp/miniapp_v3.db.deploy_backup"
rm -f "$DB_BACKUP"
if [ -f "data/miniapp_v3.db" ]; then
cp "data/miniapp_v3.db" "$DB_BACKUP"
echo "✅ 已备份当前运行时数据库"
else
echo "️ 当前不存在运行时数据库"
fi
# ==============================
# 更新代码
# ==============================
echo "🔄 更新代码到 origin/main..."
git reset --hard origin/main
echo "✅ 代码更新完成"
# ==============================
# 恢复运行时数据库
#
# 如果本次 PR 没修改数据库:
# 保留服务器当前运行时数据库
#
# 如果本次 PR 修改了数据库:
# 使用仓库中新版本数据库
# ==============================
if [ "$DB_CHANGED" -eq 0 ]; then
if [ -f "$DB_BACKUP" ]; then
cp "$DB_BACKUP" "data/miniapp_v3.db"
echo "✅ 已恢复运行时数据库"
fi fi
else
echo "ℹ️ 仓库包含数据库更新,不恢复旧数据库"
fi
git checkout origin/main -- . rm -f "$DB_BACKUP"
CHANGED=\$(git diff --name-only HEAD FETCH_HEAD | grep "data/miniapp_v3.db" || true) # ==============================
if [ -z "\$CHANGED" ]; then # 安装 Python 依赖
if [ -f data/miniapp_v3.db.tmp ]; then # ==============================
cp data/miniapp_v3.db.tmp data/miniapp_v3.db echo "📦 安装 Python 依赖..."
fi
fi
rm -f data/miniapp_v3.db.tmp
/www/server/pyporject_evn/versions/3.12.13/bin/pip install -r requirements.txt /www/server/pyporject_evn/versions/3.12.13/bin/pip \
chown -R www:www . install -r requirements.txt
echo "✅ Python 依赖安装完成"
# ==============================
# 修正权限
# ==============================
chown -R www:www "$PROJECT"
# ==============================
# Gunicorn 优雅重载
# ==============================
echo "🔄 准备重载 Gunicorn..."
if [ -f "$PROJECT/gunicorn.pid" ]; then
MASTER_PID=$(cat "$PROJECT/gunicorn.pid")
echo "Gunicorn PID 文件中的进程: $MASTER_PID"
if kill -0 "$MASTER_PID" 2>/dev/null; then
kill -HUP "$MASTER_PID"
echo "✅ Gunicorn 已发送 HUP,优雅重载完成"
# 获取gunicorn master进程,发送HUP优雅重载
MASTER_PID=\$(pgrep -f "gunicorn_conf.py" -P 1)
echo "Detected gunicorn master PID: \$MASTER_PID"
if [ -n "\$MASTER_PID" ]; then
kill -HUP "\$MASTER_PID"
echo "✅ Graceful reload signal sent"
else else
echo "⚠️ Gunicorn master not found, skip reload"
echo "⚠️ gunicorn.pid 中的进程不存在"
fi fi
EOF
else
# PID 文件不存在时备用查找
MASTER_PID=$(pgrep -f "gunicorn.*gunicorn_conf.py" | head -n 1 || true)
if [ -n "$MASTER_PID" ]; then
echo "检测到 Gunicorn PID: $MASTER_PID"
kill -HUP "$MASTER_PID"
echo "✅ Gunicorn 已发送 HUP,优雅重载完成"
else
echo "⚠️ 未找到 Gunicorn 进程,跳过重载"
fi
fi
echo "========================================"
echo "✅ 部署完成"
echo "========================================"
EOF