[ruby] Capistrano에서 레이크 작업을 실행하려면 어떻게해야합니까?

프로덕션 서버에 앱을 배포 할 수있는 deploy.rb가 이미 있습니다.

내 앱에는 사용자 지정 레이크 작업 (lib / tasks 디렉터리의 .rake 파일)이 포함되어 있습니다.

레이크 작업을 원격으로 실행할 캡 작업을 만들고 싶습니다.



답변

좀 더 명시 적으로에서 \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


답변

… 몇 년 후 …

capistrano의 rails 플러그인 을 살펴보면 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


답변

Capistrano 3 Generic 버전 (모든 레이크 작업 실행)

Mirek Rusin의 대답의 일반 버전을 작성하십시오.

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필요는 카피 스트라 노 레일 보석에서 온다


답변

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/

RAILS_ENV=production내가 처음에 그것을 생각하지 않았고 작업이 아무것도되지 않은 이유를 알아낼 수 – 잡았다이었다.


답변

Capistrano 스타일 레이크 호출 사용

require 'bundler/capistrano'레이크를 수정하는 다른 확장 프로그램과 “그냥 작동”하는 일반적인 방법이 있습니다. 다단계를 사용하는 경우 사전 프로덕션 환경에서도 작동합니다. 요점? 가능한 경우 구성 변수를 사용하십시오.

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


답변

capistrano-rake보석 사용

커스텀 카피 스트라 노 레시피를 엉망으로 만들지 않고 gem을 설치하고 다음과 같이 원격 서버에서 원하는 레이크 작업을 실행하십시오.

cap production invoke:rake TASK=my:rake_task

전체 공개 : 내가 썼다


답변

개인적으로 프로덕션에서 다음과 같은 도우미 메서드를 사용합니다.

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

이를 통해 run (command) 메서드를 사용하는 것과 유사한 rake 작업을 실행할 수 있습니다.


참고 : Duke가 제안한 것과 비슷 하지만 저는 :

  • current_release 대신 latest_release를 사용하십시오. 내 경험상 rake 명령을 실행할 때 기대하는 것이 더 많습니다.
  • Rake 및 Capistrano의 명명 규칙을 따릅니다 (대신 : cmd-> task 및 rake-> run_rake).
  • RAILS_ENV = # {rails_env}를 설정하지 마십시오. 올바른 위치는 default_run_options 변수이기 때문입니다. 예 : default_run_options [: env] = { ‘RAILS_ENV’=> ‘production’} #-> DRY!