找回密码
 立即注册
首页 业界区 安全 记一次 Mongo2Go 在 CI 环境启动失败的排查过程 ...

记一次 Mongo2Go 在 CI 环境启动失败的排查过程

蚣澡 1 小时前
记一次 Mongo2Go 在 CI 环境启动失败的排查过程

最近在维护项目时,将 MongoDB.Driver 升级到了最新版,为了配套,单元测试用的 Mongo2Go 也顺带升级到了 v4.1.0。
升级后出现了一个典型的问题:代码在本地运行完全正常,但提交到 Bitbucket Pipeline 后,Sonar Scan 步骤执行单元测试时频繁报 System.TimeoutException。
1. 错误现象

在流水线日志中,测试用例报错信息如下:
  1. Class Initialization method MongoDbRepositoryTests.ClassInitialize threw exception.
  2. System.TimeoutException: A timeout occurred after 29998ms selecting a server...
  3. Client view of cluster state is { ..., State : "Disconnected", Servers : [{ ..., HeartbeatException: "MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server.
  4. ---> System.Net.Sockets.SocketException (111): Connection refused" }] }
复制代码
Connection refused 说明驱动程序尝试连接 MongoDB 端口时被拒绝了。这通常意味着 Mongo2Go 尝试启动的 mongod 进程压根没跑起来。

  • 问题定位
查阅流水线的 Standard Output 日志,发现了一行关键的系统报错:
  1. /root/.nuget/packages/mongo2go/4.1.0/tools/mongodb-linux-4.4.4/.../bin/mongod:
  2. error while loading shared libraries: libcrypto.so.1.1:
  3. 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 即可修复。
修改后的流水线配置片段:
  1. script:
  2.   # 安装 OpenSSL 1.1 兼容库
  3.   - wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb
  4.   - dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb
  5.   # 后续执行测试命令...
  6.   - dotnet test
复制代码
5. 小结

这类问题在升级基础库时比较常见:本地环境通常因为长期开发,各种旧版运行库比较全,掩盖了依赖问题。而在干净的 CI 镜像中,版本代差就会暴露出来。
如果遇到 Mongo2Go 启动超时,先看标准输出里有没有 error while loading shared libraries,通常都是缺库导致的。
参考链接


  • https://github.com/Mongo2Go/Mongo2Go/issues/149

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册