记一次 Mongo2Go 在 CI 环境启动失败的排查过程
记一次 Mongo2Go 在 CI 环境启动失败的排查过程
最近在维护项目时,将 MongoDB.Driver 升级到了最新版,为了配套,单元测试用的 Mongo2Go 也顺带升级到了 v4.1.0。
升级后出现了一个典型的问题:代码在本地运行完全正常,但提交到 Bitbucket Pipeline 后,Sonar Scan 步骤执行单元测试时频繁报 System.TimeoutException。
1. 错误现象
在流水线日志中,测试用例报错信息如下:
Class Initialization method MongoDbRepositoryTests.ClassInitialize threw exception.
System.TimeoutException: A timeout occurred after 29998ms selecting a server...
Client view of cluster state is { ..., State : "Disconnected", Servers : [{ ..., HeartbeatException: "MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server.
---> System.Net.Sockets.SocketException (111): Connection refused" }] }
Connection refused 说明驱动程序尝试连接 MongoDB 端口时被拒绝了。这通常意味着 Mongo2Go 尝试启动的 mongod 进程压根没跑起来。
- 问题定位
查阅流水线的 Standard Output 日志,发现了一行关键的系统报错:
/root/.nuget/packages/mongo2go/4.1.0/tools/mongodb-linux-4.4.4/.../bin/mongod:
error while loading shared libraries: libcrypto.so.1.1:
cannot open shared object file: No such file or directory
原因很明确:mongod 运行依赖 libcrypto.so.1.1,但当前系统环境里找不到这个库。
3. 根本原因
Mongo2Go 4.1.0 捆绑的是 MongoDB 4.4.4 的二进制文件。这个版本的 MongoDB 在编译时依赖 OpenSSL 1.1。
而现在的 CI 环境(比如较新版本的 Debian 或 Ubuntu 镜像)默认已经升级到了 OpenSSL 3.x,并移除了不再维护的 OpenSSL 1.1 库。由于缺少这个底层加密库,mongod 启动即崩溃,导致后续的驱动连接超时。
4. 解决方案
在 bitbucket-pipelines.yml 执行测试的步骤前,手动下载并安装缺失的 libssl1.1 即可修复。
修改后的流水线配置片段:
script:
# 安装 OpenSSL 1.1 兼容库
- wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb
- dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb
# 后续执行测试命令...
- dotnet test
5. 小结
这类问题在升级基础库时比较常见:本地环境通常因为长期开发,各种旧版运行库比较全,掩盖了依赖问题。而在干净的 CI 镜像中,版本代差就会暴露出来。
如果遇到 Mongo2Go 启动超时,先看标准输出里有没有 error while loading shared libraries,通常都是缺库导致的。
参考链接
作者: 马行空的博客
出处: https://www.cnblogs.com/netry/p/19402685/mongo2go_libcrypto
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

浙公网安备 33010602011771号