2026-06-18 16:12:51 +08:00
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
|
|
|
|
# ============================================================
|
2026-06-30 15:28:53 +08:00
|
|
|
|
# 部署脚本 - 支持 test/prod 环境与 images 目录排除
|
2026-06-18 16:12:51 +08:00
|
|
|
|
# ============================================================
|
|
|
|
|
|
|
|
|
|
|
|
set -e
|
|
|
|
|
|
|
2026-06-30 15:28:53 +08:00
|
|
|
|
show_help() {
|
|
|
|
|
|
cat <<EOF
|
|
|
|
|
|
用法: ./scripts/deploy.sh [环境] [选项]
|
|
|
|
|
|
|
|
|
|
|
|
环境(可选,默认 prod):
|
|
|
|
|
|
prod 上传至正式环境 (s3://.../v2/)
|
|
|
|
|
|
test 上传至测试环境 (s3://.../test/)
|
|
|
|
|
|
|
|
|
|
|
|
选项(可合并,如 -ir):
|
|
|
|
|
|
-i 排除 images 目录 (*images/*)
|
|
|
|
|
|
-r 上传完成后刷新 CloudFront 缓存
|
|
|
|
|
|
-h 显示此帮助
|
|
|
|
|
|
|
|
|
|
|
|
示例:
|
|
|
|
|
|
./scripts/deploy.sh # prod,不排除 images,不刷新
|
|
|
|
|
|
./scripts/deploy.sh test # test 环境
|
|
|
|
|
|
./scripts/deploy.sh test -ir # test,排除 images,并刷新缓存
|
|
|
|
|
|
./scripts/deploy.sh prod -i # prod,排除 images
|
|
|
|
|
|
./scripts/deploy.sh -r # prod,刷新缓存
|
|
|
|
|
|
EOF
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-18 16:12:51 +08:00
|
|
|
|
# 自动识别项目名称 (x8 / x9),依据脚本所在的项目根目录名
|
|
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
|
|
PROJECT_ROOT="$(basename "$(dirname "$SCRIPT_DIR")")"
|
|
|
|
|
|
PROJECT_NAME="$(echo "$PROJECT_ROOT" | grep -oE '^(x8|x9)')"
|
|
|
|
|
|
|
|
|
|
|
|
if [ -z "$PROJECT_NAME" ]; then
|
|
|
|
|
|
echo "错误: 无法从路径 '$PROJECT_ROOT' 识别项目名称 (x8/x9)"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 解析参数
|
2026-06-30 15:28:53 +08:00
|
|
|
|
TARGET_ENV="prod"
|
|
|
|
|
|
EXCLUDE_IMAGES=false
|
|
|
|
|
|
RELOAD=false
|
2026-06-18 16:12:51 +08:00
|
|
|
|
|
|
|
|
|
|
for arg in "$@"; do
|
|
|
|
|
|
case "$arg" in
|
2026-06-30 15:28:53 +08:00
|
|
|
|
-h|--help)
|
|
|
|
|
|
show_help
|
|
|
|
|
|
exit 0
|
2026-06-18 16:12:51 +08:00
|
|
|
|
;;
|
2026-06-30 15:28:53 +08:00
|
|
|
|
test|prod)
|
|
|
|
|
|
TARGET_ENV="$arg"
|
2026-06-18 16:12:51 +08:00
|
|
|
|
;;
|
2026-06-30 15:28:53 +08:00
|
|
|
|
-*)
|
|
|
|
|
|
flags="${arg#-}"
|
|
|
|
|
|
if [ -z "$flags" ]; then
|
|
|
|
|
|
echo "未知参数: $arg"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
show_help
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
for ((i = 0; i < ${#flags}; i++)); do
|
|
|
|
|
|
c="${flags:i:1}"
|
|
|
|
|
|
case "$c" in
|
|
|
|
|
|
i)
|
|
|
|
|
|
EXCLUDE_IMAGES=true
|
|
|
|
|
|
;;
|
|
|
|
|
|
r)
|
|
|
|
|
|
RELOAD=true
|
|
|
|
|
|
;;
|
|
|
|
|
|
*)
|
|
|
|
|
|
echo "未知选项: -$c"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
show_help
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
;;
|
|
|
|
|
|
esac
|
|
|
|
|
|
done
|
2026-06-18 16:12:51 +08:00
|
|
|
|
;;
|
|
|
|
|
|
*)
|
|
|
|
|
|
echo "未知参数: $arg"
|
2026-06-30 15:28:53 +08:00
|
|
|
|
echo ""
|
|
|
|
|
|
show_help
|
2026-06-18 16:12:51 +08:00
|
|
|
|
exit 1
|
|
|
|
|
|
;;
|
|
|
|
|
|
esac
|
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
|
|
# 确定 S3 目标路径与 CloudFront 刷新路径
|
|
|
|
|
|
if [ "$TARGET_ENV" = "test" ]; then
|
|
|
|
|
|
S3_PATH="s3://luxsin-app-bucket/${PROJECT_NAME}/test/"
|
|
|
|
|
|
CF_PATH="/${PROJECT_NAME}/test/*"
|
|
|
|
|
|
else
|
|
|
|
|
|
S3_PATH="s3://luxsin-app-bucket/${PROJECT_NAME}/v2/"
|
|
|
|
|
|
CF_PATH="/${PROJECT_NAME}/v2/*"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# CloudFront 分配 ID
|
|
|
|
|
|
DISTRIBUTION_ID="EUS4XQ8Y0W2ZV"
|
|
|
|
|
|
|
|
|
|
|
|
# 构建 aws s3 sync 命令参数(使用数组,避免引号转义问题)
|
|
|
|
|
|
CMD_ARGS=("aws" "s3" "sync" "./dist" "$S3_PATH" "--delete")
|
|
|
|
|
|
|
|
|
|
|
|
if [ "$EXCLUDE_IMAGES" = true ]; then
|
|
|
|
|
|
CMD_ARGS+=("--exclude" "*images/*")
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 输出部署信息
|
|
|
|
|
|
echo "=========================================="
|
|
|
|
|
|
echo "项目: ${PROJECT_NAME}"
|
|
|
|
|
|
echo "环境: ${TARGET_ENV}"
|
|
|
|
|
|
echo "目标: ${S3_PATH}"
|
|
|
|
|
|
[ "$EXCLUDE_IMAGES" = true ] && echo "排除: *images/*"
|
|
|
|
|
|
echo "刷新: ${RELOAD}"
|
|
|
|
|
|
echo "命令: ${CMD_ARGS[*]}"
|
|
|
|
|
|
echo "=========================================="
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
2026-06-30 15:28:53 +08:00
|
|
|
|
read -r -p "确认执行部署? 输入 y 继续: " confirm
|
|
|
|
|
|
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
|
|
|
|
|
|
echo "已取消部署。"
|
|
|
|
|
|
exit 0
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
2026-06-18 16:12:51 +08:00
|
|
|
|
# 执行同步
|
|
|
|
|
|
"${CMD_ARGS[@]}"
|
|
|
|
|
|
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
# 刷新 CloudFront 缓存
|
|
|
|
|
|
if [ "$RELOAD" = true ]; then
|
|
|
|
|
|
echo "刷新 CloudFront 缓存..."
|
|
|
|
|
|
echo "路径: ${CF_PATH}"
|
|
|
|
|
|
aws cloudfront create-invalidation \
|
|
|
|
|
|
--distribution-id "$DISTRIBUTION_ID" \
|
|
|
|
|
|
--paths "$CF_PATH"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "CloudFront 缓存刷新完成!"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
echo "部署完成!"
|