docker-compose 环境中的 TeamCity 运行 pytest

TeamCity run pytest in a docker-compose environment

我对 teamcity 中的构建配置有疑问

我们正在开发 python(烧瓶)rest api,其中 sql 数据库保存数据。 Flask 服务器和 postgresql 服务器每个 运行 在一个 docker 容器中。 我们的存储库包含一个 docker-compose 文件,它启动所有必要的容器。

现在我想在 TeamCity 中设置一个构建配置,其中存储库被拉出,容器被构建,然后 docker-compose 文件应该被启动并且我的烧瓶中的所有测试函数(pytest)- python 申请应 运行。我想拿到测试报告,docker-compose down命令应该是运行.

我使用命令行构建配置步骤并发出命令的第一种方法有效,但我没有得到测试报告。我什至没有得到正确的退出代码(测试失败,但构建配置标记为成功)

你能告诉我什么是完成这项任务的最佳策略吗? 构建、测试、部署由多个 docker 容器构建的应用程序(即 docker-compose 文件)

谢谢 雅各布

我正在使用类似的配置:一个 FastAPI 应用程序,它使用 Firebase Emulator 套件再次 运行 pytest 案例。也许您会发现这些构建步骤也适合您的需要。我使用所有 built-in 运行ners.

获得了测试报告和覆盖率

阅读 TeamCity On-Premise documentation,我发现 运行 在 docker 容器中执行构建步骤命令将获取 TEAMCITY_DOCKER_NETWORK env var如果前面的步骤 运行 docker-compose。然后,此变量通过 --network 标志传递到 运行 在 docker 中的构建步骤,允许您与在 docker-compose.yml.

中启动的服务进行通信

需要三个步骤才能正常工作(请忽略屏幕截图中的编号,我还配置了其他步骤):

  1. 使用 Docker 运行ner,构建你将要 运行 pytest 的容器。我在这里使用 %build-counter% 给它一个唯一的标签。

  1. 使用 Docker Compose 运行ner,启动您的测试所依赖的其他服务(在您的情况下为 postgresql 服务)。我在这里使用 teamcity-services.yml 因为 docker-compose.yml 已经被我的团队用于本地开发。

  1. 在步骤 1 中构建的容器中使用 Python 运行ner,运行 Pytest。我使用建议的 teamcity-messages and coverage.py,使用 [=18 安装=] 在执行 pytest 之前在容器内。我的容器已经安装了 pytest,如果你查看“显示高级选项”,会有一个复选框让你“根据命令自动安装工具 运行”,但我还没有尝试过。

我的 teamcity-services.yml 的内容,暴露了我的应用程序在 运行ning pytest 时使用的端点。

version: "3"

services:
  firebase-emulator:
    image: my-firebase-emulator:0.1.13
    expose:
      - "9099" # auth
      - "8080" # firestore
      - "9000" # realtime database
    command: ./emulate.sh -o auth,firestore,database

pytest 的假设 app/tests/test_auth.py 运行,它连接到我在 firebase-emulator:9099 上的身份验证端点。请注意我是如何使用 teamcity-service.yml 中定义的服务名称和公开端口的。

def test_auth_connect(fb):
    auth = fb.auth.connect("firebase-emulator:9099")
    assert auth.connected

在我的实际应用程序中,我没有对 hostname/port 进行硬编码,而是将它们作为环境变量传递,也可以使用构建配置中的 TeamCity“参数”页面进行定义。