Как запустить грабли из Capistrano? - PullRequest
99 голосов
/ 23 ноября 2008

У меня уже есть файл deploy.rb, который может развернуть мое приложение на моем производственном сервере.

Мое приложение содержит пользовательскую задачу rake (файл .rake в каталоге lib / tasks).

Я бы хотел создать задачу cap, которая будет удаленно запускать эту задачу rake.

Ответы [ 15 ]

56 голосов
/ 03 февраля 2010

Чуть более явно, в вашем \config\deploy.rb добавьте вне любой задачи или пространства имен:

namespace :rake do  
  desc "Run a task on a remote server."  
  # run like: cap staging rake:invoke task=a_certain_task  
  task :invoke do  
    run("cd #{deploy_to}/current; /usr/bin/env rake #{ENV['task']} RAILS_ENV=#{rails_env}")  
  end  
end

Затем с /rails_root/ вы можете запустить:

cap staging rake:invoke task=rebuild_table_abc
41 голосов
/ 06 марта 2014

Универсальная версия Capistrano 3 (запустить любое рейковое задание)

Создание общей версии ответа Мирека Русина:

desc 'Invoke a rake command on the remote server'
task :invoke, [:command] => 'deploy:set_rails_env' do |task, args|
  on primary(:app) do
    within current_path do
      with :rails_env => fetch(:rails_env) do
        rake args[:command]
      end
    end
  end
end

Пример использования: cap staging "invoke[db:migrate]"

Обратите внимание, что deploy:set_rails_env require происходит от драгоценного камня capistrano-rails

41 голосов
/ 11 декабря 2013

... пару лет спустя ...

Взгляните на плагин рельсов Capistrano, вы можете увидеть на https://github.com/capistrano/rails/blob/master/lib/capistrano/tasks/migrations.rake#L5-L14 он может выглядеть примерно так:

desc 'Runs rake db:migrate if migrations are set'
task :migrate => [:set_rails_env] do
  on primary fetch(:migration_role) do
    within release_path do
      with rails_env: fetch(:rails_env) do
        execute :rake, "db:migrate"
      end
    end
  end
end
41 голосов
/ 23 ноября 2008
run("cd #{deploy_to}/current && /usr/bin/env rake `<task_name>` RAILS_ENV=production")

Нашел с помощью Google - http://ananelson.com/said/on/2007/12/30/remote-rake-tasks-with-capistrano/

* * * * * * * * * * * * * * * * * * * * * * * * * * 100 * * - «Гоча» - сначала я не думал об этом и не мог понять, почему задача ничего не делала.

20 голосов
/ 08 мая 2012

Использовать грабли в стиле Capistrano

Есть распространенный способ, который будет "просто работать" с require 'bundler/capistrano' и другими расширениями, которые модифицируют рейк. Это также будет работать с подготовительными средами, если вы используете многоступенчатый. Суть? Используйте config vars, если можете.

desc "Run the super-awesome rake task"
task :super_awesome do
  rake = fetch(:rake, 'rake')
  rails_env = fetch(:rails_env, 'production')

  run "cd '#{current_path}' && #{rake} super_awesome RAILS_ENV=#{rails_env}"
end
14 голосов
/ 31 марта 2016

Используйте capistrano-rake драгоценный камень

Просто установите драгоценный камень, не вмешиваясь в пользовательские рецепты капистрано, и выполняйте требуемые грабли на удаленных серверах следующим образом:

cap production invoke:rake TASK=my:rake_task

Полное раскрытие: я написал это

7 голосов
/ 29 августа 2011

Я лично использую в производстве вспомогательный метод, подобный этому:

def run_rake(task, options={}, &block)
  command = "cd #{latest_release} && /usr/bin/env bundle exec rake #{task}"
  run(command, options, &block)
end

Это позволяет запускать грабли, аналогично использованию метода run (команда).


ПРИМЕЧАНИЕ: Это похоже на то, что Герцог предложил, но я:

  • использовать latest_release вместо current_release - по моему опыту, это больше, чем вы ожидаете при запуске команды rake;
  • следуйте соглашению об именах Rake и Capistrano (вместо: cmd -> task and rake -> run_rake)
  • не устанавливайте RAILS_ENV = # {rails_env}, поскольку правильное место для его установки - переменная default_run_options. E.g default_run_options [: env] = {'RAILS_ENV' => 'production'} # -> DRY!
5 голосов
/ 30 января 2012

Есть интересный драгоценный камень мыс , который делает ваши рейк-задачи доступными как задачи Capistrano, так что вы можете запускать их удаленно. cape хорошо задокументировано, но вот краткий обзор того, как его настроить.

После установки гема просто добавьте его в файл config/deploy.rb.

# config/deploy.rb
require 'cape'
Cape do
  # Create Capistrano recipes for all Rake tasks.
  mirror_rake_tasks
end

Теперь вы можете запускать все свои rake задачи локально или удаленно через cap.

В качестве дополнительного бонуса, cape позволяет вам установить, как вы хотите запускать грабли локально и удаленно (не более bundle exec rake), просто добавьте это в ваш файл config/deploy.rb:

# Configure Cape to execute Rake via Bundler, both locally and remotely.
Cape.local_rake_executable  = '/usr/bin/env bundle exec rake'
Cape.remote_rake_executable = '/usr/bin/env bundle exec rake'
3 голосов
/ 06 декабря 2012
namespace :rake_task do
  task :invoke do
    if ENV['COMMAND'].to_s.strip == ''
      puts "USAGE: cap rake_task:invoke COMMAND='db:migrate'" 
    else
      run "cd #{current_path} && RAILS_ENV=production rake #{ENV['COMMAND']}"
    end
  end                           
end 
2 голосов
/ 23 декабря 2015

Это сработало для меня:

task :invoke, :command do |task, args|
  on roles(:app) do
    within current_path do
      with rails_env: fetch(:rails_env) do
        execute :rake, args[:command]
      end
    end
  end
end

Тогда просто запустите cap production "invoke[task_name]"

...