运行 测试容器-python 在 GitHub 操作中 CI

Running testcontainers-python in GitHub Actions CI

为了确保功能,我们希望在 GitHub Actions 上执行 CI 范围内的所有测试。在这里,我们配置了一个名为 tests 的部分,它在定义的文件夹中执行 pytests。这已经适用于“单元测试”——意味着所有那些不需要与其他容器交互的测试。

此外,我们想添加与容器(即数据库)交互的测试。但是,开箱即用是失败的,因为启动测试容器失败。引发异常,因为在 testcontainers 的启动脚本中执行了 POST 以测试容器的准备情况。

    .venv/lib/python3.8/site-packages/urllib3/connectionpool.py:392:

    def request(self, method, url, body=None, headers={}, *,
            encode_chunked=False):
    """Send a complete request to the server."""
>   self._send_request(method, url, body, headers, encode_chunked)

我们的 Action 看起来像这样:

name: Test CI

on: [push]

env:
  PROJECT: test
  ACTION_URL: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
  PYTHON_VERSION: 3.8

jobs:
  tests:
    name: Tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: pytest
        run: |
          IMAGE_NAME="${{ env.PROJECT }}:test"
          docker build . --file test.dockerfile -t $IMAGE_NAME
          docker run $IMAGE_NAME

事实证明,GitHub 启动的默认容器没有 docker 客户端。因此,部分解决方案是通过将以下内容添加到我们的 docker 文件来手动安装 docker:

RUN apt -y install docker.io

此外,容器仍然无法 运行 成为 docker 容器,因为它没有自己的构建守护进程。这里的技巧是通过将 docker.sock 作为卷传递来使用由 GitHub Actions 拥有的容器提供的。因此,我们将 CI yml 中的最后一行替换为:

docker run -v "/var/run/docker.sock":"/var/run/docker.sock" $IMAGE_NAME