Capistrano 3 - 在多个角色中执行两次任务

时间:2017-01-13 23:12:34

标签: ruby-on-rails deployment capistrano

在我的deploy.rb中,我有一些这样的自定义任务:

namespace :deploy do
  desc 'setup environment'
  task :env do
    on roles(:web) do
      invoke 'symlink:env_file'
      invoke 'config:foreman'
    end
  end

  before  'assets:precompile', 'env'
end

我的服务器定义如下所示:

server "my.app.ip", roles: %w{app web}, primary: true
server "my.resque.server.ip", roles: %w{resque web}

基本上我的应用程序' server负责运行主rails应用程序,我的resque框运行后台作业。但它们都具有Web角色,因为它们都通过我自己的自定义钩子配置/运行nginx + foreman。

当我运行我的cap deploy命令时,我一直遇到这样的错误:

Skipping task `symlink:env_file'.
Capistrano tasks may only be invoked once. Since task `symlink:env_file' was previously invoked, invoke("symlink:env_file") at config/deploy.rb:133 will be skipped.
If you really meant to run this task again, first call Rake::Task["symlink:env_file"].reenable

我真的只希望每个服务器运行一次这些命令。我基于任务中的角色定义的期望是,对于每个网络来说,这些任务将被调用一次。我服务器组中的服务器。为什么它多次执行?

1 个答案:

答案 0 :(得分:1)

Capistrano不是为在on区块内运行任意任务而设计的。您应该在on块中放置的唯一内容是SSH执行命令,例如:

  • test
  • execute
  • capture
  • upload!
  • download!

永远不要在invoke区块内使用on

在您的情况下,{em} per:web server 会执行on块一次,这意味着invoke肯定会被多次调用。

相反,为什么不对这两个任务使用before声明?

before 'assets:precompile', 'deploy:symlink:env_file'
before 'assets:precompile', 'deploy:config:foreman'