E N D
Обзор Continuous Integration инструментов и практические кейсы их использования Морванюк Виталий, системный администратор DrupalHosting from IT-Patrol
Зачем нужна Continuous Integration • Отслеживать состояние исходников(собирается ли текущий build или нет, и кто закоммитил изменения которые привели к ошибке) • Автоматический запуск unit-тестов • Оповещение о успехе/неудаче всех ответственных и последнего коммитера • Автоматическое разворачивание проекта на основе успешного build-а
Краткий обзор доступных инструментов для внедрения CI • GitLAB/GitHub + Jenkins +
Пример файла конфигурации .travis.yml для тестирования модуля Drupal Настройка БД Настройка инстанса, установка необходимых пакетов Настройка языка mysql: database: travis_ci_drupal_ module_example _test username: root encoding: utf8 before_install: - sudo apt-get update > /dev/null install: - sudo apt-get install -y --force-yes php5-cgi php5-mysql - export PATH="$HOME/.composer/vendor/bin: $PATH" - composer global require drush/drush:8.* language: php php: - 5.6 - hhvm matrix: fast_finish: true allow_failures: - php: hhvm
Пример файла конфигурации .travis.yml для тестирования модуля Drupal Предварительная настройка, установка Drupal и модулей, запуск встроенного web-cервера before_script: - cd ../.. - drush dl drupal-7 --drupal-project-rename=drupal - mv bober2000/travis-ci-drupal-module-example drupal/sites/all/modules/travis_ci_drupal_module_example - mysql -e 'create database travis_ci_drupal_module_example_test' - cd drupal - drush --verbose site-install --db-url=mysql://root:@127.0.0.1/travis_ci_drupal_module_example_test --yes # reference and enable travis_ci_drupal_module_example in build site - drush --yes pm-enable travis_ci_drupal_module_example - drush --yes pm-enable simpletest # start a web server on port 8080, run in the background; wait for initialization - drush runserver 127.0.0.1:8080 & - until netstat -an 2>/dev/null | grep '8080.*LISTEN'; do true; done Запуск тестов script: - php scripts/run-tests.sh --php "/usr/bin/php" --verbose --color --url http://http://127.0.0.1:8080 --class "TravisDrupalModuleExampleDrupalUnitTestCase"
Deploy после тестов GitHub Releases Google App Engine Google Cloud Storage Hackage Heroku Launchpad Modulus Ninefold npm OpenShift packagecloud.io PyPI Rackspace Cloud Files S3 Uploading Build Artifacts ExoScale anynines Appfog Atlas AWS CodeDeploy AWS OpsWorks Azure Web Apps bintray Boxfuse Cloud 66 cloudControl CloudFoundry Deis Divshot.io Engine Yard RubyGems Surge.sh .travis.yml для кастомного деплоя deploy: provider: script script: scripts/deploy.sh on: branch: stage
Особенности и ограничения TravisCI процессор 2 ядра по 2.4GHz 7.5 GB RAM максимальное время тестов 120 минут если нет никакого вывода на stdout от скриптов в течении 10 минут, тест прерывается. Хотя если у Вас ожидается использование подобных скриптов то следует обратить внимание на параметр travis_wait он поможет увеличить данное время) Travis для opensource предоставляет бесплатный тариф на котором ваши задачи ставятся в общую очередь и обрабатываются по мере освобожнения ресурсов. Интересную информацию можно увидеть на https://www.traviscistatus.com там видно что в пиковые моменты до 400 задач выполняется для opensource проектов — тоесть в пики придется ждать своей очереди. Есть ограничение на количество инстансов — для OpenSource проектов это 2 в случае платной подписки — максимум 10, тоесть имея 5 PR и тестируя его на 2х версиях РНР мы загрузим весь доступный максимум — все остальные будут поставлены в очередь. Деплой возможен только после билда на внутреннем инстансе
Сравнение конфигурационных файлов TravisCI и CircleCI language: php php: - 5.6 - hhvm matrix: fast_finish: true allow_failures: - php: hhvm mysql: database: travis_ci_drupal_module_example_test username: root encoding: utf8 before_install: - sudo apt-get update > /dev/null install: - sudo apt-get install -y --force-yes php5-cgi php5-mysql - export PATH="$HOME/.composer/vendor/bin:$PATH" - composer global require drush/drush:8.* - cd ../.. - drush dl drupal-7 --drupal-project-rename=drupal - mv bober2000/travis-ci-drupal-module-example drupal/sites/all/modules/travis_ci_drupal_module_example - mysql -e 'create database travis_ci_drupal_module_example_test' - cd drupal - drush --verbose site-install --db-url=mysql://root:@127.0.0.1/travis_ci_drupal_module_example_test --yes #- drush --yes pm-enable travis_ci_drupal_module_example - drush --yes pm-enable simpletest - drush runserver 127.0.0.1:8080 & - until netstat -an 2>/dev/null | grep '8080.*LISTEN'; do true; done - php scripts/run-tests.sh --php "/usr/bin/php" --verbose --color --url http://http://127.0.0.1:8080 --class "TravisDrupalModuleExampleDrupalUnitTestCase" machine: php: version: 5.6.18 pre: - sudo apt-get update > /dev/null - sudo apt-get install -y --force-yes php5-mysql checkout: post: - mkdir ../travis_ci_drupal_module_example - cp -a * ../travis_ci_drupal_module_example - mv ../travis_ci_drupal_module_example . dependencies: pre: - sudo composer global require drush/drush:8.* - drush dl drupal-7 --drupal-project-rename=drupal - mysql -u root -e 'create database travis_ci_drupal_module_example_test;' - mv travis_ci_drupal_module_example drupal/sites/all/modules/travis_ci_drupal_module_example - drush -r drupal --verbose site-install --db- url=mysql://root:@127.0.0.1/travis_ci_drupal_module_example_test --yes - drush -r drupal --yes pm-enable simpletest - drush -r drupal --yes pm-enable travis_ci_drupal_module_example test: pre: - drush runserver 127.0.0.1:8080 & override: - php drupal/scripts/run-tests.sh --php "/usr/bin/php" --verbose --color --url http://http://127.0.0.1:8080 --class "TravisDrupalModuleExampleDrupalUnitTestCase"
Особенности и ограничения CircleCI процессор 2 ядра по 2.4GHz 4GB RAM нет встроенной возможности запустить тесты на разных версиях РНР паралельно(в качестве решения можно использовать circleci-matrix или circleci- helpers) Деплой возможен только после билда на внутреннем инстансе по аналогии с TravisCI Немного нелогичный интерфейс, требующий привыкания
Deploy с помощью ZenCI Скрипт инсталла Настройка deploy #!/bin/sh echo "Installing drupal to " . $DOCROOT DATABASE_PASS="test" cd $DOCROOT drush dl drupal-7 --drupal-project-rename=drupal mv drupal/* . mv drupal/.htaccess . rm -rf drupal ln -s $ZENCI_DEPLOY_DIR sites/all/modules/travis_ci_drupal_module_example drush --verbose site-install --db-url=mysql:// $DATABASE_USER: $DATABASE_PASS@127.0.0.1/$DATABASE_NAME --yes drush --yes pm-enable simpletest drush --yes pm-enable travis_ci_drupal_module_example deploy: 7.x-1.x: #branch name server: ocean.vps-private.net #server address username: mv # user on server dir: '{home}/github/drupal/{branch}' #dir for git checkout env_vars: # set up env variables that we can use in scripts later docroot: '{home}/domains/test.mv.ocean.vps-private.net' # www root dir domain: test.mv.ocean.vps-private.net # domain name sitename: testsite #site name sitemail: noreply@test.mv.ocean.vps-private.net #site email database_name: mv_test # DB name database_user: mv_test # DB user scripts: init: '{deploy_dir}/scripts/install.sh' # install script С помощью ZenCI происходит deploy drupal.ru
Тестирование с помощью ZenCI Настройка секции тестов Скрипт запуска тестов run_tests.sh test: php53: branch: env_vars: docroot: '{home}/www/' box: 'backdrop-php53' dir: '{home}/github/branch/{branch}' scripts: init: '{deploy_dir}/scripts/install_test.sh' tests: - '{deploy_dir}/scripts/run_tests.sh' #!/bin/sh SITEPATH="$HOME/www" echo "Full site path: $SITEPATH" cd $SITEPATH php $SITEPATH/scripts/run-tests.sh --php "/usr/bin/php" --verbose --color --url http://127.0.0.1 --class "TravisDrupalModuleExampleDrupalUnitTestCase" С помощью ZenCI происходит тестирование Backdrop CMS
Особенности и ограничения ZenCI •Цена, нет пакетов: для opensource ограничения: 1. 250 deploy 2. 500 тестов 3. 2500 минут на Quadro Box 4. 1Gb диска для private: 1.каждый deploy стоит 0.01$ 2.каждый тест стоит 0.01$ + стоимость времени выполнения инстанса 3.Стоимость инстанса от 0.0008$/мин. 4.0.05$ Gb/день •Независимый от тестов deploy •Возможность запуска тестов в любом окружении при наличии ssh доступа •REST JSON API для кастомизированного статуса по деплою и тестам. •Проверка на CodeStyle(пока в beta по запросу) •Возможность поднять свой QA сервер с помощью секции pull_request •Необходимость писать отдельные скрипты для install и для запуска тестов •Мало документации •Мы только запустились :)
Спасибо за внимание! ВОПРОСЫ?