2017-01-13 4 views
0

を実行中のタスク、私はこのようないくつかのカスタムタスクを持っている:カピストラーノ3 - 複数のロールに二回とき私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} 

私'app'サーバはメインレールアプリの実行を担当し、私のリークボックスはバックグラウンドジョブを実行します。しかし、彼らは両方とも、私の独自のカスタムフックを使ってnginx + foremanを設定/実行するため、両方ともWebロールを持っています。

私は私のキャップ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 

。タスク内のロール定義に基づく私の期待は、それらのタスクがサーバーグループ内の各「Web」サーバーに対して一度呼び出されるということです。なぜそれは何度も何かを実行しているのですか?

答えて

1

Capistranoは、onブロック内で任意のタスクを実行するようには設計されていません。

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

あなたがすべき:あなたがonブロック内に置く必要がある唯一のものは、次のようなSSH-実行コマンドです決して使用しないでくださいブロック内の。あなたのケースでは

onブロックがあたり一回実行されます:invokeを意味ウェブサーバーは、最も確かに複数回呼び出されています。

代わりに、両方のタスクにbefore宣言を使用しないでください。

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

ありがとう、私はカピストラーノのより良い理解を持っています。 capistranoに名前空間内のすべてのコマンドを実行するように指示する方法はありますか?たとえば、私のカスタム 'config'名前空間に別のタスクがある場合、実行するために新しい行を追加する必要があります。 – Msencenb