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