Может ли Капистрано устанавливать переменные в зависимости от роли?

Я пытаюсь использовать Capistrano для развертывания в двух разных ролях, используя Bundler на обеих, однако команда и флаги Bundler будут разными. Можно ли установить переменные, специфичные для роли? Либо что-то вроде:

set :bundle_flags, "--deployment --quiet", :role => "web"

or:

role :web do
  set :bundler_cmd, "--deployment --quiet"
end

Конечно, ни один из этих двух вариантов не работает. Есть ли способ добиться этого или что-то в этом роде?


person silvamerica    schedule 01.01.2011    source источник


Ответы (1)


Невозможно иметь значения пользовательских переменных для каждой роли.

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

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

run "bundle --deployment --quiet", :roles => :web
run "bundle --deployment", :roles => :app

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

parallel do |session|
   session.when 'in?(:web)', "bundle --deployment --quiet"
   session.when 'in?(:app)', "bundle --deployment"
end
person Doug Barth    schedule 21.03.2011
comment
Многоступенчатость работать не будет, так как я уже использую ее на разных этапах развертывания. Кроме того, при последовательном размещении команд они будут запускаться в одной роли, а затем в другой, что может быть, а может и не быть проблемой. Я считаю, что это также вызовет ошибку, если у вас никогда не будет серверов, соответствующих роли. - person silvamerica; 23.03.2011
comment
Вы правы насчет бега. Я добавил дополнение об использовании параллельного помощника для решения обеих проблем. - person Doug Barth; 29.03.2011