Files
controller-v2/scripts/deploy.sh
T
fucheng 650e8ef017
Deploy B9 / deploy (push) Successful in 3m2s
ci: add B9 branch deployment to S3 and CloudFront
2026-11-02 11:17:14 +08:00

166 lines
4.3 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# ============================================================
# 部署脚本 - 支持 test/prod 环境与 images 目录排除
# ============================================================
set -e
# 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
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 "部署完成!"