Развертывание Symfony приложения с Capistrano и Subversion
Одним важных процессов в разработке web-приложений, в том числе и написанных с использованием фреймворка Symfony, является деплоймент или разворачивание и обновление проекта на удаленном сервере. Для выполнения подобных действий существует множество средств и одним из самых популярных является Capistrano. Он достаточно прост в освоении, очень гибок в настройке и функциональный богат, но по-умолчанию настроен для Ruby on Rails приложений.
Настроить Capistrano для развертывания Symfony приложений не составляет особого труда, так как все этапы стандартного процесса с легкостью можно переопределить.
В корне проекта запускаем capify . и начинаем настраивать config/deploy.rb.
Прежде всего необходимо установить в config/deploy.rb название приложения:
Указываем используемую систему контроля версий (в данном случае Subversion) и адрес репозитория:
set :repository, 'https://sfcap-example.googlecode.com/svn/trunk/'
Имя пользователя для доступа в SVN репозиторий будет браться из переменных окружения:
В результате будет использоваться имя текущего пользователя локальной машины, которое можно переопределить переменной окружения SCM_USERNAME, запуская Capistrano примерно так:
Включаем запрос пароля к SVN репозиторию и отключаем сохранение пароля на удаленном сервере:
set :scm_auth_cache, false
Указываем целевую директорию на сервере и отключаем использование sudo:
set :use_sudo, false
Метод получения/обновления кода приложения:
Существуют также и другие способы, но самым эффективным является именно :remote_cache, потому что он хранит в директории [deploy_to]/shared/cached-copy на сервере рабочую копию кода из репозитория и использует svn update для получения изменений из SVN.
Удаленный сервер и имя пользователя для доступа к нему:
set :user, 'lest'
Указываем :shared_children для того, чтобы при cap deploy:setup в [deploy_to]/shared создались директории log и web/uploads:
Переопределяем стандартные задачи Capistrano из пространства имен deploy:
[:start, :stop, :restart].each do |task_name|
task task_name do
# nothing
end
end
task :finalize_update, :except => { :no_release => true } do
run <<-CMD
rm -rf #{latest_release}/log #{latest_release}/web/uploads &&
mkdir -p #{latest_release}/web &&
ln -s #{shared_path}/log #{latest_release}/log &&
ln -s #{shared_path}/web/uploads #{latest_release}/web/uploads
CMD
run "mkdir -p #{latest_release}/cache"
end
desc 'Migrate database'
task :migrate, :roles => :db, :only => { :primary => true } do
php = fetch(:php, 'php')
migrate_env = fetch(:migrate_env, 'production')
migrate_target = fetch(:migrate_target, :latest)
directory = case migrate_target.to_sym
when :current then current_path
when :latest then current_release
else raise ArgumentError, "unknown migration target #{migrate_target.inspect}"
end
puts "#{migrate_target} => #{directory}"
run "cd #{directory}; #{php} symfony doctrine:migrate --env=#{migrate_env}"
end
end
В задаче deploy:finalize_update создаются символические ссылки на общие директории (логи и загруженные файлы) и создается директория для кэша.
С помощью cap deploy:migrate можно запускать миграции Doctrine. Путь к PHP получаем с помощью fetch(:php, 'php'), чтобы в случае нестандартного пути можно было его задать через set :php.
Задача для очистки кэша с помощью symfony cc:
desc 'Clear cache'
task :cc do
php = fetch(:php, 'php')
run "cd #{current_path}; #{php} symfony cc"
end
end
Добавляем выполнение задачи deploy:customize после deploy:update:
Задача deploy:customize делает следующие:
- удаляет
.svnиз директорииwebв целях безопасности - создает символические ссылки на конфигурационные файлы приложения
- запускает необходимые задачи Symfony:
symfony plugin:publish-assetsиsymfony project:permissions:
task :customize do
php = fetch(:php, 'php')
run "find #{current_path}/web -depth -wholename '*/.svn*' -delete"
run <<-CMD
ln -nfs #{shared_path}/databases.yml #{current_path}/config/databases.yml &&
ln -nfs #{shared_path}/symfony.php #{current_path}/config/symfony.php
CMD
run <<-CMD
cd #{current_path} &&
#{php} symfony plugin:publish-assets &&
#{php} symfony project:permissions
CMD
end
end
Исходный код приложения на Symfony с настроенной конфигурацией Capistrano доступен на Google Code.
Related posts: