lest, just lest

Заметки о web-разработке, администрировании Linux и настройке Mac OS X

Развертывание Symfony приложения с Capistrano и Subversion

без комментариев

Одним важных процессов в разработке web-приложений, в том числе и написанных с использованием фреймворка Symfony, является деплоймент или разворачивание и обновление проекта на удаленном сервере. Для выполнения подобных действий существует множество средств и одним из самых популярных является Capistrano. Он достаточно прост в освоении, очень гибок в настройке и функциональный богат, но по-умолчанию настроен для Ruby on Rails приложений.

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

В корне проекта запускаем capify . и начинаем настраивать config/deploy.rb.

Прежде всего необходимо установить в config/deploy.rb название приложения:

set :application, 'sfcap-example'

Указываем используемую систему контроля версий (в данном случае Subversion) и адрес репозитория:

set :scm, :subversion
set :repository,  'https://sfcap-example.googlecode.com/svn/trunk/'

Имя пользователя для доступа в SVN репозиторий будет браться из переменных окружения:

set :scm_username, ENV['SCM_USERNAME'] || ENV['USER']

В результате будет использоваться имя текущего пользователя локальной машины, которое можно переопределить переменной окружения SCM_USERNAME, запуская Capistrano примерно так:

SCM_USERNAME="just.lest" cap deploy

Включаем запрос пароля к SVN репозиторию и отключаем сохранение пароля на удаленном сервере:

set :scm_prefer_prompt, true
set :scm_auth_cache, false

Указываем целевую директорию на сервере и отключаем использование sudo:

set :deploy_to, "/home/lest/www/#{application}"
set :use_sudo, false

Метод получения/обновления кода приложения:

set :deploy_via, :remote_cache

Существуют также и другие способы, но самым эффективным является именно :remote_cache, потому что он хранит в директории [deploy_to]/shared/cached-copy на сервере рабочую копию кода из репозитория и использует svn update для получения изменений из SVN.

Удаленный сервер и имя пользователя для доступа к нему:

server 'work', :web, :app, :db, :primary => true
set :user, 'lest'

Указываем :shared_children для того, чтобы при cap deploy:setup в [deploy_to]/shared создались директории log и web/uploads:

set :shared_children, %w(log web/uploads)

Переопределяем стандартные задачи Capistrano из пространства имен deploy:

namespace :deploy do
  [: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:

namespace :symfony do
  desc 'Clear cache'
  task :cc do
    php = fetch(:php, 'php')
    run "cd #{current_path}; #{php} symfony cc"
  end
end

Добавляем выполнение задачи deploy:customize после deploy:update:

after 'deploy:update', 'deploy:customize'

Задача deploy:customize делает следующие:

  • удаляет .svn из директории web в целях безопасности
  • создает символические ссылки на конфигурационные файлы приложения
  • запускает необходимые задачи Symfony: symfony plugin:publish-assets и symfony project:permissions:
namespace :deploy do
  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:

  1. Развертывание сайта на Jekyll – Capistrano и Rsync
  2. Capistrano и deploy проектов
  3. Cron и Ruby: использование Whenever
  4. Включение цветного вывода для Capistrano

Автор: lest

Февраль 5, 2010 в 18:07

Опубликовано в development

Метки: , , , , , ,

Leave a Reply