Archived
@@ -1,13 +1,17 @@
|
||||
name: PR合并自动部署
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [main]
|
||||
types: [closed]
|
||||
branches:
|
||||
- main
|
||||
types:
|
||||
- closed
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
if: github.event.pull_request.merged == true
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: 配置SSH环境
|
||||
run: |
|
||||
@@ -18,36 +22,161 @@ jobs:
|
||||
|
||||
- name: 远程执行部署
|
||||
run: |
|
||||
ssh -i ~/.ssh/deploy_key ${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }} <<EOF
|
||||
ssh -T -i ~/.ssh/deploy_key \
|
||||
${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }} <<'EOF'
|
||||
|
||||
set -e
|
||||
cd ${{ env.DEPLOY_PATH }}
|
||||
|
||||
# ==============================
|
||||
# 项目目录
|
||||
# ==============================
|
||||
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
|
||||
if [ -f data/miniapp_v3.db ]; then
|
||||
cp data/miniapp_v3.db data/miniapp_v3.db.tmp
|
||||
fi
|
||||
# ==============================
|
||||
# 判断本次提交是否修改数据库
|
||||
# ==============================
|
||||
DB_CHANGED=0
|
||||
|
||||
git checkout origin/main -- .
|
||||
|
||||
CHANGED=\$(git diff --name-only HEAD FETCH_HEAD | grep "data/miniapp_v3.db" || true)
|
||||
if [ -z "\$CHANGED" ]; then
|
||||
if [ -f data/miniapp_v3.db.tmp ]; then
|
||||
cp data/miniapp_v3.db.tmp data/miniapp_v3.db
|
||||
fi
|
||||
fi
|
||||
rm -f data/miniapp_v3.db.tmp
|
||||
|
||||
/www/server/pyporject_evn/versions/3.12.13/bin/pip install -r requirements.txt
|
||||
chown -R www:www .
|
||||
|
||||
# 获取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"
|
||||
if git diff --name-only HEAD origin/main | grep -qx "data/miniapp_v3.db"; then
|
||||
DB_CHANGED=1
|
||||
echo "⚠️ 本次代码提交包含数据库变更"
|
||||
else
|
||||
echo "⚠️ Gunicorn master not found, skip reload"
|
||||
echo "✅ 本次代码提交未修改数据库"
|
||||
fi
|
||||
EOF
|
||||
|
||||
# ==============================
|
||||
# 备份当前运行时数据库
|
||||
# ==============================
|
||||
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
|
||||
else
|
||||
echo "ℹ️ 仓库包含数据库更新,不恢复旧数据库"
|
||||
fi
|
||||
|
||||
rm -f "$DB_BACKUP"
|
||||
|
||||
# ==============================
|
||||
# 安装 Python 依赖
|
||||
# ==============================
|
||||
echo "📦 安装 Python 依赖..."
|
||||
|
||||
/www/server/pyporject_evn/versions/3.12.13/bin/pip \
|
||||
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,优雅重载完成"
|
||||
|
||||
else
|
||||
|
||||
echo "⚠️ gunicorn.pid 中的进程不存在"
|
||||
|
||||
fi
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user