#!/bin/bash # 一键发布脚本:打 tag → 触发 CI 构建 → 可选灰度发布 # 用法: ./scripts/release.sh v0.1.130 [--gray 5] # # 说明: # - 打 tag 后 CI 会自动构建镜像并全量部署到生产 # - 加 --gray 参数则在构建完成后执行灰度切流(需 SSH 到生产服务器执行) # - 加 --no-deploy 只打 tag 不触发自动部署 set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" usage() { echo "用法: $0 <版本号> [--gray 百分比] [--no-deploy]" echo "" echo "示例:" echo " $0 v0.1.130 # 打tag + 全量发布(CI自动部署)" echo " $0 v0.1.130 --gray 5 # 打tag + 5%灰度发布" echo " $0 v0.1.130 --no-deploy # 只打tag,不部署" exit 1 } VERSION="" GRAY_PCT=0 DEPLOY=true while [[ $# -gt 0 ]]; do case "$1" in --gray) GRAY_PCT="$2" shift 2 ;; --no-deploy) DEPLOY=false shift ;; -h|--help) usage ;; v*) VERSION="$1" shift ;; *) echo "未知参数: $1" usage ;; esac done if [[ -z "$VERSION" ]]; then echo "错误: 请指定版本号(如 v0.1.130)" usage fi echo "============================================" echo " 发布版本: $VERSION" echo " 灰度比例: ${GRAY_PCT}%" echo " 自动部署: $DEPLOY" echo "============================================" cd "$REPO_ROOT" # 1. 确认分支 CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) if [[ "$CURRENT_BRANCH" != "develop" ]]; then echo "错误: 请在 develop 分支上打 tag" exit 1 fi # 2. 拉取最新 echo "" echo ">>> 拉取最新代码..." git pull origin develop # 3. 检查 tag 是否已存在 if git rev-parse "$VERSION" >/dev/null 2>&1; then echo "警告: tag $VERSION 已存在,跳过打 tag" else echo "" echo ">>> 打 tag $VERSION ..." git tag -a "$VERSION" -m "Release $VERSION" git push origin "$VERSION" echo " ✅ Tag 已推送,CI 将自动构建生产镜像" fi # 4. 部署提示 if [[ "$DEPLOY" == "true" ]]; then echo "" echo ">>> 构建 & 部署" echo " CI 会自动执行:" echo " 1. Build Production Runtime Images(约10-15分钟)" echo " 2. Deploy Production(SSH 到生产服务器部署)" echo "" echo " 查看进度: Gitea Actions → 对应 tag 的 run" if [[ "$GRAY_PCT" -gt 0 ]]; then echo "" echo ">>> 灰度发布" echo " 构建部署完成后,在生产服务器上执行:" echo " cd /var/lib/xiaoxia-saas-production" echo " ./gray_deploy.sh $VERSION $GRAY_PCT" fi fi echo "" echo "============================================" echo " ✅ 发布流程触发完成" echo " 版本: $VERSION" echo " 灰度: ${GRAY_PCT}%" echo "============================================"