def6ee2363
CI/CD Pipeline / Validate Code Quality And Tests (push) Successful in 46s
CI/CD Pipeline / Unit Tests (push) Successful in 1m40s
CI/CD Pipeline / Frontend Lint (push) Successful in 2m52s
CI/CD Pipeline / Build Production Runtime Images (push) Has been skipped
CI/CD Pipeline / Deploy Production (push) Has been skipped
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Integration Tests (push) Successful in 1m42s
CI/CD Pipeline / Build & Push Staging (Watchtower auto-deploy) (push) Successful in 16m34s
CI/CD Pipeline / Staging E2E Tests (push) Successful in 2m52s
CI/CD Pipeline / Staging API Integration Tests (push) Successful in 3m55s
合并PR #316:新增release.sh / gray_deploy.sh / rollback_gray.sh三个脚本,适配生产环境架构(nginx upstream权重 + canary容器)
114 lines
3.0 KiB
Bash
Executable File
114 lines
3.0 KiB
Bash
Executable File
#!/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 "============================================"
|