#!/bin/bash # ============================================================ # 部署脚本 - 支持 test/prod 环境与 images 目录排除 # ============================================================ set -e # AWS CLI v2 默认把命令输出送入分页器(less),create-invalidation 结束后会停在 # (END) 提示符等待按键,导致脚本无法返回 shell。禁用分页器直接打印输出。 export AWS_PAGER="" show_help() { cat </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 "部署完成!"