drain old web slot before blue-green shutdown
This commit is contained in:
@@ -64,10 +64,11 @@ ROUTING_NETWORK="${BLUE_GREEN_ROUTING_NETWORK:-firstleg-${DEPLOY_ENV}-routing}"
|
|||||||
HEALTH_TIMEOUT="${DEPLOY_HEALTH_TIMEOUT_SECONDS:-240}"
|
HEALTH_TIMEOUT="${DEPLOY_HEALTH_TIMEOUT_SECONDS:-240}"
|
||||||
HEALTH_POLL="${DEPLOY_HEALTH_POLL_SECONDS:-5}"
|
HEALTH_POLL="${DEPLOY_HEALTH_POLL_SECONDS:-5}"
|
||||||
STABILIZATION_SECONDS="${BLUE_GREEN_STABILIZATION_SECONDS:-10}"
|
STABILIZATION_SECONDS="${BLUE_GREEN_STABILIZATION_SECONDS:-10}"
|
||||||
|
DRAIN_SECONDS="${BLUE_GREEN_DRAIN_SECONDS:-30}"
|
||||||
STOP_TIMEOUT="${BLUE_GREEN_STOP_TIMEOUT_SECONDS:-45}"
|
STOP_TIMEOUT="${BLUE_GREEN_STOP_TIMEOUT_SECONDS:-45}"
|
||||||
IMAGE="$IMAGE_REPOSITORY/$SERVICE:$IMAGE_TAG"
|
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
|
case "$value" in ''|*[!0-9]*) echo "蓝绿时间参数必须为非负整数: $value" >&2; exit 2 ;; esac
|
||||||
done
|
done
|
||||||
|
|
||||||
@@ -365,6 +366,10 @@ fi
|
|||||||
|
|
||||||
old_container_stopped=false
|
old_container_stopped=false
|
||||||
if [ -n "$active_container" ] && docker inspect "$active_container" >/dev/null 2>&1; then
|
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"
|
echo "优雅停止旧 Web 实例: $active_container"
|
||||||
docker stop --time "$STOP_TIMEOUT" "$active_container" >/dev/null
|
docker stop --time "$STOP_TIMEOUT" "$active_container" >/dev/null
|
||||||
old_container_stopped=true
|
old_container_stopped=true
|
||||||
|
|||||||
@@ -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, /connect_routing_aliases "\$candidate" "\$ROUTING_ALIAS" "\$NACOS_SERVICE"/)
|
||||||
assert.match(script, /file,file-service:file/)
|
assert.match(script, /file,file-service:file/)
|
||||||
assert.match(script, /docker stop --time "\$STOP_TIMEOUT" "\$active_container"/)
|
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"/)
|
assert.match(script, /mv -f "\$STATE_FILE\.tmp" "\$STATE_FILE"/)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -114,6 +114,7 @@ async function runBlueGreen(health) {
|
|||||||
PATH: `${bin}${delimiter}${process.env.PATH ?? ''}`,
|
PATH: `${bin}${delimiter}${process.env.PATH ?? ''}`,
|
||||||
BLUE_GREEN_STATE_ROOT: stateRoot,
|
BLUE_GREEN_STATE_ROOT: stateRoot,
|
||||||
BLUE_GREEN_STABILIZATION_SECONDS: '0',
|
BLUE_GREEN_STABILIZATION_SECONDS: '0',
|
||||||
|
BLUE_GREEN_DRAIN_SECONDS: '0',
|
||||||
DEPLOY_HEALTH_TIMEOUT_SECONDS: '2',
|
DEPLOY_HEALTH_TIMEOUT_SECONDS: '2',
|
||||||
DEPLOY_HEALTH_POLL_SECONDS: '1',
|
DEPLOY_HEALTH_POLL_SECONDS: '1',
|
||||||
MOCK_LOG: log,
|
MOCK_LOG: log,
|
||||||
|
|||||||
Reference in New Issue
Block a user