Spring Boot2中de.flapdoodle.embed.mongo在GitLab CI运行失败如何解决?
该报错的核心原因是de.flapdoodle.embed.mongo组件无法在GitLab CI的运行环境中正常启动嵌入式MongoDB进程,本地环境拥有完整的系统依赖、网络权限和资源配额,而CI Runner通常使用精简容器镜像,存在依赖缺失、网络受限、资源不足等问题,可按以下方案逐一排查解决:
补充CI镜像的系统依赖
多数GitLab CI默认使用的精简OpenJDK镜像缺少MongoDB运行必需的依赖库,可在gitlab-ci.yml的安装步骤补充依赖:before_script: - apt-get update && apt-get install -y libssl1.1 libcurl4若使用Debian 12等新版本镜像找不到libssl1.1,可替换为
libssl3,同时指定嵌入式MongoDB使用4.4+以上兼容新版SSL库的版本。配置嵌入式MongoDB的下载规则
默认组件会从MongoDB官方地址下载二进制包,CI环境可能存在网络连通问题导致下载失败,可在测试配置文件application-test.properties中指定版本和国内镜像源:# 指定兼容的MongoDB版本,避免拉取最新不兼容版本 spring.mongodb.embedded.version=4.4.18 # 配置国内镜像源,解决外网下载慢/失败问题 de.flapdoodle.mongodb.embedded.download.url=https://mirrors.huaweicloud.com/mongodb/若CI镜像中已提前预装MongoDB,可直接关闭自动下载:
de.flapdoodle.mongodb.embedded.download.enabled=false解决端口和权限问题
CI环境默认27017端口可能被占用,可配置使用随机端口启动:# 0代表自动分配未被占用的随机端口 spring.mongodb.embedded.port=0另外flapdoodle默认会将二进制文件下载到
/tmp目录运行,可提前给目录加执行权限:chmod -R 777 /tmp优化测试资源占用
多个@DataMongoTest测试类会重复启动Spring上下文和MongoDB进程,容易超出CI的内存配额导致进程启动失败,可在测试类上添加注解复用上下文:@TestInstance(TestInstance.Lifecycle.PER_CLASS) @DataMongoTest public class DepositRepositoryTest { // 原有测试逻辑保持不变 }也可以在
build.gradle中调整测试JVM的内存上限:test { jvmArgs '-Xmx2g', '-Xms1g' }替代方案:使用Testcontainers启动MongoDB
若以上方案都无法解决,可替换嵌入式MongoDB为Testcontainers启动的MongoDB容器,只要GitLab Runner开启Docker in Docker权限即可正常运行,兼容性更强,不存在系统依赖缺失问题。
内容的提问来源于stack exchange,提问作者José Mendes

