首页 > 解决方案 > 如何在 Gitlab CI 中为基于 Docker 的 PHP 应用程序创建测试管道

问题描述

到目前为止,我在 Gitlab CI 上拥有/拥有一个健康的工作管道,分为两个阶段(构建和部署)。

现在我想在这两者之间添加一个测试阶段,并且我想在前一个阶段构建的图像上运行测试。我应该如何进行?

现在有了这个 CI 文件,我将获得一个正在运行的容器,并且一个 Web 服务器开始监听并且什么都没有,它会无限期地保持下去,这是我不想要的。

variables:
    CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/XXXXXXXXX:$CI_COMMIT_REF_SLUG
    CONTAINER_IMAGE_HASHED: $CI_REGISTRY_IMAGE/XXXXXXXXX:$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA

build:
    stage: build
    before_script:
        - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    script:
        - echo "Start building XXXXXXXXX container"
        - docker pull $CI_REGISTRY_IMAGE:latest || true
        - docker build --cache-from $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --tag $CI_REGISTRY_IMAGE:latest .
        - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
        - docker push $CI_REGISTRY_IMAGE:latest
    environment:
        name: staging
        url: $PUBLIC_ADDRESS

test:
    stage: test
    image: docker:stable
    services:
        - docker:dind
    script:
        - docker run --rm $CI_REGISTRY_IMAGE /bin/bash -c "vendor/bin/phpunit"
    environment:
        name: test

deploy:
    stage: deploy
    before_script:
        - mkdir -p ~/.ssh
        - echo -e "$KEY" > ~/.ssh/id_rsa
        - chmod 600  ~/.ssh/id_rsa
        - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    script:
        - apk update && apk add openssh-client
        - ssh $SERVER_USER@$SERVER_IP "docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY &&
          docker pull $CI_REGISTRY_IMAGE &&
          docker stop XXXXXXXXX || true &&
          docker rm XXXXXXXXX || true &&
          docker run -d -p 80:80 --name XXXXXXXXX $CI_REGISTRY_IMAGE"
    environment:
        name: production
        url: $PUBLIC_ADDRESS

我想运行测试(包括 PHPUnit),失败或成功时,容器应该关闭并删除(--rm)并继续部署(让我们说成功)(使用 allow_failure:true/false)。

编辑1:

这种方式也给出了相同的结果(容器运行并保持运行):

...
test:
    stage: test
    image: $CI_REGISTRY_IMAGE
    services:
        - docker:dind
    before_script:
        - cd webroot
        - composer install
        - composer run-script post-root-package-install
    script:
        - vendor/bin/phpunit
    environment:
        name: test
...

标签: phpdockerphpunitgitlab-ci

解决方案


after_script您可以使用部分和新变量的组合来清理构建作业,该CI_JOB_STATUS变量由 Gitlab CI/CD 预定义,after_script只要您运行 Gitlab 13.5 或更高版本,或者使用 Gitlab.com,它就会自动传递给。

...
test:
    stage: test
    image: docker:stable
    services:
        - docker:dind
    script:
        - docker run --rm $CI_REGISTRY_IMAGE /bin/bash -c "vendor/bin/phpunit"
    after_script:
      - if [ $CI_JOB_STATUS == "failed" ]; then ./cleanup_image.sh; fi
    environment:
        name: test
...

wherecleanup_image.sh代表您要删除图像的步骤。

您可以在此处查看可用变量


推荐阅读