Капистрано cli для не-ROR проектов
После месяца копаний в Capistrano хочу поделиться некоторыми знаниями, собранными по крупицам где попало.
Документация, нужно заметить, не на высоте. Хотя, для деплоймента родных Ruby On Rails проектов ее хватает.Итак, задача по деплойменту PHP проекта, написанного на Symfony.
Процесс деплоймента размазан тонким слоем по 3м веб-серверам (test, staging, production) + mail сервер + сервер перекодировки видео + сервера баз данных.Создано консольное ruby приложение, внутри которого и поднимается Capistrano
Документация, нужно заметить, не на высоте. Хотя, для деплоймента родных Ruby On Rails проектов ее хватает.Итак, задача по деплойменту PHP проекта, написанного на Symfony.
Процесс деплоймента размазан тонким слоем по 3м веб-серверам (test, staging, production) + mail сервер + сервер перекодировки видео + сервера баз данных.Создано консольное ruby приложение, внутри которого и поднимается Capistrano
gem 'capistrano', '>= 2.1.0'
require 'capistrano/cli' # капистрановский command-line utility
require 'modules/logger/' # свой логгер
# почему-то родной конфиг был только для чтения, а мы хотим писать (смотреть ниже cap_conf.logger к примеру)
module Capistrano
class Configuration
attr_accessor :config
end
end
# а вот и наш экземпляр, который хавает таски и выполняет
cap_conf = Capistrano::Configuration.new
# вот свой логгер
cap_conf.logger = DepLogger.getInstance()
# грузим задачи
cap_conf.load 'deploy' # базовые таски из lib/capistrano/recipes/deploy.rb
# файлы задач названы инкрементально (01_xxx.rb, 02_xxx.rb, 03_xxx.rb)
Dir['tasks/*.rb'].sort.each do |plugin|
cap_conf.load(plugin)
end
Используется вышеозначенное примерно вот так:
cap_conf.myproject.create
В namespace myproject таск create выглядит так:
namespace :myproject do
desc "Create Myproject"
task :create, :roles => :web do
# включаем транзакцию
transaction do
on_rollback do
site.rm_after_import # site это один из таск-неймспейсов, подгруженых ранее.
end
# выполнение тасков
site.task1
# ...
# ...
site.task10
end
end
end
Чтобы удалить роровское непотребство при деплоймент процессе, переопределяем родной deploy:finalize_update в одном из тасков, напр в 10_xxx.rb
речь идет о директориях log, public, tmp, system, pids, все то, что закомментировано.
# Override some RoR artefacts
namespace :deploy do
desc < <-DESC
Touches up the released code, etc. See original Capistrano description
DESC
task :finalize_update, :except => { :no_release => true } do
sudo "chmod -R g+w #{latest_release}" if fetch(:group_writable, true)
sudo "chown -R #{conf[:owner_user]}:#{conf[:owner_group]} #{latest_release}"
# mkdir -p is making sure that the directories are there for some SCM's that don't
# save empty folders
#run < <-CMD
# rm -rf #{latest_release}/log #{latest_release}/public/system #{latest_release}/tmp/pids &&
# mkdir -p #{latest_release}/public &&
# mkdir -p #{latest_release}/tmp &&
# ln -s #{shared_path}/log #{latest_release}/log &&
# ln -s #{shared_path}/system #{latest_release}/public/system &&
# ln -s #{shared_path}/pids #{latest_release}/tmp/pids
#CMD
end
end
В принципе это все. Как обойти некоторые спотыкачки (хождение через gateway только в одной из ролей, неработающий sudo, etc.), опишу в следующий раз.
Метки: capistrano, ruby