92a7915de0
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 30s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m6s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m11s
CI/CD Pipeline / Build & Push Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Build Production Runtime Images (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m22s
- release.sh: 一键发布脚本(打tag + 生成changelog + 灰度部署) - gray_deploy.sh: 灰度发布脚本(Nginx权重调整 + canary容器) - rollback.sh: 灰度回滚脚本(切回稳定版本流量)
118 lines
3.5 KiB
Bash
Executable File
118 lines
3.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# 灰度发布脚本:通过Nginx权重调整流量比例
|
|
# 用法: ./scripts/gray_deploy.sh <版本号> <灰度百分比>
|
|
#
|
|
# 需要在目标服务器上执行,或通过SSH执行
|
|
# 前提:服务器上运行两个版本的容器(stable + canary),Nginx做加权轮询
|
|
|
|
set -euo pipefail
|
|
|
|
VERSION="${1:-}"
|
|
GRAY_PCT="${2:-10}"
|
|
|
|
if [[ -z "$VERSION" ]]; then
|
|
echo "用法: $0 <版本号> [灰度百分比]"
|
|
echo "示例: $0 v0.1.129 5"
|
|
exit 1
|
|
fi
|
|
|
|
STABLE_VERSION="${STABLE_VERSION:-current}"
|
|
REGISTRY="${REGISTRY:-git.xiaoxiajianji.com/xiaoxia/xiaoxia-saas}"
|
|
|
|
echo "=========================================="
|
|
echo " 灰度发布"
|
|
echo " 新版本: $VERSION"
|
|
echo " 灰度比例: ${GRAY_PCT}%"
|
|
echo " 稳定版本: $STABLE_VERSION"
|
|
echo "=========================================="
|
|
|
|
# 1. 拉取新版本镜像
|
|
echo ""
|
|
echo ">>> 拉取新版本镜像..."
|
|
for component in api worker web; do
|
|
echo " 拉取 $component:$VERSION ..."
|
|
docker pull "${REGISTRY}-${component}:${VERSION}" 2>&1 | tail -1
|
|
done
|
|
|
|
# 2. 启动灰度版本容器(canary)
|
|
echo ""
|
|
echo ">>> 启动灰度版本容器..."
|
|
|
|
# API canary
|
|
CANARY_API_NAME="saas-api-canary"
|
|
if docker ps -a --format '{{.Names}}' | grep -q "^${CANARY_API_NAME}$"; then
|
|
echo " 停止旧 canary 容器..."
|
|
docker stop "$CANARY_API_NAME" 2>/dev/null || true
|
|
docker rm "$CANARY_API_NAME" 2>/dev/null || true
|
|
fi
|
|
|
|
echo " 启动 api canary..."
|
|
docker run -d \
|
|
--name "$CANARY_API_NAME" \
|
|
--network saas-network \
|
|
-e DATABASE_URL="${DATABASE_URL}" \
|
|
-e REDIS_URL="${REDIS_URL}" \
|
|
-e FEATURE_FLAG_PROVIDER=redis \
|
|
--restart unless-stopped \
|
|
"${REGISTRY}-api:${VERSION}"
|
|
|
|
# Worker canary
|
|
CANARY_WORKER_NAME="saas-worker-canary"
|
|
if docker ps -a --format '{{.Names}}' | grep -q "^${CANARY_WORKER_NAME}$"; then
|
|
echo " 停止旧 worker canary..."
|
|
docker stop "$CANARY_WORKER_NAME" 2>/dev/null || true
|
|
docker rm "$CANARY_WORKER_NAME" 2>/dev/null || true
|
|
fi
|
|
|
|
echo " 启动 worker canary..."
|
|
docker run -d \
|
|
--name "$CANARY_WORKER_NAME" \
|
|
--network saas-network \
|
|
-e DATABASE_URL="${DATABASE_URL}" \
|
|
-e REDIS_URL="${REDIS_URL}" \
|
|
--restart unless-stopped \
|
|
"${REGISTRY}-worker:${VERSION}"
|
|
|
|
# 3. 等待容器健康
|
|
echo ""
|
|
echo ">>> 等待容器健康..."
|
|
sleep 10
|
|
if ! docker ps --format '{{.Names}} {{.Status}}' | grep -q "$CANARY_API_NAME"; then
|
|
echo "错误: API canary 容器未运行"
|
|
docker logs "$CANARY_API_NAME" --tail 20
|
|
exit 1
|
|
fi
|
|
echo " ✅ API canary 运行中"
|
|
|
|
# 4. 更新Nginx权重
|
|
echo ""
|
|
echo ">>> 更新Nginx权重 (稳定: $((100-GRAY_PCT))% / 灰度: ${GRAY_PCT}%)..."
|
|
|
|
NGINX_CONF="${NGINX_CONF:-/etc/nginx/conf.d/saas-api.conf}"
|
|
if [[ -f "$NGINX_CONF" ]]; then
|
|
# 备份
|
|
cp "$NGINX_CONF" "${NGINX_CONF}.bak.$(date +%Y%m%d%H%M%S)"
|
|
|
|
# 更新 upstream 权重(需要根据实际配置调整)
|
|
echo " 请手动更新 Nginx upstream 配置中的权重"
|
|
echo " 示例配置:"
|
|
cat <<EOF
|
|
upstream saas_api_backend {
|
|
server saas-api:8000 weight=$((100-GRAY_PCT));
|
|
server saas-api-canary:8000 weight=${GRAY_PCT};
|
|
}
|
|
EOF
|
|
nginx -t && nginx -s reload
|
|
echo " ✅ Nginx 已reload"
|
|
else
|
|
echo " 警告: Nginx 配置文件不存在 ($NGINX_CONF)"
|
|
echo " 请手动配置灰度流量权重"
|
|
fi
|
|
|
|
echo ""
|
|
echo "=========================================="
|
|
echo " ✅ 灰度发布完成"
|
|
echo " 新版本: $VERSION (${GRAY_PCT}%流量)"
|
|
echo " 监控: Grafana / 日志"
|
|
echo "=========================================="
|