簡體   English   中英

如何使用多個 docker 設置 Gitlab CI E2E 測試

[英]How to setup Gitlab CI E2E tests using Multiple dockers

我對使用 Gitlab CI 的自動化測試有點迷失了。 我希望我能解釋我的問題,以便有人可以幫助我。 我會先試着解釋一下情況,然后我會試着問一個問題(這比聽起來更難)

情況

建築學

  1. 使用 Jest 單元測試和 Cypress e2e 測試反應前端
  2. Django API 服務器 1,包括 Postgres 數據庫和測試
  3. Django API 服務器 2 與 MongoDB 數據庫(與其他 ZDB974238714CA8DE634A7CE1D08

Gitlab

對於 2 個 API,有一個Docker和一個docker-compose文件。 這些工作正常並且設置正確。

我們將 GitLab 用於 CI/CD,我們按此順序有以下階段:

  1. build:其中 1、2 和 3 的 docker 單獨構建並推送到 private-registry
  2. 測試:單元測試和 e2e 測試(應該)運行的地方
  3. 發布: docker 鏡像發布的地方
  4. 部署:部署docker 映像的位置

目標

我想設置 GitLab CI 以便它運行柏樹測試。 但為此,需要所有構建 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

這篇文章可能會有所啟發。 https://jessie.codes/article/running-cypress-gitlab-ci/基本上,您制作了兩個 docker 作曲家,一個用於 Cypress 測試,一個用於您要測試的項目。 這解決了圖像能夠訪問節點和 docker 的問題。

答案有點晚了,但我還是會嘗試簡要解釋一下這種方法。

當 e2e 測試全棧應用程序時,您必須:

  • 針對已部署的環境進行測試
  • 在管道中臨時啟動環境

如您所述,您希望在管道中臨時啟動環境。 應采取以下步驟:

  1. 在 GitLab 的私有注冊表中將所有后端部署為 docker 映像;
  2. 在管道中的 1 個作業中模擬您的docker-compose.yml服務;
  3. 將這些點連接在一起。

在 GitLab 私有注冊表中將后端部署為 docker 映像

首先,您必須在 GitLab 的私有注冊表中發布您的 docker 映像。 您這樣做是因為您現在可以在另一項工作中重復使用這些圖像。 對於這種方法,您需要docker:dind 發布到 gitlab 上的私有注冊表的簡單示例作業如下所示:

before_script:
  - echo -n $CI_JOB_TOKEN | docker login -u gitlab-ci-token --password-stdin $CI_REGISTRY

publish:image:docker:
  stage: publish
  image: docker
  services:
    - name: docker:dind
      alias: docker
  variables:
    CI_DOCKER_NAME: ${CI_REGISTRY_IMAGE}/my-docker-image
  script:
    - docker pull $CI_REGISTRY_IMAGE || true
    - docker build --pull --cache-from $CI_REGISTRY_IMAGE --tag $CI_DOCKER_NAME --file Dockerfile .
    - docker push $CI_DOCKER_NAME
  only:
    - master

要查看真實示例,我有一個公開的示例項目

在管道中的 1 個作業中模擬您的docker-compose.yml服務

將所有后端 docker 化並在私有注冊表上發布圖像后,您可以開始使用 GitLab 作業來模仿您的docker-compose.yml 一個基本的例子:

test:e2e:
   image: ubuntu:20.04
   stage: test
   services:
      - name: postgres:12-alpine
        alias: postgress
      - name: mongo
        alias: mongo
      # my backend image
      - name: registry.gitlab.com/[MY_GROUP]/my-docker-image
        alias: server
   script:
      - curl http://server:3000 # expecting server exposes on port 3000, this should work
      - curl http://mongo:270117 # should work
      - curl http://postgress:5432 # should work!

運行測試

現在一切都在 GitLab 中的單個作業中運行,您可以簡單地以分離模式啟動前端並運行 cypress 來測試它。 例子:

 script:
   - npm run start & # start in detached mode
   - wait-on http://localhost:8080 # see: https://www.npmjs.com/package/wait-on
   - cypress run # make sure cypress is available as well

結論

您的docker-compose.yml並不意味着在管道中運行。 使用GitLab services來模仿它。 Dockerize 所有后端並將它們存儲在GitLab 的私有注冊表中。 啟動管道中的所有服務並運行測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM