Rails - 运行 使用 Capistrano 进行 Rake 任务

Rails - Run Rake tasks with Capistrano

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

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

我找到了 Cape,但我不确定这是否是我要找的,因为它似乎可以将 Rake 任务转换为 cap 配方。可能我在这一点上弄错了,我真的没有任何使用 Capistrano 的经验,甚至没有在全栈范围内工作的经验。

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

为清楚起见,我已经在最新的 Ubuntu LTS(如果没记错的话,14.10)上安装了应用程序。我按照 here 找到的教程进行操作。我有完全的 sudo 访问权限,我可以通过 ssh 进入服务器。

在此先感谢您帮助菜鸟

如果您需要更新模型,您当然可以编写一个 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']}"

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

查看 capistrano-rake

安装后,运行 您的 production/staging 服务器上的任何 rake 任务都无需混乱的 capistrano 配方,只需执行以下操作:

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

完全披露:我写的