Bitbucket流水线中MSSQL Testcontainers测试卡住问题排查求助
排查Bitbucket CI/CD中Testcontainers MSSQL测试卡住的思路
1. 先确认CI环境的Docker基础配置
- 检查Bitbucket Runner的Docker版本是否满足Testcontainers 1.19.3的最低要求(需≥20.10.x),版本不兼容会导致容器启动异常
- 查看Runner的Docker daemon日志,排查启动MSSQL容器时是否有权限报错、资源不足等异常
- 确认Runner进程是否加入
docker用户组,拥有操作Docker的完整权限
2. 开启详细日志追踪卡点
- 给测试添加系统属性
-Dtestcontainers.debug=true,打印Testcontainers容器启动、网络配置的完整DEBUG日志 - 开启HikariCP DEBUG日志:
-Dlogging.level.com.zaxxer.hikari=DEBUG,追踪连接池初始化的每一步操作 - 开启Liquibase DEBUG日志:
-Dlogging.level.liquibase=DEBUG,定位SQL脚本执行的具体卡点
3. 排查资源限制问题
- MSSQL容器内存占用较高,给Bitbucket Runner分配至少4GB内存及2核CPU,避免资源不足导致容器启动缓慢或卡住
- 在Testcontainers配置中给MSSQL容器设置内存上限,比如:
防止容器耗尽Runner资源mssqlContainer.withCreateContainerCmdModifier(cmd -> cmd.getHostConfig().withMemory(2048 * 1024 * 1024) );
4. 验证网络与端口通信
- 检查CI环境是否有防火墙/安全组策略,阻止测试进程与容器内部的通信
- 临时切换Testcontainers到主机网络模式(
withNetworkMode("host")),排查是否为端口映射问题导致的连接失败 - 确认CI环境中Testcontainers自动分配的端口未被其他进程占用
5. 调整镜像与版本兼容性
- 更换MSSQL镜像为稳定版本,比如从
mcr.microsoft.com/mssql/server:2022-latest换成2022-CU10-ubuntu-22.04,避免最新镜像的兼容性bug - 确认SpringBoot 3.1.5、Testcontainers 1.19.3与所选MSSQL镜像的版本适配性
6. 优化Testcontainers配置
- 禁用容器复用功能:添加系统属性
-Dtestcontainers.reuse.enable=false,CI环境复用容器易导致状态异常 - 明确配置MSSQL容器的环境变量,确保EULA接受和SA密码设置正确:
mssqlContainer.withEnv("ACCEPT_EULA", "Y") .withEnv("SA_PASSWORD", "YourStrong!Passw0rd"); - 添加更严格的启动等待策略,确保容器完全就绪后再执行测试:
mssqlContainer.waitingFor(Wait.forSqlServerPort() .withQuery("SELECT 1") .withTimeout(Duration.ofMinutes(2)));
7. 分步缩小排查范围
- 单独运行卡住的测试类,排除其他测试的干扰
- 在CI流水线中先通过
docker命令手动启动MSSQL容器,验证容器能否正常连接,再执行测试,区分是容器启动问题还是测试代码问题 - 用GenericContainer替代MSSQLContainer,手动配置镜像和启动命令,排查是否为MSSQLContainer封装逻辑导致的问题
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

