From 8f2f4854021021c5fdabcca542142edd17d77690 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Mon, 21 Sep 2026 09:26:50 +0800 Subject: [PATCH] drain old web slot before blue-green shutdown --- deploy/scripts/deploy-blue-green-service.sh | 7 ++++++- scripts/blue-green-deployment-contract.test.mjs | 3 +++ scripts/blue-green-deployment-runtime.test.mjs | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/deploy/scripts/deploy-blue-green-service.sh b/deploy/scripts/deploy-blue-green-service.sh index 24c60f2a3..ff2fb20ee 100644 --- a/deploy/scripts/deploy-blue-green-service.sh +++ b/deploy/scripts/deploy-blue-green-service.sh @@ -64,10 +64,11 @@ ROUTING_NETWORK="${BLUE_GREEN_ROUTING_NETWORK:-firstleg-${DEPLOY_ENV}-routing}" HEALTH_TIMEOUT="${DEPLOY_HEALTH_TIMEOUT_SECONDS:-240}" HEALTH_POLL="${DEPLOY_HEALTH_POLL_SECONDS:-5}" STABILIZATION_SECONDS="${BLUE_GREEN_STABILIZATION_SECONDS:-10}" +DRAIN_SECONDS="${BLUE_GREEN_DRAIN_SECONDS:-30}" STOP_TIMEOUT="${BLUE_GREEN_STOP_TIMEOUT_SECONDS:-45}" IMAGE="$IMAGE_REPOSITORY/$SERVICE:$IMAGE_TAG" -for value in "$HEALTH_TIMEOUT" "$HEALTH_POLL" "$STABILIZATION_SECONDS" "$STOP_TIMEOUT"; do +for value in "$HEALTH_TIMEOUT" "$HEALTH_POLL" "$STABILIZATION_SECONDS" "$DRAIN_SECONDS" "$STOP_TIMEOUT"; do case "$value" in ''|*[!0-9]*) echo "蓝绿时间参数必须为非负整数: $value" >&2; exit 2 ;; esac done @@ -365,6 +366,10 @@ fi old_container_stopped=false if [ -n "$active_container" ] && docker inspect "$active_container" >/dev/null 2>&1; then + if [ "$DRAIN_SECONDS" -gt 0 ]; then + echo "蓝绿切换后连接排空 ${DRAIN_SECONDS}s,旧 Web 实例保持运行: $active_container" + sleep "$DRAIN_SECONDS" + fi echo "优雅停止旧 Web 实例: $active_container" docker stop --time "$STOP_TIMEOUT" "$active_container" >/dev/null old_container_stopped=true diff --git a/scripts/blue-green-deployment-contract.test.mjs b/scripts/blue-green-deployment-contract.test.mjs index 4b23368d2..6abd984a6 100644 --- a/scripts/blue-green-deployment-contract.test.mjs +++ b/scripts/blue-green-deployment-contract.test.mjs @@ -26,6 +26,9 @@ test('all backend business services have blue-green runtime contracts', async () assert.match(script, /connect_routing_aliases "\$candidate" "\$ROUTING_ALIAS" "\$NACOS_SERVICE"/) assert.match(script, /file,file-service:file/) assert.match(script, /docker stop --time "\$STOP_TIMEOUT" "\$active_container"/) + assert.match(script, /DRAIN_SECONDS="\$\{BLUE_GREEN_DRAIN_SECONDS:-30\}"/) + assert.match(script, /蓝绿切换后连接排空/) + assert.match(script, /sleep "\$DRAIN_SECONDS"/) assert.match(script, /mv -f "\$STATE_FILE\.tmp" "\$STATE_FILE"/) }) diff --git a/scripts/blue-green-deployment-runtime.test.mjs b/scripts/blue-green-deployment-runtime.test.mjs index 2fa8c975e..6e4a7026a 100644 --- a/scripts/blue-green-deployment-runtime.test.mjs +++ b/scripts/blue-green-deployment-runtime.test.mjs @@ -114,6 +114,7 @@ async function runBlueGreen(health) { PATH: `${bin}${delimiter}${process.env.PATH ?? ''}`, BLUE_GREEN_STATE_ROOT: stateRoot, BLUE_GREEN_STABILIZATION_SECONDS: '0', + BLUE_GREEN_DRAIN_SECONDS: '0', DEPLOY_HEALTH_TIMEOUT_SECONDS: '2', DEPLOY_HEALTH_POLL_SECONDS: '1', MOCK_LOG: log,