Rails - 使用Capistrano运行Rake任务

时间:2015-02-14 16:08:28

标签: ruby-on-rails ruby rake capistrano

我在这里摸不着头脑,想知道我是不是在叫错了树。我有一台服务器,我已经使用Capistrano部署了Rails应用程序。最近我向其中一个模型添加了一个新的数据类型,现在我需要运行一个Rake任务来更新现有的记录。

经过大量的谷歌搜索后,我开始怀疑人们是否会使用Capistrano的Rake任务。 2013年左右的一些论坛帖子提到Capistrano支持.rake扩展。而我发现的其他帖子表明Capistrano有自己的任务自动化系统,并且与rake不兼容。

我找到Cape,但我不确定这是否是我正在寻找的,因为它似乎将Rake任务转换为上限配方。我可能在这一点上犯了错误,我真的没有任何与Capistrano合作的经验,甚至没有在完整的堆栈频谱中工作。

我想知道的是:如何在远程服务器上运行简单的Rake任务?

为了清楚起见,我已经在最新的Ubuntu LTS上安装了应用程序,如果内存服务的话,请安装14.10。我按照教程here进行了操作。我有完整的sudo访问权限,我可以直接进入服务器。

提前感谢帮助一个菜鸟

2 个答案:

答案 0 :(得分:10)

如果您需要更新模型,您当然可以编写Rails迁移 - 如果它还没有运行,这将确保它运行。

在服务器上执行rake任务的最简单方法是通过ssh,如果它是一次性任务。请参阅您提到的教程中的最后一段:

cd /opt/www/testapp/current ; bin/rake RAILS_ENV=production db:seed

要回答关于rake的原始问题:你可以通过capistrano执行rake任务,类似于你在本地执行它的方式,只能在capistrano脚本中执行。这是一个例子:

deploy.rb:

namespace :rake do
  desc "My task"
  task :my_task do
    on roles(:app) do
      within "#{current_path}" do
        with rails_env: :production do
          execute :rake, "my_task"
          # !!!see NOTE at end of answer!!!
        end
      end
    end
  end
end

您可以在本地通过cap -T查看所有上限任务。我上面写的capistrano任务应该显示为cap tasks:my_rake_task

如果您想在不进行配置的情况下熟练地运行任何可用的rake任务,请执行以下操作:

namespace :rake do
  desc "Invoke rake task"
  task :invoke do
    on roles(:app) do
      within "#{current_path}" do
        with rails_env: :production do
          execute :rake, ENV['task']
          # !!!see NOTE at end of answer!!!
        end
      end
    end
  end
end

然后你可以写:

cap production deploy:invoke task=my:rake:task

注意:您可能希望用

替换执行行
run "bin/rake RAILS_ENV=#{rails_env} #{ENV['task']}"

使用与教程相同的语法(没有binstubs,你可能需要先配置capistrano / bundler和capistrano / rbenv ......)

答案 1 :(得分:5)

查看capistrano-rake

安装完成后,只需执行以下操作,即可在生产/登台服务器上运行任何rake任务,而无需麻烦的capistrano配方:

$ cap production invoke:rake TASK=your:rake:task

完全披露:我写了