Magento-модули и Travis CI
Краткая заметка с примерами конфигов, как использовать Travis CI при разработке модулей для Magento обеих версий.
Общая информация
Код примеров приложений:
Описание приложения для Magento 2. Приложение для Magento 1 весьма похоже по структуре и способу развертывания.
Каждый из рассматриваемых модулей является головным модулем Magento-приложения (содержит инструкции по развертыванию конечного web-приложения и подключения к нему других модулей). Развертывание может происходить в одном из трех вариантов:
- live: для конечного применения (production mode);
- work: для разработки (development mode);
- travis: для тестирования в среде Travis CI;
В каждом из вариантов сначала при помощи PHP Composer'а происходит развертывание в отдельный каталог самой Magento, а затем в развернутое приложение монтируются файлы модулей (копируются при live-развертывании, линкуются через символические ссылки в остальных случаях). После этого запускаются Magento-инсталлятор, который создает при необходимости начальную БД, и SQL-скрипт, изменяющий в начальной базе данных default'овые значения в зависимости от типа развертывания (включение перехода по символическим ссылкам, логирования и т.п.).
Чтобы не плодить сущностей, для разработки (work) и CI-тестирования (travis) используется один набор скриптов для развертывания:
- work/composer.json: дескриптор (М1 / М2) composer-проекта;
- work/cfg/bin/deploy/post_install.sh: шаблон (М1 / М2) shell-скрипта для запуска Magento-инсталлятора и SQL-скрипта;
- work/cfg/bin/deploy/post_install.sql: шаблон (М1) SQL-скрипта с изменениями для девелоперской версии окружения;
Само приложение развертывается в подкаталоге ./work/htdocs/. При развертывании в шаблонах post_install.sh и post_install.sql переменные (placeholders — пути, параметры доступа к БД, URL'ы и т.п.) замещаются их действующими значениями из конфигурационного файла ./work/templates.json и результирующие скрипты помещаются в каталог ./work/bin/deploy/.
Тестирование всех модулей, входящих в приложение, описывается в дескрипторах PHPUnit:
- work/test/functional/phpunit.dist.xml: дескриптор (М1 / М2) для запуска функциональных тестов (с подключением к БД);
- work/test/unit/phpunit.dist.xml: дескриптор (М1 / М2) для запуска unit-тестов (без подключения к БД);
CI для Magento 1
Дескриптор для Travis'а:
sudo: false # use container-based environment on Travis
language: php
php:
- 5.6
- hhvm
- '7'
before_install:
- cd work # go to root folder for development environment
- pwd # control current path ('LOCAL_ROOT' in templates.json)
- cp templates.json.travis templates.json # create configuration for Travis from template
- composer self-update # update composer to prevent error Class 'Composer\Installer\PackageEvents' not found in
# .../work/vendor/aydin-hassan/magento-core-composer-installer/src/CoreManager.php on line 109
- composer install # install project using PHP Composer
- cat ./bin/deploy/post_install.sh # control parameters in the installation script
- cat ./bin/deploy/post_install.sql # control parameters in the SQL script
- sh ./bin/deploy/post_install.sh # create initial DB, run SQL script, setup permissions, ...
script:
- phpunit --configuration ./test/unit/phpunit.dist.xml # run project's unit tests
- phpunit --configuration ./test/functional/phpunit.dist.xml # run project's functional tests
При развертывании и тестировании каких-либо особых неожиданностей не возникает, весь процесс занимает порядка 3-4 минут.
CI для Magento 2
Дескриптор для Travis'а:
sudo: required # use Travis standard env (http://docs.travis-ci.com/user/ci-environment/)
language: php
php:
- 5.6
# - hhvm # there is an error on DB installation: "Command option 'language': Invalid value. To see possible values,
# ... run command 'bin/magento info:language:list'."
before_install:
# Setup MySQL 5.6 on Ubuntu 12.04 (thanks to drogus - https://gist.github.com/drogus/6718448):
- mysql --version # control version before upgrade
- sudo apt-get remove mysql-common mysql-server-5.5 mysql-server-core-5.5 mysql-client-5.5 mysql-client-core-5.5
- sudo apt-get autoremove
- sudo apt-get install libaio1
- wget -O mysql-5.6.14.deb http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.14-debian6.0-x86_64.deb/from/http://cdn.mysql.com/
- sudo dpkg -i mysql-5.6.14.deb
- sudo cp /opt/mysql/server-5.6/support-files/mysql.server /etc/init.d/mysql.server
- sudo ln -s /opt/mysql/server-5.6/bin/* /usr/bin/
# some config values were changed since 5.5
- sudo sed -i'' 's/table_cache/table_open_cache/' /etc/mysql/my.cnf
- sudo sed -i'' 's/log_slow_queries/slow_query_log/' /etc/mysql/my.cnf
- "sudo sed -i'' 's/basedir[^=]\\+=.*$/basedir = \\/opt\\/mysql\\/server-5.6/' /etc/mysql/my.cnf" # there is an error
# ... w/o double quotes: The command "sudo sed -i'' 's/basedir[^=]\+=.*$/basedir = \/opt\/mysql\/server-5.6/' /etc/mysql/my.cnf" failed and exited with 1 during .
- sudo /etc/init.d/mysql.server start
- mysql --version # control version after upgrade
# Deploy Magento 2 application
# Go to working folder, copy templates.json for travis and start composer install process
- cd work # go to root folder for development environment
- pwd # control current path ('LOCAL_ROOT' in templates.json)
- cp templates.json.travis templates.json # create configuration for Travis from template
# - composer self-update # update composer to prevent error Class 'Composer\Installer\PackageEvents' not found in
# .../work/vendor/aydin-hassan/magento-core-composer-installer/src/CoreManager.php on line 109
- composer install
# Run post installation script (deploy Magento2 itself)
- cat ./bin/deploy/post_install.sh # control parameters in the installation script
- sh ./bin/deploy/post_install.sh # create initial DB, setup permissions, ...
script:
- phpunit --configuration ./test/unit/phpunit.dist.xml # run project's unit tests
- phpunit --configuration ./test/functional/phpunit.dist.xml # run project's functional tests
# - phpunit --configuration ./htdocs/dev/tests/unit/phpunit.xml.dist # run Magento 2 unit tests
С Magento 2 все несколько интереснее. Для начала нужно решить проблему с версией MySQL. В стандартном окружении Travis'а (Ubuntu 12.04) используется сервер MySQL 5.5, а Magento 2 требует для себя версию 5.6. Помог способ от коллеги drogus'а.
Затем выяснилось, что кроме версии PHP 5.6 развертывание нигде не проходит. На PHP 7 ругается Magento 2, а на HHVM не запускается инсталлятор. Ошибка при запуске инсталляции Magento 2, несмотря на то, что параметр language разрешенный («en_US»):
Command option 'language': Invalid value. To see possible values, run command 'bin/magento info:language:list
Для наших нужд хватает и одной только PHP 5.6, поэтому с HHVM даже не стал бороться.
Можно также запустить тесты самой Magento 2, но на Travis'е они сваливаются на 4071-м (из 15062) по причине нехватки памяти:
.PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 122133 bytes) in /home/travis/build/flancer32/sample_mage2_module/work/vendor/phpunit/phpunit/src/Util/GlobalState.php on line 110
Весь процесс развертывания и тестирования занимает порядка 8-10 минут.