fix(ci): 增加PG/Redis端口连通性检查,解决容器healthy但映射端口连不上 #615
Reference in New Issue
Block a user
Delete Branch "fix/ci-pg-connect-retry"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题
Validate Code Quality 和 Integration Tests 连续多轮偶发失败,错误为 PostgreSQL connection refused。
根因
docker run -P随机端口映射后,只检查了容器内部健康状态(pg_isready/redis-cli ping),但从宿主侧通过映射端口访问时可能存在延迟(iptables规则建立、网络命名空间切换等)。容器内部 healthy ≠ 宿主端口已可用。修复
在 docker healthcheck 通过后,增加一层实际 TCP 连通性验证(python socket connect),确保从 job 侧确实能连上后再往下走。
涉及文件:
scripts/ci/run_validate.sh— PG 增加 TCP 连通性检查scripts/ci/run_integration_tests.sh— PG 和 Redis 都增加 TCP 连通性检查🚀 预览环境已部署
📊 审查概览
❌ 需修改的问题(严重)
无
💡 改进建议(一般)
[scripts/ci/run_integration_tests.sh & run_validate.sh] 代码重复与可维护性
wait_for_tcp),接收 IP 和端口作为参数。这样可以减少代码冗余,便于统一修改超时时间或检查逻辑。[scripts/ci/run_integration_tests.sh & run_validate.sh] 超时错误提示
python3 -c ...命令。此时脚本会报错退出,但错误信息是 Python 抛出的ConnectionRefusedError或TimeoutError,不够直观。建议在循环结束后增加一个判断,如果循环耗尽仍未连接成功,则显式输出 "Error: Timed out waiting for service..." 并退出,以提高日志的可读性。✅ 良好实践
s.close()确保测试 socket 被正确关闭(尽管脚本随即退出,但这是良好的编码习惯)。s.settimeout(2)防止连接请求长时间阻塞,符合 CI 环境对时效性的要求。🤖 由 AI 代码审查机器人自动生成 | 2026-07-19 21:44:28 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #615 已关闭或合并,对应的预览环境已被清理。