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 минут.

© Habrahabr.ru