Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Izhevsk PHP Meetup #2. На пути в continuous delivery. Автодеплой

Izhevsk PHP Meetup #2. На пути в continuous delivery. Автодеплой

Александр Лёвин, разработчик, Пиком
Расскажу об истории моих непростых отношений с деплоем. Об эволюции от ручного деплоя к автоматическому. И, конечно, не забуду рассказать моём текущем варианте деплоя и планах его развития.

Izhevsk PHP Meetup

April 27, 2017
Tweet

More Decks by Izhevsk PHP Meetup

Other Decks in Technology

Transcript

  1. Варианты деплоя: • Ручной • git pull + composer install

    • deploy.sh (баш скрипт) • Самописный инструмент • Готовый инструмент • ...
  2. Ручной деплой Минусы • Долго • Можно что-то забыть •

    Лень делать бэкап Плюсы • Пока не обнаружил
  3. Git pull + composer install Плюсы • Меньше ручной работы

    • Какая-никакая возможность откатиться Минусы • Бэкапы не полноценны • Не обновляет файлы вне версионного контроля • Возможен длительный даунтайм
  4. Самописный инструмент Плюсы • Можно заточить под собственные нужды •

    Можно использовать любимый PHP/Python/etc Минусы • Вместо 1 проекта 2 • Теперь еще и инструмент надо деплоить
  5. Готовый инструмент Плюсы • Зависит от инструмента, но в основном

    одни плюсы Минусы • Чужой код - чужие баги.
  6. Мои критерии хорошего деплоя • Автоматизация (человек лишь наблюдатель) •

    Бэкапы • Без даунтайма • Декларативный вид скрипта деплоя • Кросплатформенность • Обновление скрипта деплоя через деплой • Работа с git • ...
  7. Что хранить в хранилище git ВСЕ НЕОБХОДИМОЕ ДЛЯ РАЗВЕРТЫВАНИЯ •

    Конфигурации и настройки • composer.json + composer.lock • cron.tab • настройки для других сервисов (Monit/Munin/ etc) • Сам скрипт деплоя • etc...
  8. PHING PHING - PHing Is Not GNU make PHING это

    Apache Ant на PHP сайт - https://www.phing.info/ github - https://github.com/phingofficial/
  9. Варианты установки Composer {"require-dev": {"phing/phing": "2.*"}} PEAR pear channel-discover pear.phing.info


    pear install [--alldeps] phing/phing PHAR http://www.phing.info/get/phing-latest.phar
  10. Features • скрипт деплоя - простой XML файл • богатый

    набор задач из коробки • легкая расширяемость через классы PHP • кроссплатформенность • не требует внешних зависимостей • работает на PHP7
  11. <?xml version="1.0"?> <project name="project" default="devel"> <target name="devel"> task list for

    target "devel" </target> <target name="prod"> task list for target "prod" </target> <target name="qa"> task list for target "qa" </target> </project> Структура скрипта деплоя
  12. Файловая организация /var/deploy/phing.phar - phing /var/deploy/phing.xml - скрипт деплоя /var/deploy/gitsource/

    - папка git хранилища /var/project/- папка проекта /var/backups/ - папка для бэкапов
  13. <target name="prod"> <tstamp /> <property name="target_path" value="/var/project" /> <property name="backup_dir"

    value="/var/backups/${DSTAMP}_$ {TSTAMP}" /> <property name="tmp_dir" value="${target_path}_tmp" /> <property name="last_dir" value="${target_path}_last" /> <property name="git_path" value="/var/deploy/gitsource" /> <copy todir="${backup_dir}"> <fileset dir="${target_path}"> <include name="**" /> </fileset> </copy> <gitcheckout repository="${git_path}" branchname="prod" /> <gitpull repository="${git_path}" source="origin" refspec="$ {git_branch}" /> <delete dir="${tmp_dir}" /> <copy todir="${tmp_dir}" > <fileset dir="${git_path}"> <include name="**" /> <exclude name="web/assets/**" /> <exclude name="config/dist/**" /> </fileset> </copy> <copy file="${git_path}/config/dist/db.prod.php" tofile="$ {tmp_dir}/config/db.php" /> <mkdir dir="${tmp_dir}/web/assets" mode="0777" /> <copy file="${git_path}/config/dist/phing.xml" tofile="/var/ deploy/phing.xml" /> <exec command="${tmp_dir}/yii migrate --interactive=0" /> <delete dir="${last_dir}" /> <rename file="${target_path}" tofile="${last_dir}" /> <rename file="${tmp_dir}" tofile="${target_path}" /> </target> #получение даты и времени #блок инициализации переменных #резервное копирование #работа с git #сборка проекта во временную папку #Настройка #Обновление скрипта деплоя #миграции #выкат новой вресии
  14. Переменные цели <tstamp /> <property name="target_path" value="/var/project" /> <property name="backup_dir"

    value="/var/backups/${DSTAMP}_ ${TSTAMP}" /> <property name="tmp_dir" value="${target_path}_tmp" /> <property name="last_dir" value="${target_path}_last" /> <property name="git_path" value="/var/deploy/gitsource" /> <property name="git_branch" value="prod" />
  15. Сборка проекта во временную папку <delete dir="${tmp_dir}" /> <copy todir="${tmp_dir}"

    > <fileset dir="${git_path}"> <include name="**" /> <exclude name="web/assets/**" /> <exclude name="config/dist/**" /> </fileset> </copy>
  16. Запуск >cd /var/deploy >php phar.php -f phing.xml prod Buildfile: /var/deploy/project.xml

    project > prod: [echo] enjoy BUILD FINISHED Total time: 0.0699 seconds
  17. Автоматизация На целевом сервере: deploy.sh из котором запускается php phing.phar

    /var/deploy/phing.xml пользователь deployer с правами запуска deploy.sh в /home/deploy/.ssh/authorized_keys ключ пользователя который будет запускать деплой удаленно
  18. /var/git/project/hooks/post-receive #/usr/bin/php <?php $remoteHost = 'xxx.xxx.xxx.xxx'; $resData = ''; while(($data

    = fgets(STDIN)) !== false) { $resData .= $data; } $params = explode(' ', $resData); $branch = trim(array_pop($params)); if ($branch === 'refs/heads/prod') { echo 'start deploy devel' . "\n"; exec('ssh deployer@' . $remoteHost . ' "deploy.sh"',$res); echo implode("\n", $res); } else { echo 'not deploy'; } На сервере хранилища (origin)
  19. Планы • Автодеплой для Битрикс • Авторолбэк (откат до последней

    рабочей версии) • Автодеплой через FTP (наверно надо capistrano)