:app do logger.info "Stopping unicorn server(s).." run "touch #{unicorn_pid}" pid = capture("cat"> :app do logger.info "Stopping unicorn server(s).." run "touch #{unicorn_pid}" pid = capture("cat"> :app do logger.info "Stopping unicorn server(s).." run "touch #{unicorn_pid}" pid = capture("cat" />

Capistranoタスクは、指定されたスコープ内で実行されません。

定義された:app の役割の中で実行する必要があるいくつかのcapistranoタスクを構築しました。これは私がこれまで持っているものです:

desc "Stop unicorn"
task :stop, :roles => :app do
  logger.info "Stopping unicorn server(s).."
  run "touch #{unicorn_pid}"
  pid = capture("cat #{unicorn_pid}").to_i
  run "kill -s QUIT #{pid}" if pid > 0
end

私が知る限り、これは:app の役割で与えられたサーバー上で与えられたコマンドを実行するはずですか?しかし、問題は、サーバー上のコマンドを:db の役割で実行しているということです。

誰もがこの問題についていくつかの洞察を与えることができますか?または、Capistranoに:roles フラグを強制的に適用させる方法がありますか?

前もって感謝します

// Emil

0
私はもう少し調査しましたが、このタスクに至るまでに、<​​code> servers 配列にはすべての役割のサーバー( all )が含まれています。 app web db の両方がマージされています)
追加された 著者 Emil Kampp,
さらにキャプチャコマンドはすべてのサーバーで実行され、次にすべてのサーバーでkillコマンドが実行されるようです。これにより、killコマンドはすべてのサーバー上の最後のサーバーのIDを強制終了しようとします。この場合、サーバー配列を反復する前に、特定のサーバーで一連のコマンドを実行するのがベストプラクティスですか?
追加された 著者 Emil Kampp,
私は自分の問題をCapistrano自身が指定した find_servers 配列を通して反復することができることを知りました。だから、それは自分で解決しましたが、私はそれが最良の解決策だとはまだ考えていません。
追加された 著者 Emil Kampp,
あなたの環境はどうですか?
追加された 著者 phoet,

1 答え

キャプチャを使用すると、一覧表示された最初のサーバーでのみタスクが実行されます。

ドキュメントから:

キャプチャヘルパーは、最初に一致するサーバで指定されたコマンドを実行し、コマンドの出力を文字列として返します。

https://github.com/capistrano/capistrano/wiki /2.x-DSL-Action-Inspection-Capture

残念ながら、私は同様の問題に直面しています。find_serversの解決策はうまくいくかもしれませんが、ハッキーです。

0
追加された