Как начать развертывание PHP-приложений из репозитория Subversion?

StackOverflow https://stackoverflow.com/questions/800294

Вопрос

Я слышал фразу «развертывание приложений», которая звучит намного лучше/проще/надежнее, чем загрузка отдельных измененных файлов на сервер, но я не знаю, с чего начать.

У меня есть приложение Zend Framework, находящееся под контролем версий (в репозитории Subversion).Как мне «развернуть» мое приложение?Что мне делать, если у меня есть каталог «загрузки», который я не хочу перезаписывать?

Я размещаю свое приложение через стороннюю организацию, поэтому я мало что знаю, кроме FTP.Если что-либо из этого связано с входом на мой сервер, пожалуйста, объясните процесс.

Это было полезно?

Решение

Автоматическое развертывание + запуск тестов на промежуточном сервере называется непрерывной интеграцией.Идея состоит в том, что если вы проверите что-то, что нарушает тесты, вы сразу же получите уведомление.Для PHP вы можете изучить Ксинк или PHPUnderControl

Обычно вы бы нет хотя я хочу автоматически развернуть его в производство.Обычно нужно написать несколько сценариев, которые автоматизируют задачу, но вам все равно придется запускать их вручную.Вы можете использовать такие фреймворки, как Пинг или другие инструменты сборки для этого (популярным выбором является Капистрано), но вы также можете просто объединить несколько сценариев оболочки.Лично я предпочитаю последнее.

Сами сценарии могут выполнять разные действия, в зависимости от вашего приложения и настроек, но типичный процесс будет таким:

  • ssh к производственному серверу.Остальные команды выполняются на рабочем сервере через ssh.
  • бегать svn export svn://path/to/repository/tags/RELEASE_VERSION /usr/local/application/releases/TIMESTAMP
  • остановить службы (Apache, демоны)
  • бегать unlink /usr/local/application/current && ln -s /usr/local/application/releases/TIMESTAMP /usr/local/application/current
  • бегать ln -s /usr/local/application/var /usr/local/application/releases/TIMESTAMP/var
  • бегать /usr/local/application/current/scripts/migrate.php
  • запустить службы

(Предполагая, что у вас есть приложение в /usr/local/application/current)

Другие советы

Я бы не рекомендовал автоматическое обновление.Тот факт, что ваши модульные тесты пройдены, не означает, что ваше приложение работает на 100%.Что, если кто-то проверит случайную новую функцию без каких-либо новых модульных тестов, и эта функция не будет работать?Ваши существующие модульные тесты могут пройти успешно, но функция в любом случае может быть сломана.Ваши пользователи могут увидеть что-то недоделанное.Благодаря автоматическому развертыванию при регистрации вы можете в течение нескольких часов не заметить, если что-то было запущено, чего не должно было быть.

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

1) Сделайте экспорт с последней регистрации 2) Загрузите экспорт на производственный сервер 3) Раскрыть/настройка недавно загруженный экспорт

Я всегда выполнял последние шаги вручную.Обычно это так же просто, как экспорт SVN, архивирование, загрузка, разархивирование, настройка, а последние два шага я просто объединяю для выполнения пары команд bash.Затем я заменяю корневой каталог приложения на новый, сохраняя старый в качестве резервной копии, и все готово.

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

Вот отличная статья об использовании Subversion для развертывания веб-проектов — она отвечает на многие ваши вопросы.

http://athleticsnyc.com/blog/entry/on-using-subversion-for-web-projects

В моей компании веб-разработчиков мы недавно начали использовать Вебистрано, который представляет собой веб-интерфейс популярного инструмента Capistrano.

Нам нужен был простой в использовании и быстрый инструмент развертывания с централизованным интерфейсом, возможностью подотчетности (кто какую версию развернул), откатом к предыдущим версиям и желательно бесплатным.Capistrano хорошо известен как инструмент развертывания приложений Ruby on Rails, но он не централизован и ориентирован в основном на приложения Rails.Webistrano расширяет его с помощью графического пользовательского интерфейса, функций отчетности и добавляет базовую поддержку развертывания PHP (используйте тип проекта «чистый файл»).

Webistrano сам по себе является приложением Ruby on Rails, которое вы устанавливаете на сервер разработки или промежуточный сервер.Вы добавляете проект для каждого вашего сайта.К каждому проекту вы добавляете этапы, такие как Prod и Dev.

На каждом этапе могут быть разные серверы для развертывания и разные настройки.Напишите (или измените) «рецепт», который представляет собой Ruby-скрипт, который сообщает capistrano, что делать.В нашем случае я просто использовал предоставленный рецепт и добавил команду для создания символической ссылки на общий каталог загрузок, как вы упомянули.

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

Мы очень довольны им, но мне потребовалось несколько дней, чтобы изучить и настроить его, тем более что я не был знаком с Ruby и Rails.Тем не менее, я настоятельно рекомендую его для производственного использования в малых и средних компаниях, поскольку он оказался очень надежным, гибким и во много раз сэкономил нам первоначальные инвестиции.Не только за счет ускорения развертывания, но и за счет уменьшения количества ошибок/несчастных случаев.

Подобные вещи вы бы назвали «непрерывной интеграцией».Atlassian Bamboo (стоимость), Sun Hudson (бесплатно) и Cruise Control (бесплатно) — популярные варианты (в порядке моих предпочтений) и поддерживают обработку вывода PHPUnit (поскольку PHPUnit поддерживает вывод JUnit).

Развертывание можно выполнить с помощью триггера после сборки.Как и некоторые другие участники этой темы, я бы проявил большую осторожность перед автоматическим развертыванием при регистрации (и прохождении тестирования).

Проверьте Fredistrano, это клон Capistrano отлично работает (Litle Bit сбивает с толку установку, но в конце концов, отлично работает)

http://code.google.com/p/fredistrano/

Для обработки загрузок классическим решением является перемещение фактического каталога из основного веб-пространства, оставив его только для извлечения новой версии (как я делаю в сценарии ниже), а затем с помощью Apache для «псевдонима» его обратно в разместить как часть веб-сайта.

Alias /uploads /home/user/uploads/

Однако у вас будет меньше выбора, если у вас нет такого большого контроля над сервером.

У меня есть сценарий, который я использую для развертывания данного сценария на сайтах разработки/Live (оба они работают на одном сервере).

#!/bin/sh

REV=2410
REVDIR=$REV.20090602-1027

REPOSITORY=svn+ssh://topbit@svn.example.com/var/svn/website.com/trunk
IMAGES=$REVDIR/php/i
STATIC1=$REVDIR/anothersite.co.uk

svn export --revision $REV  $REPOSITORY $REVDIR

mkdir -p $REVDIR/tmp/templates_c
chown -R username: $REVDIR
chmod -R 777       $REVDIR/tmp $REVDIR/php/cache/
chown -R nobody:   $REVDIR/tmp $REVDIR/php/cache/ $IMAGES
dos2unix $REVDIR/bin/*sh  $REVDIR/bin/*php
chmod 755 $REVDIR/bin/*sh $REVDIR/bin/*php

# chmod -x all the non-directories in images
find $IMAGES -type f -perm -a+x | xargs -r chmod --quiet -x
find $STATIC1 -type f -perm -a+x | xargs -r chmod --quiet -x

ls -l $IMAGES/* | grep -- "-x"

rm dev && ln -s $REVDIR dev

Я указываю номер версии и дату/время, которые используются для имени извлеченного каталога.Chmod посередине также гарантирует, что разрешения для изображений в порядке, поскольку они также связаны с нашим выделенным сервером изображений символическими ссылками.

Последнее, что происходит, это то, что старая символическая ссылка .../website/dev/ повторно связывается с недавно извлеченным каталогом.Конфигурация Apache затем имеет корень документа .../website/dev/htdocs/.

Также есть соответствующий .../website/live/htdocs/docroot, и опять же, «live» — это еще одна символическая ссылка.Это другой мой скрипт, который удалит активную символическую ссылку и заменит ее тем, на что укажет разработчик.

#!/bin/sh
# remove live, and copy the dir pointed to by dev, to be the live symlink
rm live && cp -d dev live

Я выпускаю новую версию сайта каждые несколько дат, так что, возможно, вы не захотите использовать ее несколько раз в день (мой кэш APC не хотел бы иметь больше нескольких версий сайта), но для меня , я считаю, что для моего собственного развертывания это практически беспроблемно.

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

Основы процесса автоматического развертывания выглядят следующим образом:

  1. Ваш код готов к производству, поэтому он помечен тегом версии выпуска:v1.0.0
  2. Предполагая, что вы уже настроили сценарий развертывания, вы запускаете его, указав только что созданный тег.
  3. Сценарий SSH переносится на ваш рабочий сервер, который имеет следующую структуру каталогов:

    /your-application
        /shared/
            /logs
            /uploads
        /releases/
            /20120917120000
            /20120918120000  <-- latest release of your app
                /app
                /config
                /public
                ...etc
        /current --> symlink to latest release
    
    Your Apache document root should be set to /your-application/current/public
    
  4. Скрипт создает новый каталог в каталоге релизов с текущим временем и датой.Внутри этого каталога ваш код обновляется до указанного вами тега.

  5. Затем исходная символическая ссылка удаляется и создается новая символическая ссылка, указывающая на последнюю версию.

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

Это зависит от вашего приложения и от того, насколько надежны тесты.

Там, где я работаю, все фиксируется в репозитории для проверки, а затем публикуется.

Автоматическое обновление из репозитория было бы для нас неразумно, так как иногда мы просто регистрируемся, чтобы другие разработчики могли получить более позднюю версию и объединить с ней изменения.

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

Также существуют проблемы с ветвлением и другими подобными функциями, которые необходимо решить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top