#php #phpstorm #composer #docker #phpunit
Что есть: Docker-контейнер с PHP и набором юнит-тестов. Можно запустить контейнер, и внутри через консоль запускать любые тесты - phpunit /test/test_1.php хостовая машина с установленным PhpStorm 9 папка с проектом, где лежат в том числе юнит-тесты. Эта папка залинкована в докер-контейнер. Проблема: PhpStorm удобно менеджерит тесты, и позволяет запускать локальные или удаленные тесты (посредством SSH). Но с докером работать не умеет, не получается обьяснить IDE как запускать тесты, лежащие в докере. Что нужно: Как поднастроить докер или PhpStorm, чтобы через GUI можно было запускать тесты. Дополнения: по ssh работает сейчас, но хотелось бы обойтись без него. пробовал создать bash-скрипт, который проксирует все запросы в контейнер. Вот такой скрипт docker run --rm php:cli php $@. Таким образом начинает работать команда php -v запущенная с хостовой машины. Но тесты используют аргументы файлы. Усложнил баш-скрипт: #!/bin/sh args='' for arg do if [ -f $arg ]; then arg=/mnt$( realpath $arg ) fi args="$args $arg" done env > /tmp/docker-env sed -i s/idekey=.*/idekey=PHPSTORM/ /tmp/docker-env docker run -e "PHP_IDE_CONFIG=serverName=phpunit-docker" \ --net=host --env-file /tmp/docker-env --rm \ -v /:/mnt -v /var/www:/var/www app php $args Это решает несколько проблем можно создать php.sh с этим кодом, и положить в любое место, например в /usr/local/bin, и обращаться с ним вроде это настоящий php phpstorm вызывая тесты создает /tmp/ide-phpunit.php который принимает env переменные которые настраиваются в самой ide, поэтому я использую /tmp/docker-env настройка --net=host решает все проблемы с сетью, например nslookup раньше выпадал с ошибкой Это не решает проблемы явного указания idekey=PHPSTORM и PHP_IDE_CONFIG Но всё равно PHPUnit тесты не запускаются, ругается composer PHP Fatal error: Cannot redeclare composerRequire7a368ac394ae1d2e857becf2a235ebaa() (previously declared in [APP_ROOT]/vendor/composer/autoload_real.php:56) in [APP_ROOT]/vendor/composer/autoload_real.php on line 59 Я подозреваю что это происходит потому что /tmp/ide-phpunit.php вызывает composer/autoload для нахождения phpunit, и при запуске тесты тоже запускают этот же
Ответы
Ответ 1
В PhpStorm можно настроить запуск тестов через SSH. Ниже инструкция, как запустить SSH-сервер в debian/ubuntu контейнере (docker image php:cli - это debian). Зайдите в контейнер. Допустим, он называется phpapp docker exec -it phpapp bash Устанавливаем SSH-сервер apt-get update; apt-get install openssh-server Запускаем SSH-сервер. Почему-то нужно указывать полный путь. /usr/sbin/sshd Если будет ругаться, возможно, ему нужно создать какой-то каталог перед запуском mkdir /var/run/sshd Добавляем пользователя adduser test Выходим из контейнера - Ctrl+D Пробрасываем 22-й порт контейнера на какой-то из локальных портов, например, 127.0.0.1:10022 (вместо 10022 можно выбрать любое число 1025-65535). Если запускаете на Windows через VirtualBox/Vagrant/docker-machine, то пробрасывайте на 0.0.0.0:10022 и в VirtualBox настройте проброску локального порта 10022 на порт 10022 в вашем VirtualBox. Логинимся в контейнер - ssh test@127.0.0.1:10022, где test - это пользователь, которого вы создали. Устанавливать SSH в Docker считается плохим тоном, но пока в PhpStorm простая и красивая интеграция с PHPUnit (не просто консоль, а список тестов и coverage) работает только через SSH. На production так не делайте.Ответ 2
Почему не установить phpunit на хостовую машину? зачем так переусложнять себе жизнь? Сорсы ведь на локальной машине и залинкованы внутрь докер-контейнера.Прогоняйте тесты вне докера, просто используйте аналогичную версию phpunit на хостовой машине. Это рабочий, проверенный мной вариант.
Комментариев нет:
Отправить комментарий