php - 如何在 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
...
解决方案
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
代表您要删除图像的步骤。
您可以在此处查看可用变量