【发布时间】:2021-05-10 06:03:09
【问题描述】:
我对使用 Gitlab CI 的自动化测试有点迷茫。我希望我能解释我的问题,以便有人可以帮助我。我会先尝试解释情况,然后我会尝试提出一个问题(这比听起来更难)
情况
架构
- React 前端与 Jest 单元测试和 Cypress e2e 测试
- Django API 服务器 1 包括 Postgres 数据库和测试
- 带有 MongoDB 数据库的 Django API 服务器 2(与其他 API 通信
Gitlab
对于这 2 个 API,有一个 Docker 和一个 docker-compose 文件。这些工作正常并且设置正确。
我们将 GitLab 用于 CI/CD,我们按此顺序有以下阶段:
- build: 其中 1、2 和 3 的 docker 是单独构建并推送到 private-registry
- 测试: 单元测试和 e2e 测试(应该)在哪里运行
- 发布: docker 镜像的发布位置
- 部署: docker 镜像的部署位置
目标
我想设置 GitLab CI 以便它运行 cypress 测试。但为此,需要所有构建 docker。目前,在执行端到端测试时,我无法同时使用所有 docker。
问题
我真的不明白我将如何实现这一目标。
- 我可以使用构建阶段构建的 docker 进行 e2e 测试吗?有人可以举例说明如何实现吗? (通过将构建 docker 容器作为服务运行?)
- 我需要一个包含所有 docker 和数据库的 Docker-compose 文件吗?
- 我还需要
dind吗?
我希望有人可以就如何实现这一目标给我一些建议。举个例子会更好,但我不知道是否有人愿意这样做。
感谢您抽出宝贵时间阅读!
(如果需要) API 服务器示例 1
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
【问题讨论】:
-
我发表了一篇关于在 GitLab 中使用微服务进行端到端测试的文章,我猜它会有所帮助:medium.com/@datails/…
标签: docker docker-compose continuous-integration gitlab