Как запустить пользовательскую задачу rake через capistrano 3?
в каком направлении я могу запускать команды rake через capistrano на удаленном сервере.
например, у меня есть lib/task/reparse.rake
с некоторыми методами
desc "it take csv file, makes some changes and fill db with this info"
task :example1 => :environment do
require 'csv'
rows_to_insert = []
# some actions
# ...
end
на локальном сервере все нормально - я просто запустил rake reparse:example1
и он работает (заполните db правильно).
поэтому вопрос в том, как я могу запустить эту команду на реальном хостинге после развертывания?
Я использую рельсы 4.1 + capistrano 3.
P.S. примеры с сайта не работают для меня
Как запустить задачу рейка из Capistrano?
если я попробую cap production rake:invoke task=reparse:land
он терпит неудачу:
cap aborted!
Don't know how to build task 'rake:invoke'
некоторые исправления
namespace :somenamespace do
task :runrake do
on roles(:all), in: :sequence, wait: 5 do
within release_path do
execute :rake, ENV['task'], "RAILS_ENV=production"
end
end
end
end
таким образом, он начинает выполняться через
cap production somenamespace:runrake task=custom_task_file:custom_method1
Ответы
Ответ 1
На основе capistrano/rails
gem: https://github.com/capistrano/rails/blob/master/lib/capistrano/tasks/migrations.rake
namespace :somenamespace do
task :runrake do
on roles(:all) do
within release_path do
with rails_env: fetch(:rails_env) do
execute :rake, ask :task
end
end
end
end
end
Ответ 2
Итак, я работал над этим. он швы хорошо работает. Однако вам нужен форматир, чтобы действительно воспользоваться кодом.
Если вы не хотите использовать форматтер, просто установите уровень журнала в режим отладки.
SSHKit.config.output_verbosity = Logger::DEBUG
Cap Stuff
namespace :invoke do
desc 'Run a bash task on a remote server. cap environment invoke:bash[\'ls -la\'] '
task :bash, :execute do |_task, args|
on primary :app do
within deploy_to do
with rails_env: fetch(:rails_env) do
SSHKit.config.format = :supersimple
execute args[:execute]
end
end
end
end
desc 'Run a rake task on a remote server. cap environment invoke:rake[\'db:migrate\'] '
task :rake, :task do |_task, args|
on primary :app do
within current_path do
with rails_env: fetch(:rails_env) do
SSHKit.config.format = :supersimple
rake args[:task]
end
end
end
end
end
Это форматтер, который я построил для работы с указанным выше кодом. Он основан на: textimple встроенном в sshkit, но это не плохой способ вызвать пользовательские задачи. О, это многие не работают с новейшей версией sshkit gem. Я знаю, что это работает с 1.7.1. Я говорю это, потому что главная ветвь изменила доступные методы SSHKit:: Command.
module SSHKit
module Formatter
class SuperSimple < SSHKit::Formatter::Abstract
def write(obj)
case obj
when SSHKit::Command then write_command(obj)
when SSHKit::LogMessage then write_log_message(obj)
end
end
alias :<< :write
private
def write_command(command)
unless command.started? && SSHKit.config.output_verbosity == Logger::DEBUG
original_output << "Running #{String(command)} #{command.host.user ? "as #{command.host.user}@" : "on "}#{command.host}\n"
if SSHKit.config.output_verbosity == Logger::DEBUG
original_output << "Command: #{command.to_command}" + "\n"
end
end
unless command.stdout.empty?
command.stdout.lines.each do |line|
original_output << line
original_output << "\n" unless line[-1] == "\n"
end
end
unless command.stderr.empty?
command.stderr.lines.each do |line|
original_output << line
original_output << "\n" unless line[-1] == "\n"
end
end
end
def write_log_message(log_message)
original_output << log_message.to_s + "\n"
end
end
end
end
Ответ 3
Вы можете создать соответствующую задачу capistrano для выполнения определенной задачи рейка следующим образом:
namespace :guests do
desc 'Remove guest users older than 7 days'
task :clean do
on roles(:app) do
within release_path do
with rails_env: fetch(:rails_env) do
execute :rake, 'guests:delete_old_guest_users'
end
end
end
end
end
Ответ 4
вам нужно загрузить пользовательскую задачу rake в конфигурацию Capistrano:
# config/deploy.rb || config/deploy/production.rb
load 'lib/task/reparse.rake'
проверить новую задачу на консоли cap -T
Ответ 5
Не вмешиваясь в пользовательские задачи capistrano или вдаваясь в детали, все, что вам нужно сделать, это просто установить драгоценный камень, и вы можете начать выполнение задач рейка на удаленных серверах, например:
$ cap production invoke:rake TASK=some:rake_task