docker 如何通过启动API的CI/CD管道阶段

bvjveswy  于 2023-11-17  发布在  Docker
关注(0)|答案(1)|浏览(157)

我尝试在git CI/CD管道的最后阶段启动一个API。这是在Python中通过FastAPI/uvicorn完成的,它在Docker容器中运行。

app = FastAPI()
if __name__ == '__main__':
    uvicorn.run(app, port=777, host="0.0.0.0")

字符串
一切正常,但是,有一个问题。由于API启动并继续运行(它应该),一旦API启动,CI/CD阶段就不会通过,但它也会继续运行。因此,整个管道永远不会达到通过状态。
即使底层的Docker容器(以及其中的Python脚本)还没有终止,因为它需要保持API运行,如何将CI/CD阶段标记为已通过?

p8h8hvxi

p8h8hvxi1#

也许有些人来到这里也很高兴将测试中的API作为服务运行。下面的CI Pipeline与Gitlab一起工作。但是,在运行器上调试它是丑陋的。就像这里已经建议的许多评论一样,我也更喜欢在staging环境中进行适当的端到端测试。它在某些情况下仍然很有用,调试也不太成问题,当你有shell访问runner上的作业时。

stages:
  - build
  - test

variables:
  IMAGE: $CI_REGISTRY_IMAGE

build_image:
  stage: build
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  script:
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
    - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $IMAGE:$CI_COMMIT_SHORT_SHA 
  tags:
   - k8s

test_image:
  stage: test
  services: 
    - name: docker.io/bitnami/postgresql:16
      alias: db
    - name: $IMAGE:$CI_COMMIT_SHORT_SHA  # api runs as service
      alias: my-api
  variables:
    POSTGRESQL_PASSWORD: $POSTGRESQL_PASSWORD
    POSTGRESQL_USER: $POSTGRESQL_USER
    POSTGRESQL_DATABASE: $POSTGRESQL_DATABASE
  image: alpine:latest # test script runs curl in alpine
  before_script:
    - apk add curl jq postgresql-client
  script:
    - "curl -s -X POST -H 'accept: application/json' 'my-api/items/?n=100&random=true'"
    - "curl -s -X GET  -H 'accept: application/json' 'my-api/items/' | jq '.[][].email'" 
    - "echo 'THIS test is a STUB, and the pipeline lacks health checks for services'"
  tags:
   - k8s

字符串

相关问题