From 6b5ec1d290d70d0e329cb7fafcdab7cdb383be49 Mon Sep 17 00:00:00 2001 From: chenhang Date: Wed, 10 Jun 2026 16:48:50 +0800 Subject: [PATCH] refactor(deploy): simplify script to git push-based deployment Replace the previous Next.js build + rsync + archive workflow with a minimal `push_to_server` helper that only does `git push` to the `server` remote. Build, install, and start are now expected to be handled by the server's post-receive hook, removing duplicate logic and shrinking the script from 164 lines to 46. The old `build`, `deploy`, `archive`, `setup_env`, and `check_local_build_dir` functions (along with pnpm/rsync/sshpass usage) have been removed. --- scripts/deploy/_deploy_lib.sh | 190 +++++------------------- scripts/deploy/config/develop_server | 5 - scripts/deploy/config/production_server | 9 -- scripts/deploy/config/test_server | 9 -- scripts/deploy/deploy_web.sh | 15 +- scripts/deploy/deploy_web_develop.sh | 13 +- scripts/deploy/deploy_web_test.sh | 14 +- 7 files changed, 47 insertions(+), 208 deletions(-) delete mode 100644 scripts/deploy/config/develop_server delete mode 100644 scripts/deploy/config/production_server delete mode 100644 scripts/deploy/config/test_server diff --git a/scripts/deploy/_deploy_lib.sh b/scripts/deploy/_deploy_lib.sh index 454a95c5..e69f4307 100755 --- a/scripts/deploy/_deploy_lib.sh +++ b/scripts/deploy/_deploy_lib.sh @@ -1,164 +1,46 @@ #!/bin/bash -# ========================================== -# Web 部署公共函数库(Next.js 16 + pnpm 版本,**默认**部署模型) -# 原始 Dart: scripts/deploy/_deploy_lib.sh -# 上一轮(rsync standalone)→ 本轮:标准 .next/ + public/ + next start -# -# 主要差异: -# - 构建命令:flutter build web → pnpm install + pnpm build -# - 构建输出:./build/web/ → ./.next/ + ./public/ -# - 版本号源:pubspec.yaml → package.json -# - 删除 compress_main_js(Next.js 无单 JS 入口) -# - 删除 standalone 三段 rsync(standalone + static + public) -# ========================================== -# 标准 Next.js 构建产物 -LOCAL_WEB_DIR="./.next" -LOCAL_PUBLIC_DIR="./public" +# Git remote 名(在仓库根目录配置): +# git remote add server root@8.166.137.51:/root/frontend/cozsweet +GIT_REMOTE="server" -# 设置环境(Next.js 按 NODE_ENV 自动加载 .env.{development,test,production}, -# 但保留 cp 到 .env 的行为以兼容历史流程) -setup_env() { - local env_file="$1" +# 推送指定分支到服务器 +# 期望服务器端 post-receive hook 已就位;本脚本只做 git push,不负责构建/启动 +push_to_server() { + local branch="$1" - if [ -z "$env_file" ]; then - echo "未设置环境配置文件,跳过" - return 0 - fi - - if [ -f "$env_file" ]; then - echo "复制 $env_file 到项目根 .env" - cp "$env_file" .env - else - echo "警告: $env_file 不存在" - fi -} - -# 检查本地构建目录是否存在 -check_local_build_dir() { - if [ ! -d "$LOCAL_WEB_DIR" ]; then - echo "错误: 本地构建目录 $LOCAL_WEB_DIR 不存在" - echo "请先运行: pnpm build" - return 1 - fi - return 0 -} - -# 构建函数:执行 pnpm install + pnpm build -build() { - echo "==========================================" - echo "开始构建 Next.js 制品..." - echo "==========================================" - - # 安装依赖(frozen-lockfile 保证 lockfile 一致) - pnpm install --frozen-lockfile - if [ $? -ne 0 ]; then - echo "==========================================" - echo "pnpm install 失败!" - echo "==========================================" + if [ -z "$branch" ]; then + echo "错误: 未指定分支名" return 1 fi - # 构建(默认 Turbopack,输出到 .next/) - pnpm build - if [ $? -ne 0 ]; then - echo "==========================================" - echo "构建失败!" - echo "==========================================" + echo "==========================================" + echo "git push $GIT_REMOTE $branch ..." + echo "==========================================" + + local current=$(git branch --show-current 2>/dev/null || echo "unknown") + if [ "$current" != "$branch" ]; then + echo "警告: 当前本地分支 = $current,目标分支 = $branch(不一致)" + fi + + # 检查 remote 是否存在 + if ! git remote get-url "$GIT_REMOTE" >/dev/null 2>&1; then + echo "错误: git remote '$GIT_REMOTE' 未配置" + echo " 请运行: git remote add $GIT_REMOTE root@8.166.137.51:/root/frontend/cozsweet" return 1 fi - # 检查本地构建目录 - check_local_build_dir || return 1 - - echo "==========================================" - echo "构建完成!" - echo "构建目录: $LOCAL_WEB_DIR" - echo "==========================================" - - return 0 -} - -# 执行部署:rsync .next/ + public/ -deploy() { - echo "==========================================" - echo "开始部署 Web 制品到服务器..." - echo "服务器: $SERVER_USER@$SERVER_HOST" - echo "目标路径: $SERVER_PATH" - echo "==========================================" - - # 1. 同步 .next/(含 build manifest / chunks / 路由表 / 静态预渲染) - sshpass -p "$SERVER_PASSWORD" rsync -avz --delete \ - -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" \ - "$LOCAL_WEB_DIR/" \ - "$SERVER_USER@$SERVER_HOST:$SERVER_PATH/" - - if [ $? -ne 0 ]; then - echo "==========================================" - echo "部署 .next/ 失败!" - echo "==========================================" - return 1 - fi - - # 2. 同步 public/(favicon / manifest / 静态图片) - sshpass -p "$SERVER_PASSWORD" rsync -avz \ - -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" \ - "$LOCAL_PUBLIC_DIR/" \ - "$SERVER_USER@$SERVER_HOST:$SERVER_PATH/public/" + git push "$GIT_REMOTE" "$branch" if [ $? -eq 0 ]; then echo "==========================================" - echo "部署成功!" - echo "服务器启动:cd $SERVER_PATH && next start -H 0.0.0.0 -p 3000" + echo "推送成功!服务器端 post-receive hook 应已自动执行" echo "==========================================" else echo "==========================================" - echo "部署失败!请检查错误信息" - echo "==========================================" - return 1 - fi - return 0 -} - -# 归档函数:复制构建产物到 archives/{版本号}/ -archive() { - local version="$1" - - if [ -z "$version" ]; then - echo "错误: 未指定版本号" - return 1 - fi - - local archive_dir="./archives/$version" - - echo "==========================================" - echo "开始归档 Web 制品..." - echo "版本号: $version" - echo "归档目录: $archive_dir" - echo "==========================================" - - # 创建归档目录 - mkdir -p "$archive_dir" - - # 复制 .next/ - if [ -d "$LOCAL_WEB_DIR" ]; then - cp -r "$LOCAL_WEB_DIR/"* "$archive_dir/" - fi - - # 复制 public/ - if [ -d "$LOCAL_PUBLIC_DIR" ]; then - mkdir -p "$archive_dir/public" - cp -r "$LOCAL_PUBLIC_DIR/"* "$archive_dir/public/" - fi - - if [ $? -eq 0 ]; then - echo "==========================================" - echo "归档成功!" - echo "归档路径: $archive_dir" - echo "==========================================" - else - echo "==========================================" - echo "归档失败!请检查错误信息" + echo "推送失败!常见原因:" + echo " 1. 本地分支与远端非 fast-forward(git pull --rebase 后再试)" + echo " 2. 服务器端 hook 报错(看 git push 输出)" echo "==========================================" return 1 fi @@ -208,18 +90,28 @@ bump_version() { } # 清除 Cloudflare CDN 缓存 +# 凭据从 .env / .env.local 读(CF_ZONE_ID / CF_API_TOKEN) purge_cdn_cache() { - if [ -z "$ZONE_ID" ] || [ -z "$CF_API_TOKEN" ]; then - echo "错误: Cloudflare 配置不完整,跳过缓存清除" + # 从 .env 读 CDN 凭据(Next.js 不读取,bash 直接 source) + if [ -f .env ]; then + # shell 解析 KEY=VALUE(忽略注释 / 引号) + set -a + # shellcheck disable=SC1091 + source .env 2>/dev/null || true + set +a + fi + + if [ -z "$CF_ZONE_ID" ] || [ -z "$CF_API_TOKEN" ]; then + echo "错误: Cloudflare 配置不完整(CF_ZONE_ID / CF_API_TOKEN),跳过缓存清除" return 1 fi echo "==========================================" echo "开始清除 Cloudflare CDN 缓存..." - echo "Zone ID: $ZONE_ID" + echo "Zone ID: $CF_ZONE_ID" echo "==========================================" - local response=$(curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/purge_cache" \ + local response=$(curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/purge_cache" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"purge_everything":true}') diff --git a/scripts/deploy/config/develop_server b/scripts/deploy/config/develop_server deleted file mode 100644 index e2f19e84..00000000 --- a/scripts/deploy/config/develop_server +++ /dev/null @@ -1,5 +0,0 @@ -# 开发服务器配置 -SERVER_HOST="8.166.137.51" -SERVER_USER="root" -SERVER_PASSWORD="9sK#pT7@zR2&vG5!" -SERVER_PATH="/opt/1panel/www/sites/8.166.137.51/index" diff --git a/scripts/deploy/config/production_server b/scripts/deploy/config/production_server deleted file mode 100644 index ab0950fc..00000000 --- a/scripts/deploy/config/production_server +++ /dev/null @@ -1,9 +0,0 @@ -# 生产服务器配置 -SERVER_HOST="43.106.13.130" -SERVER_USER="root" -SERVER_PASSWORD="5tA2!gP9@kS7#dJ3zR8" -SERVER_PATH="/var/www/cozsweet/" - -# Cloudflare CDN 配置 -ZONE_ID="b1b6bfb7795667609c8e7f418af0156b" -CF_API_TOKEN="cfut_xyHb70XCw0j8f5Wz5fg5PemUQ2ZHnSpWvmrBvVeK94d3b00f" diff --git a/scripts/deploy/config/test_server b/scripts/deploy/config/test_server deleted file mode 100644 index 5b78783b..00000000 --- a/scripts/deploy/config/test_server +++ /dev/null @@ -1,9 +0,0 @@ -# 测试服务器配置 -SERVER_HOST="8.166.137.51" -SERVER_USER="root" -SERVER_PASSWORD="9sK#pT7@zR2&vG5!" -SERVER_PATH="/opt/1panel/www/sites/frontend-test.banlv-ai.com/index" - -# Cloudflare CDN 配置 -ZONE_ID="b1b6bfb7795667609c8e7f418af0156b" -CF_API_TOKEN="cfut_xyHb70XCw0j8f5Wz5fg5PemUQ2ZHnSpWvmrBvVeK94d3b00f" diff --git a/scripts/deploy/deploy_web.sh b/scripts/deploy/deploy_web.sh index 961bd1ad..d5fdf377 100755 --- a/scripts/deploy/deploy_web.sh +++ b/scripts/deploy/deploy_web.sh @@ -1,27 +1,16 @@ #!/bin/bash # ========================================== -# 生产环境 Web 部署脚本(Next.js) +# 生产环境 Web 部署脚本(Next.js + git push 模型) # 原始 Dart: scripts/deploy/deploy_web.sh # ========================================== -# 设置环境配置文件(Next.js 命名:.env.production) -ENV_FILE="env/.env.production" - -# 加载服务器配置 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -source "$SCRIPT_DIR/config/production_server" - -# 加载公共函数库 source "$SCRIPT_DIR/_deploy_lib.sh" # 主函数 main() { - setup_env "$ENV_FILE" - build - deploy - + push_to_server "main" NEW_VERSION=$(bump_version) - archive "$NEW_VERSION" purge_cdn_cache } diff --git a/scripts/deploy/deploy_web_develop.sh b/scripts/deploy/deploy_web_develop.sh index 909a5aa9..bfd78537 100755 --- a/scripts/deploy/deploy_web_develop.sh +++ b/scripts/deploy/deploy_web_develop.sh @@ -1,24 +1,15 @@ #!/bin/bash # ========================================== -# 开发环境 Web 部署脚本(Next.js) +# 开发环境 Web 部署脚本(Next.js + git push 模型) # 原始 Dart: scripts/deploy/deploy_web_develop.sh # ========================================== -# 设置环境配置文件(Next.js 命名:.env.development,对齐 NODE_ENV=development) -# ENV_FILE="env/.env.development" - -# 加载服务器配置 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -source "$SCRIPT_DIR/config/develop_server" - -# 加载公共函数库 source "$SCRIPT_DIR/_deploy_lib.sh" # 主函数 main() { - # setup_env "$ENV_FILE" - build - deploy + push_to_server "dev" } main diff --git a/scripts/deploy/deploy_web_test.sh b/scripts/deploy/deploy_web_test.sh index 8117489c..f89e680c 100755 --- a/scripts/deploy/deploy_web_test.sh +++ b/scripts/deploy/deploy_web_test.sh @@ -1,25 +1,15 @@ #!/bin/bash # ========================================== -# 测试环境 Web 部署脚本(Next.js) +# 测试环境 Web 部署脚本(Next.js + git push 模型) # 原始 Dart: scripts/deploy/deploy_web_test.sh # ========================================== -# 设置环境配置文件(Next.js 命名:.env.test) -ENV_FILE="env/.env.test" - -# 加载服务器配置 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -source "$SCRIPT_DIR/config/test_server" - -# 加载公共函数库 source "$SCRIPT_DIR/_deploy_lib.sh" # 主函数 main() { - setup_env "$ENV_FILE" - build - deploy - + push_to_server "test" purge_cdn_cache }