首页 > 解决方案 > Gitlab CI - 测试项目挂在 DbConnection.CreateCommand()

问题描述

我刚开始使用 docker,还想使用 gitlab-ci 进行构建和测试。经过漫长而痛苦的尝试,我终于设法准备好我的图像和 gitlab-ci.yml。我的项目由WebApi、数据库项目和测试项目组成。我当前的流程是(在 gitlab-ci 中使用 docker/compose 和 dind):

  1. 构建阶段:
    • 构建 webapi 并将其加载到容器注册表
    • 构建数据库并将其加载到容器注册表(图像 mcr.microsoft.com/mssql/server:2017-latest)
  2. 测试阶段:
    • 在准备测试的 compose 文件上运行 docker-compose:
      • 在构建阶段从容器注册表构建中的映像启动数据库容器
      • 构建测试项目并启动容器
    • docer 在测试容器上执行“dotnet test 'Tests.csproj'”

一条更重要的信息 - 测试项目正在使用Respawn将数据库重置为集成测试的清理状态。它基本上遍历对象图并在每次测试之前删除数据(也很好地处理关系)。对于 sql server,它使用 SqlConnection(在代码的后期阶段抽象为 DbConnection)连接到数据库。

如果我在本地机器上运行它(手动创建数据库映像,然后从 2a 运行 docker-compose,然后手动运行docker-compose -f Tests/docker-compose.ci.yml -p dockercomposeForTests --no-ansi up -d),测试运行良好。

然而,从 gitlab.com 来看,Respawn 上挂着测试。它们正好停在 DbConnection.CreateCommand() 上。在这个阶段,在我看来,无论是在我的设置中还是在容器中都存在某种问题,但是在尝试解决这个问题几天之后,我没有更多的想法。

我知道数据库已经启动并且测试正在连接到它。首先,Respawn 正在打开一个工作连接。其次,我还有一个 Hangfire 启动并连接到完全相同的数据库(使用与 Respawn 相同的连接字符串),并且 hangfire 正在报告连接性(起初我遇到了一些问题,但我离开了它,因为它可以帮助我诊断是否连接是有效的并且正在工作;在某些时候我可能会摆脱它,这样它就不会减慢测试速度)。

标签: c#sql-serverdocker.net-coregitlab

解决方案


推荐阅读