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.
This commit is contained in:
+41
-149
@@ -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}')
|
||||
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user