fix(ci): trap EXIT 回收集成测试 PG/Redis 容器,杜绝取消/失败泄漏 #1946

Merged
xiaoxia merged 2 commits from fix/ci-service-container-cleanup-trap into develop 2026-09-16 06:52:20 +08:00
2 changed files with 38 additions and 10 deletions
+26 -7
View File
@@ -120,6 +120,29 @@ wait_tcp_ready() {
return 1
}
# --- 幂等容器清理(无论成功/失败/被取消都回收临时 PG、Redis,杜绝泄漏)---
# 背景:服务容器用 docker run -d 起在宿主机上,仅在脚本走到结尾时清理;
# job 失败(set -e)或被取消(SIGTERM)时会永久残留,堆积压垮构建机。
cleanup_containers() {
# 清理过程自身不能再次触发退出,避免掩盖原始退出码
set +e
if [ -n "${PG_CONTAINER:-}" ]; then
docker rm -f "$PG_CONTAINER" >/dev/null 2>&1 && echo "✅ 已清理PG容器: $PG_CONTAINER"
fi
if [ -n "${REDIS_CONTAINER:-}" ]; then
docker rm -f "$REDIS_CONTAINER" >/dev/null 2>&1 && echo "✅ 已清理Redis容器: $REDIS_CONTAINER"
fi
}
on_exit() {
local code=$?
cleanup_containers
exit "$code"
}
# 必须在启动任何服务容器之前注册;INT/TERM 覆盖 Gitea 取消任务场景
trap on_exit EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
# --- 启动 Redis ---
echo ""
echo "=== 启动 Redis ==="
@@ -302,14 +325,10 @@ conn.close()
" 2>/dev/null || echo "WARN: 数据库清理失败(可能已被清理)"
echo "✅ 共享PG数据库已清理"
else
# 清理临时PG容器
docker rm -f "$PG_CONTAINER" 2>/dev/null || true
echo "✅ PG容器已清理"
# 临时PG容器由 EXIT trap 的 cleanup_containers 统一回收(失败/取消也保证清理)
:
fi
# 清理Redis容器
docker rm -f "$REDIS_CONTAINER" 2>/dev/null || true
echo "✅ Redis容器已清理"
# 临时Redis容器同样由 EXIT trap 统一回收
# --- 覆盖率汇总 ---
echo ""
+12 -3
View File
@@ -16,6 +16,17 @@ CONTAINER_NAME="staging-${MODE}-$$"
# 强制清理可能残留的同名容器
docker rm -f "$CONTAINER_NAME" 2>/dev/null || true
# 任何退出路径(成功/失败/被取消 SIGTERM)都回收容器,杜绝 staging 测试容器泄漏
cleanup_container() {
local code=$?
set +e
docker rm -f "$CONTAINER_NAME" >/dev/null 2>&1 && echo "✅ 已清理容器: $CONTAINER_NAME"
exit "$code"
}
trap cleanup_container EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
if [ "$MODE" = "e2e" ]; then
docker create --name "$CONTAINER_NAME" --ipc=host \
-e E2E_BASE_URL=https://staging.xiaoxiajianji.com \
@@ -44,7 +55,5 @@ docker cp apps "$CONTAINER_NAME:/workspace/"
docker start -a "$CONTAINER_NAME"
EXIT_CODE=$(docker wait "$CONTAINER_NAME")
# 清理容器
docker rm "$CONTAINER_NAME" 2>/dev/null || true
# 容器由 EXIT trap 的 cleanup_container 统一回收(失败/取消也保证清理)
exit "$EXIT_CODE"