Retry deploy compose recreate races

This commit is contained in:
2569718930@qq.com
2026-06-01 14:21:43 +08:00
parent ac5b512a72
commit 573353421b
2 changed files with 38 additions and 4 deletions
+29 -4
View File
@@ -30,13 +30,38 @@ rollback_to_previous() {
echo "Rolling back to $PREVIOUS_TAG..."
export IMAGE_TAG="$PREVIOUS_TAG"
docker compose pull
docker compose up -d
compose_up_retry "rollback" -d
echo "✅ Rolled back to $PREVIOUS_TAG"
else
echo "⚠️ No previous tag to rollback to"
fi
}
compose_up_retry() {
local name="$1"
shift
local output=""
for attempt in $(seq 1 6); do
if output=$(docker compose up "$@" 2>&1); then
echo "$output"
return 0
fi
echo "$output"
if echo "$output" | grep -qi "removal of container .* is already in progress"; then
echo "Container removal is still in progress during ${name}; retry ${attempt}/6..."
sleep 5
continue
fi
return 1
done
echo "❌ docker compose up failed for ${name} after retries"
return 1
}
export IMAGE_TAG="$NEW_TAG"
pull_ok=0
for pull_attempt in $(seq 1 6); do
@@ -117,10 +142,10 @@ warm_public_route() {
}
echo "Updating Redis dependency..."
docker compose up -d polyweather_redis
compose_up_retry "redis" -d polyweather_redis
echo "Updating backend services..."
docker compose up -d --no-deps polyweather_web polyweather
compose_up_retry "backend services" -d --no-deps polyweather_web polyweather
echo "Waiting for backend..."
wait_for_local_service "backend healthz" "http://127.0.0.1:8000/healthz" 5 30 5 || FAILED_BACKEND=1
@@ -132,7 +157,7 @@ if [ "$FAILED_BACKEND" = "1" ]; then
fi
echo "Updating frontend..."
docker compose up -d --no-deps polyweather_frontend
compose_up_retry "frontend" -d --no-deps polyweather_frontend
echo "Waiting for frontend..."
wait_for_local_service "frontend root" "http://127.0.0.1:3001/" 5 40 2 || FAILED_FRONTEND=1
+9
View File
@@ -114,6 +114,15 @@ def test_deploy_script_retries_startup_smoke_checks():
assert 'smoke_check "frontend" "https://www.polyweather.top/" 15 3 5' in script
def test_deploy_script_retries_compose_recreate_races():
script = (ROOT / "deploy.sh").read_text(encoding="utf-8")
assert "compose_up_retry()" in script
assert "removal of container .* is already in progress" in script
assert 'compose_up_retry "backend services" -d --no-deps polyweather_web polyweather' in script
assert 'compose_up_retry "frontend" -d --no-deps polyweather_frontend' in script
def test_docker_compose_keeps_polyweather_ports_on_loopback():
compose = (ROOT / "docker-compose.yml").read_text(encoding="utf-8")