2014-05-23 5 views
12

auf diese Weise kann ich Rake-Befehle über capistrano auf Remote-Server ausführen.Wie man benutzerdefinierte Rechenaufgabe über capistrano 3 ausführen?

zum Beispiel habe ich ein lib/task/reparse.rake mit einigen Methoden

desc "it's take csv file, makes some changes and fill db with this info" 
task :example1 => :environment do 
    require 'csv' 
    rows_to_insert = [] 
    # some actions 
    # ... 
end 

auf lokalen Server ist alles in Ordnung - ich laufe nur rake reparse:example1 und es ist Arbeit (fill db korrekt). so Frage ist - wie kann ich diesen Befehl auf echte hosting, nach der Bereitstellung ausführen?

i'am mit Schienen 4.1 + Capistrano 3.

P. S. Beispiele von Website nicht für mich arbeiten How do I run a rake task from Capistrano?

wenn ich cap production rake:invoke task=reparse:land versuchen es irgendwie:

cap aborted! 
Don't know how to build task 'rake:invoke' 

einigen Fixes

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 

mit einer solchen Art und Weise über

auszuführen es beginnen
cap production somenamespace:runrake task=custom_task_file:custom_method1 
+1

Ich entschuldige mich, ich habe die Antwort nicht gründlich gelesen: P - Haben Sie versucht, eine Capistrano Aufgabe hinzuzufügen 'ausführen: Rake, ENV [' Task '] '? –

+0

@UriAgassi Thx für den Kommentar, ich mache einige Korrekturen und fügen Sie es zur Frage) – kpblc

+0

So jetzt funktioniert es? –

Antwort

1

Sie benötigen eine benutzerdefinierte Rake Aufgabe in Capistrano Config laden:

# config/deploy.rb || config/deploy/production.rb 
load 'lib/task/reparse.rake' 

-Check für neue Aufgabe in der Konsole cap -T

2

Sie erstellen können eine entsprechende Capistrano-Task, um eine bestimmte Rake-Task wie die folgende auszuführen:

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 
+0

danke ich werde auch so versuchen – kpblc

3

Also habe ich daran gearbeitet. es scheint gut zu funktionieren. Sie benötigen jedoch einen Formatierer, um den Code wirklich zu nutzen.

Wenn Sie keinen Formatierer verwenden möchten, setzen Sie den Protokollierlevel auf Debug-Modus.

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 

Dies ist die Forma ich oben mit dem Code arbeiten gebaut. Es basiert auf dem: textsimple, das in das sshkit eingebaut ist, aber es ist keine schlechte Art, benutzerdefinierte Tasks aufzurufen. Oh, das funktioniert nicht mit der neuesten Version von sshkit gem. Ich weiß, es funktioniert mit 1.7.1. Ich sage das, weil der Masterzweig die verfügbaren SSHKit :: Command-Methoden geändert hat.

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 
+1

Funktioniert nicht mit 3.5.0 von capistrano. Sie gingen zu airbrussh – Brandt

+1

Weitere Informationen unter https://github.com/mattbrictson/airbrussh In deploy.rb Set: Format,: airbrussh – shakaran

0

capistrano-rake

mit benutzerdefinierten Capistrano Aufgaben oder gehen sehr ins Detail Ohne Unordnung, man einfach versuchen, alles tun müssen, ist das Juwel installieren und Sie können die Ausführung Rake Aufgaben auf Remote-Servern wie folgt beginnen:

$ cap production invoke:rake TASK=some:rake_task