Files
controller-v2/scripts/deploy.sh
T

166 lines
4.3 KiB
Bash
Raw Normal View History

#!/bin/bash
# ============================================================
# 部署脚本 - 支持 test/prod 环境与 images 目录排除
# ============================================================
set -e
2026-09-09 18:26:26 +08:00
# AWS CLI v2 默认把命令输出送入分页器(less),create-invalidation 结束后会停在
# (END) 提示符等待按键,导致脚本无法返回 shell。禁用分页器直接打印输出。
export AWS_PAGER=""
show_help() {
cat <<EOF
用法: ./scripts/deploy.sh [环境] [选项]
环境(可选,默认 prod):
prod 上传至正式环境 (s3://.../v2/)
test 上传至测试环境 (s3://.../test/)
选项(可合并,如 -ir):
-i 排除 images 目录 (*images/*)
-r 上传完成后刷新 CloudFront 缓存
-y 跳过确认(用于 CI)
-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
}
# CI 显式传入型号;本地按 Git 分支识别,非 Git 目录则回退到目录名。
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(basename "$(dirname "$SCRIPT_DIR")")"
PROJECT_BRANCH="$(git -C "$SCRIPT_DIR" symbolic-ref --quiet --short HEAD 2>/dev/null || true)"
PROJECT_NAME="${DEPLOY_PROJECT_NAME:-${PROJECT_BRANCH:-${PROJECT_ROOT%-controller}}}"
case "$PROJECT_NAME" in
main) PROJECT_NAME="x8" ;;
x8|x9|b9|bd9|bh9) ;;
*) echo "错误: 不支持的型号分支 '$PROJECT_NAME'"; exit 1 ;;
esac
# 解析参数
TARGET_ENV="prod"
EXCLUDE_IMAGES=false
RELOAD=false
ASSUME_YES=false
for arg in "$@"; do
case "$arg" in
-h|--help)
show_help
exit 0
;;
test|prod)
TARGET_ENV="$arg"
;;
-*)
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
;;
y)
ASSUME_YES=true
;;
r)
RELOAD=true
;;
*)
echo "未知选项: -$c"
echo ""
show_help
exit 1
;;
esac
done
;;
*)
echo "未知参数: $arg"
echo ""
show_help
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 ""
# 在项目根目录执行,避免 CI 的当前目录影响同步源。
cd "$SCRIPT_DIR/.."
for entry in i.html legacy/i.legacy.html modern/i.modern.html; do
if [ ! -s "dist/$entry" ]; then
echo "错误: 缺少构建产物 dist/$entry,请先完成构建。"
exit 1
fi
done
if [ "$ASSUME_YES" != true ]; then
read -r -p "确认执行部署? 输入 y 继续: " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "已取消部署。"
exit 0
fi
2026-06-26 12:03:31 +08:00
fi
echo ""
# 执行同步
"${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 "部署完成!"