# #php #docker #phpunit #gitlab-ci
Вопрос:
До сих пор у меня был/есть исправный рабочий конвейер на Gitlab CI с двумя этапами (сборка и развертывание).
Теперь я хочу добавить этап тестирования между этими двумя, и я хочу запустить тесты на изображении, построенном на предыдущем этапе. Как мне следует действовать?
Прямо сейчас с помощью этого файла CI я получу работающий контейнер, и веб-сервер начнет прослушивать, и ничего, и он останется на неопределенный срок, чего я не хочу.
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 ]] amp;amp; echo -e "Host *ntStrictHostKeyChecking nonn" > ~/.ssh/config'
script:
- apk update amp;amp; apk add openssh-client
- ssh $SERVER_USER@$SERVER_IP "docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY amp;amp;
docker pull $CI_REGISTRY_IMAGE amp;amp;
docker stop XXXXXXXXX || true amp;amp;
docker rm XXXXXXXXX || true amp;amp;
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
...
Комментарии:
1. Пожалуйста, проверьте название вашего вопроса. Это открытый вопрос (тема очень широкая). В чем ваша конкретная проблема и что мешает вам превратить ее в конкретный вопрос (а не описание того, что вы обычно хотите сделать, а затем столкнуться с какой — то проблемой-мы все делаем каждый день, Stackoverflow лучше всего подходит для конкретных вопросов)
Ответ №1:
Вы можете очистить задание сборки с помощью комбинации 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
...
Где cleanup_image.sh
представлены шаги, которые вы должны выполнить, чтобы удалить изображение.
Вы можете просмотреть доступные переменные здесь