【问题标题】:TeamCity run pytest in a docker-compose environmentTeamCity 在 docker-compose 环境中运行 pytest
【发布时间】:2022-02-28 17:57:11
【问题描述】:

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

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

现在我想在 TeamCity 中设置构建配置,在其中提取存储库,构建容器,然后应该启动 docker-compose 文件,并且应该运行我的 flask-python 应用程序中的所有测试函数 (pytest)。我想得到测试报告,应该运行 docker-compose down 命令。

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

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

谢谢 雅各布

【问题讨论】:

    标签: docker docker-compose continuous-integration pytest teamcity


    【解决方案1】:

    我正在使用类似的配置:一个使用 Firebase Emulator 套件再次运行 pytest 案例的 FastAPI 应用程序。也许您会发现这些构建步骤也适合您的需求。我使用所有内置的运行程序获得了测试报告和覆盖率。

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

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

    1. 使用 Docker 运行程序,构建您将在其中运行 pytest 的容器。这里我使用%build-counter% 给它一个独特的标签。

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

    1. 使用 Python 运行程序,在步骤 1 中构建的容器中运行 Pytest。我使用建议的 teamcity-messagescoverage.py,它们在执行 pytest 之前使用容器内的 pip install 安装。我的容器已经安装了 pytest,如果您查看“显示高级选项”,有一个复选框可以让您“在命令运行时自动安装工具”,但我还没有尝试过。

    我的teamcity-services.yml 的内容,暴露了我的应用在运行 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
    

    一个由 py​​test 运行的假设 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
    

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

    【讨论】:

    • 谢谢。这正是我所需要的。诀窍是有一个单独的 docker-compose.yml(在您的案例中为 teamcity-services.yml),而无需在 teamcity 服务器中进行测试的实际应用程序。
    • 没错。将测试环境与 docker-compose.yml 中的应用程序分开是这种方法的关键。另一方面,我现在必须更新 2 个文件,我的 docker-compose.yml 被开发人员用于本地环境,teamcity-services.yml 用于 CI。
    • 也许您可以通过使用 docker-compose.yml 文件来简化这种情况,并使用 docker-compose.teamcity.yml 或 docker-compose.override.yml(用于本地开发)覆盖它跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2021-02-08
    • 2018-05-08
    • 1970-01-01
    • 2021-10-25
    • 2017-07-27
    • 2022-01-01
    相关资源
    最近更新 更多