Capistrano и deploy проектов
Capistrano является инструментом для автоматизации задач на одном или нескольких удаленных серверах. Он выполняет команды на всех целевых машинах параллельно и обеспечивает механизм для отката изменений. Поэтому удобно использовать Capistrano для развертывания web-приложений.
Для того, чтобы без использования Capistrano разместить свой код в production среде, можно выполнить одно из следующих действий:
- Залить по FTP весь код приложения, а затем обновлять измененные файлы.
- При использовании системы контроля версий (например, Subversion) зайти через SSH на production сервер и получить/обновить код с помощью checkout/update из репозитория.
- Использовать скрипты на основе rsync для синхронизации своей рабочей копии с сервером.
Разумеется, эти подходы имеют полное право на существование. Но кроме обновления кода есть и другие вещи, которые необходимо выполнять (применение миграций базы данных, очистка кэша и т.д.). Capistrano позволяет автоматизировать все рутинные операции связанные с развертыванием и обновлением приложений, оставляя больше времени на процесс разработки.
Стоит отметить, что Capistrano работает на локальной машине, а не на production сервере. Поэтому не нужно делать ничего особенного на стороне сервера, чтобы все работало.
Установка
Если Ruby и RubyGems уже установлены, то установка Capistrano очень проста:
Для использования Capistrano необходимо необходим SSH доступ к удаленным серверам (FTP не поддерживается). Также предполагается умение работы из командной строки (достаточно навыков перемещения по директориям и выполнения команд).
Чтобы воспользоваться всеми преимуществами Capistrano, необходимо минимально знать язык программирования Ruby, так как именно он используется при написании собственных задач.
Capfile
Конфигурацию и задачи Capistrano загружает из файла Capfile. По сути, это просто Ruby скрипт, но дополненный большим набором вспомогательных методов для легкого определения ролей серверов и задач.
Capistrano ищет Capfile вверх по дереву директорий, что позволяет запускать Capistrano из любой поддиректории, расположив Capfile в корне проекта.
Документирование задач
Задачи Capistrano содержат в себе документацию. Есть несколько способов получить список задач:
Это команда выводит список всех задач, у которых есть описание. Вывод выглядит примерно следующим образом:
cap deploy:check # Test deployment dependencies.
cap deploy:cleanup # Clean up old releases.
cap deploy:cold # Deploys and starts a `cold' application.
cap deploy:migrate # Run the migrate rake task.
cap deploy:migrations # Deploy and run pending migrations.
cap deploy:pending # Displays the commits since your last deploy.
При добавлении задачи без описания, она будет выводится в этом списке только в случае использовании опции -v:
Чтобы добавить описание к задаче, можно следовать небольшому примеру:
task :echo_hostname do
run "echo `hostname`"
end
Capification
Для того, чтобы начать использование Capistrano для развертывания приложения, необходимо сделать "capify". В директории приложения просто выполняем команду:
В результате создастся 2 файла:
Capfile, который загружаетconfig/deploy.rb.config/deploy.rbсодержит непосредственно конфигурацию Capistrano для развертывания приложения, в нем обычно и производится настройка.
Структура директорий
В результате успешного развертывания приложения с использованием Capistrano получается приблизительно следующая структура директорий:
[deploy_to]/releases
[deploy_to]/releases/20080819001122
[deploy_to]/releases/...
[deploy_to]/shared
[deploy_to]/current -> [deploy_to]/releases/20080819001122
При каждом обновлении создается директория в releases и туда помещается новая версия. Затем заменяется символическая ссылка current так, чтобы она указывала на эту директорию.
Необходимо убедиться, что [deploy_to]/current/public является корневой директорией (DocumentRoot в случае Apache) web-сервера.
Конфигурация
Capistrano должен знать, где будет размещаться приложение на сервере. По-умолчанию это "/u/apps/#{application}", но скорее всего понадобится изменить это на что-нибудь вроде "/var/www". Чтобы это сделать достаточно задать переменную :deploy_to:
Также необходимо указать адреса серверов (или одного сервера) и их роли. Это делается с помощью объявления role:
role :web, "example.com"
role :db, "example.com", :primary => true
В случае одного сервера удобнее использовать альтернативный синтаксис с использованием server:
Для процесса развертывания web-приложений Capistrano необходимо эти три роли (app, web и db):
- web - сервер, на котором работает web-сервер и куда приходят все запросы.
- app - сервер приложения, генерирующий динамическое содержание (например, может быть несколько серверов приложений, подключенных через балансировщик нагрузки).
- db - сервер базы данных, Capistrano запускает миграции только на главном сервере базы данных (
:primary => true).
Развертывание приложения (deploy)
Прежде всего необходимо, чтобы Capistrano создал базовую структуру директорий:
Теперь можно запускать непосредственно deploy приложения
Это должно заработать, иначе отлавливаем ошибки, исправляем их, запускаем cap deploy до тех пор, пока оно не заработает. После этого все последующие запуски должны превосходно работать.
Есть еще несколько полезных задач, которые по-умолчанию запускаются отдельно:
cap deploy:pending- выводит список ревизий, которые еще не залиты на серверcap deploy:migrate- запуск миграций базы данныхcap deploy:rollback- откатывает к предыдущей версииcap deploy:cleanup- очистка старых версий, по-умолчанию оставляет 5 версий, количество настраивается с помощьюset :keep_releases.
Источники:
Related posts: