GitHub Actions:如何在容器内运行测试

19

我希望能在容器内运行Django测试用例。我可以从Docker Hub拉取私有映像,但在运行测试的命令时失败了。

是否有人尝试在容器内运行测试用例?

jobs:
test:
container:
  image: abcd
  credentials:
    username: "<username>"
    password: "<password>"

steps:
  - uses: actions/checkout@v2
  - name: Display Python version
    run: |
      python -m pip install --upgrade pip
      pip install -r requirements/dev.txt
  - name: run test
    run: |
      python3 manage.py test
   

1
展示你的(最小)操作 YAML。在 Docker 中运行测试只是一个简单的问题,docker run your/image your-test-command(或者更好的方式是使用 docker-compose)。 - DannyB
@DannyB 我更新了 YAML 文件。我在容器命令下直接从 DockerHub 获取镜像。 - Manoj Jadhav
你收到了什么错误? - DannyB
1个回答

39

根据我的经验,我发现使用GitHub的container指令比在runner本身上运行任何你想要的东西更容易引起混淆,就像你在自己的机器上运行一样。

在GitHub actions中,我正在运行大部分测试都是在容器中运行的,其中一些需要私有的DockerHub镜像。

我总是这样做:

  1. 为了开发使用创建一个docker-compose.yml,以便我可以在本地测试。
  2. 通常在CI中,您可能希望在您的docker-compose中有略微不同的配置(例如,没有卷映射) - 如果是这种情况,我会在.ci子文件夹中创建另一个docker-compose.yml
  3. 我的docker-compose.yml包含一个test服务,可以运行任何我想要的测试(或测试套件)。

这是我正在使用的一个GitHub actions示例文件:

name: Test
on:
  pull_request:
  push: { branches: master }

jobs:
  test:
    name: Run test suite
    runs-on: ubuntu-latest
    env:
      COMPOSE_FILE: .ci/docker-compose.yml
      DOCKER_USER: ${{ secrets.DOCKER_USER }}
      DOCKER_PASS: ${{ secrets.DOCKER_PASS }}

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Login to DockerHub
      run: docker login -u $DOCKER_USER -p $DOCKER_PASS

    - name: Build docker images
      run: docker-compose build

    - name: Run tests
      run: docker-compose run test

当然,这需要设置两个提到的密钥,但除此之外,我发现这种方法:

  • 可靠
  • 便携(我轻松地使用相同方法从Travis CI切换)
  • 与开发环境兼容
  • 易于理解和在本地及CI中复制

4
那么 GitHub 是如何知道测试是否通过或失败(因为它们在 Docker 容器中运行)的呢? - d56
4
如果使用docker或docker-compose从主机运行一个执行测试的命令,如果容器中的命令失败,该命令也将以非零代码退出。 - DannyB
@DannyB,你有这个工作流程的示例代码库吗? - dondrzzy
4
@dondrzzy - 我主要是在为私有复杂应用程序使用这个工作流程,但我至少在两个公共存储库中有类似的工作流程:这里这里 - DannyB
是的,上面有一条评论 :) - DannyB
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接