Как создать тестовый конвейер в Gitlab CI для PHP-приложения на основе Docker

# #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 представлены шаги, которые вы должны выполнить, чтобы удалить изображение.

Вы можете просмотреть доступные переменные здесь