Как сделать развертывание для приложения php

В настоящее время я разрабатываю php-приложение для благотворительной организации, и сейчас я нахожусь в стадии определения практики развертывания.

Наше приложение использует как Zend Framework, так и Doctrine. Приложение будет развернуто на разные серверы, каждый с другим конфигурационным файлом. Машины являются как Windows, так и Linux (но все с Apache и php 5.2+).

Источник доступен в репозитории subversion, и мы хотим создавать и хранить наши пакеты на сервере Linux.

Желательно, чтобы процесс обновления был таким же простым, как запуск команды обновления в каталоге приложения, где команда обновления также обновляет базу данных (с помощью сценариев доктрины) и обеспечивает зависимости фреймворков. Эта команда обновления должна быть командой на машине (мы не можем ssh в них). Предпочтительно, у нас есть возможность загрузить новую версию или предоставить уже загруженный tarball с новой версией. (но только загрузка или только tarball также в порядке)

Пакеты с установками и обновлениями (новые версии) также предпочтительно создаются с помощью одной команды.

    Я читал немного о phar's, pear, phing, но я не знаю, что лучший способ сделать это. Сервер непрерывной интеграции на самом деле не нужен, но я думаю о развертывании тестовых сред автоматически после создания версии.

    Первоначально только обновление приложения php должно быть очень простым, сначала заполняя конфигурационный файл, когда установка может быть выполнена вручную.

    Related of "Как сделать развертывание для приложения php"

    Я бы начал с создания корневого каталога приложений на разных серверах рабочей копии SVN. Вы можете добавить в mod_rewrite (или IIRF ASAPI фильтры для IIS) правила, чтобы люди не могли напрямую обращаться к вашим каталогам .svn.

    Затем обновление до последнего источника может быть таким же простым, как обновление SVN. Для ваших потребностей в обновлении базы данных я бы сохранил скрипты изменения базы данных также в SVN. Вероятно, вам придется обернуть обновление SVN в сценарий пакетной / оболочки, чтобы выполнять обновления базы данных после загрузки скриптов.

    Для управления изменениями на живых серверах у меня также есть свои рабочие копии, а не соединительные линии, но ветвь релиза. Вы можете объединить соединительную линию в отделение выпуска, когда будете готовы к выпуску. Это позволит вам протестировать развертывание и убедиться, что оно твердое, прежде чем выполнять его на живых серверах. Он также имеет приятный побочный эффект, дающий вам хорошую реплику версий сайта-релиза в случае, если вам нужно отслеживать проблемы после запуска.

    Наконец, в зависимости от интенсивности и времени этих обновлений, вы также можете захотеть, чтобы ваш сценарий обновления перевернул переключатель «под обслуживание», чтобы пользователи были временно удовлетворены надлежащим сообщением, а не сломанным сайтом.

    Benjamin Eberlei опубликовал блог несколько недель назад под названием « Попытка двухэтапного подхода PEAR / PHAR для разработки и развертывания» . Он описывает очень интересную и элегантную процедуру для развертывания приложения PHP.

    Я использовал подрывную деятельность в качестве инструмента развертывания.

    Используйте обновление svn на всех ваших производственных серверах или используйте phing. (Или используйте phing для обновления svn, даже.)

    Делает откаты и резервные копии мгновенными. Не забудьте удалить доступ к любым каталогам .svn.

    В любом случае, я бы справился с вашими построениями с помощью phing или чего-то подобного. Пусть он запускает ваши тесты, генерирует документы, создает и публикует ваш пакет / архив.

    Что касается распространения, вы можете запустить свой собственный сервер PEAR . Обоснование здесь заключается в том, что вы сказали, что хотите, чтобы пользователи загружали обновления, у вас есть как пользователи Windows, так и Linux, и вы хотите обрабатывать зависимости для них. PEAR должен иметь возможность обрабатывать все это с помощью одной команды.

    Тем не менее, я бы пошел с простейшей вещью, которая работает и подходит вашим пользователям. Это может быть только tarball, доступный через HTTP, и небольшой скрипт обновления PHP (или финская цель).

    Определенно предоставляйте простой способ отката к предыдущей версии. С кодом / конфигурацией вы можете просто сохранить копию. С помощью БД используйте миграцию (что похоже на то, что вы уже делаете.)

    Вы сказали, что у вас есть кластер. Мы находимся в том же положении, и мы используем ZF и Doctrine. Так мы решили проблему:

    <?xml version="1.0" encoding="UTF-8"?> <project name="yourprojectname" basedir="."> <target name="deploy" depends="apply-deltas,update-app01,update-app02"> </target> <target name="update-app01"> <sshexec host="app01" username="yourusername" password="yourpassword" trust="true" command="cd path/to/root/directory &amp;&amp; svn update &amp;&amp; php cmd/clear_cache.php "/> </target> <target name="update-app02"> <sshexec host="app02" username="yourusername" password="yourpassword" trust="true" command="cd path/to/root/directory &amp;&amp; svn update &amp;&amp; php cmd/clear_cache.php "/> </target> <target name="apply-deltas" depends="liquibase-prepare"> <updateDatabase changeLogFile="${db.changelog.file}" driver="${database.driver}" url="${database.url}" username="${database.username}" password="${database.password}" promptOnNonLocalDatabase="${prompt.user.if.not.local.database}" dropFirst="false" classpathref="classpath" > <changeLogProperty name="table.name" value="ant_param_table"/> </updateDatabase> </target> <target name="liquibase-prepare"> <path id="classpath"> <fileset dir="${basedir}/libNoPackage"> <include name="**/*.jar" /> </fileset> </path> <taskdef resource="liquibasetasks.properties"> <classpath refid="classpath"/> </taskdef> </target> </project> 

    Это далеко не идеальный, но он отлично подходит для нас. Надеюсь, это поможет.

    Ссылки:

    Apache Ant

    LiquiBase

    Если у вас есть вопросы, сообщите мне, чтобы я мог обновить answer.t

    Возможно, иногда более простой подход работает лучше всего. Если вы сохраняете стабильные выпуски, которые просто помечены в репозитории svn, вы можете просто написать сценарий batch / bash для загрузки новейшей версии, в то время как резервное копирование до старого без вмешательства пользователя – вы также можете запускать любые сценарии, необходимые для этого. Другой альтернативой является написание простого интерфейса для этого в PHP, но это зависит от того, насколько просто он должен быть.