如何使用多个Docker设置Gitlab CI E2E测试

如何使用多个Docker设置Gitlab CI E2E测试,docker,docker-compose,continuous-integration,gitlab,Docker,Docker Compose,Continuous Integration,Gitlab,我对使用Gitlab CI的自动化测试有点迷茫。我希望我能解释我的问题,以便有人能帮助我。我会先解释一下情况,然后再问一个问题(比听起来难) 处境 建筑学 使用Jest单元测试和Cypress e2e测试对前端进行反应 Django API服务器1,包括Postgres数据库和测试 Django API服务器2和MongoDB数据库(与其他API通信 Gitlab 对于这两个API,有一个Docker和一个Docker compose文件。它们工作正常,设置正确 我们将GitLab用于CI/CD

我对使用Gitlab CI的自动化测试有点迷茫。我希望我能解释我的问题,以便有人能帮助我。我会先解释一下情况,然后再问一个问题(比听起来难)

处境 建筑学
  • 使用Jest单元测试和Cypress e2e测试对前端进行反应
  • Django API服务器1,包括Postgres数据库和测试
  • Django API服务器2和MongoDB数据库(与其他API通信
  • Gitlab 对于这两个API,有一个
    Docker
    和一个
    Docker compose
    文件。它们工作正常,设置正确

    我们将GitLab用于CI/CD,按照此顺序,我们有以下几个阶段:

  • 构建:其中1、2和3的Docker是独立构建的,并推送到私有注册表
  • 测试:单元测试和e2e测试(应该)运行的地方
  • 发布:docker图像的发布位置
  • 部署:部署docker映像的位置
  • 目标 我想设置GitLab CI,以便它运行cypress测试。但为此,需要所有构建Docker。目前,我无法在执行端到端测试时同时使用所有Docker

    问题 我真的不知道如何才能做到这一点

    • 我可以使用构建阶段中构建的docker进行e2e测试吗?有人能给我一个如何实现的示例吗?(通过将构建docker容器作为服务运行?)
    • 我是否需要一个Docker compose文件,包括所有Docker和数据库
    • 我甚至需要一个
      dind
    我希望有人能给我一些关于如何做到这一点的建议。举个例子会更好,但我不知道是否有人愿意这样做

    感谢您抽出时间阅读

    (如果需要)API服务器1的示例
    这篇文章可能会有所启发。 基本上,您制作了两个docker Composer,一个用于Cypress测试,另一个用于待测试的项目。这解决了图像能够访问节点和docker的问题

    build-api:
      image: docker:19
      stage: build
      services:
        - docker:19-dind
      script:
        cd api
        docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
        docker pull $IMAGE_TAG_API:latest || true
        docker build -f ./Dockerfile --cache-from $IMAGE_TAG_API:latest --tag $IMAGE_TAG_API:$CI_COMMIT_SHA .
        docker push $IMAGE_TAG_API:$CI_COMMIT_SHA
    
    test-api:
      image: docker:19
      stage: test
      services:
        - postgres:12.2-alpine
        - docker:19-dind
      variables:
        DB_NAME: project_ci_test
        POSTGRES_HOST_AUTH_METHOD: trust
      script:
        - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
        - docker pull $IMAGE_TAG_API:$CI_COMMIT_SHA
        - docker run $IMAGE_TAG_API:$CI_COMMIT_SHA sh -c "python manage.py test"
      after_script:
        - echo "Pytest tests complete"
      coverage: "/TOTAL.+ ([0-9]{1,3}%)/"
    
    release-api-staging:
      image: docker:19
      stage: release
      services:
        - docker:19-dind
      only:
        refs: [ master ]
        changes: [ ".gitlab-ci.yml", "api/**/*" ]
      environment:
        name: staging
      script:
        - docker pull $IMAGE_TAG_API:$CI_COMMIT_SHA
        - docker tag $IMAGE_TAG_API:$CI_COMMIT_SHA $IMAGE_TAG_API:latest
        - docker push $IMAGE_TAG_API:latest