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

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

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

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

Ответы [ 15 ]

2 голосов
/ 15 июня 2011

Вот что я положил в своем deploy.rb, чтобы упростить запуск граблей. Это простая оболочка для метода run () в capistrano.

def rake(cmd, options={}, &block)
  command = "cd #{current_release} && /usr/bin/env bundle exec rake #{cmd} RAILS_ENV=#{rails_env}"
  run(command, options, &block)
end

Тогда я просто запускаю любую задачу с граблями, например:

rake 'app:compile:jammit'
1 голос
/ 24 сентября 2014

Если вы хотите иметь возможность передавать несколько аргументов, попробуйте это (на основе ответа Мариносберна):

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
        execute :rake, "#{args.command}[#{args.extras.join(",")}]"
      end
    end
  end
end

Тогда вы можете запустить задачу так: cap production invoke["task","arg1","arg2"]

1 голос
/ 04 июля 2013

Большая часть из ответа выше с незначительным улучшением для запуска любого рейка из Капистрано

Запустить любое задание по рейку из capistrano

$ cap rake -s rake_task=$rake_task

# Capfile     
task :rake do
  rake = fetch(:rake, 'rake')
  rails_env = fetch(:rails_env, 'production')

  run "cd '#{current_path}' && #{rake} #{rake_task} RAILS_ENV=#{rails_env}"
end
1 голос
/ 26 июля 2010

Это также работает:

run("cd #{release_path}/current && /usr/bin/rake <rake_task_name>", :env => {'RAILS_ENV' => rails_env})

Дополнительная информация: Запуск Capistrano

0 голосов
/ 12 мая 2015

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

Если вы не хотите использовать средство форматирования, просто установите уровень журнала в режим отладки. Эти семы до ч

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 roles(:app), in: :sequence do
      SSHKit.config.format = :supersimple
      execute args[:execute]
    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

Это форматтер, который я создал для работы с кодом выше. Он основан на: текстовом простом встроенном в sshkit, но это не плохой способ вызывать пользовательские задачи. Ох уж это не работает с новейшей версией сшкит гема. Я знаю, что это работает с 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
...