Capistrano Tasks内でRuby処理を書く際に気をつけること
Overview
Capistrano Tasks内でプレーンなRuby処理を記述したときにどうなるかをまとめです。
前提
capistrano実行場所: Macbookローカル, ユーザ: hoge-man
リモートサーバ: Amazon Linux 2 on EC2, ユーザ: ec2-user
サンプル
以下のようなsampleタスクがあったとします。
executeはリモートサーバに対して処理を実行できます。
では、puts
で書いたコードはどこで処理されるのでしょうか?
実際にどのユーザが実行しているか確認していきます。
task :sample do on roles(:all) do execute "echo hoge" puts "hoge" end end
whoami
loggingさせるためinfoで実行ユーザが誰か確認します。
task :sample do on roles(:all) do info "#{whoami}" ← New execute "echo hoge" end end
result
リモートサーバのec2-userが処理を実行していることがわかります。
00:01 sample ec2-user ← infoのlogging 01 hoge ✔ 01 ec2-user@ip-XX-XX-XX-XX.ap-northeast-1.compute.internal 0.131s
Ruby処理
どのユーザが実行しているか確認するためのコードを追記します。
task :sample do on roles(:all) do puts "hoge" Process.uid ← 実行ユーザのプロセスIDを出力 ENV['USER'] ← 実行ユーザ名を出力 end end
result
先程とは違いリモートサーバで実行された形跡がなく、実行場所であるローカルのユーザが出力されます。
00:01 sample hoge 502 hoge-man
まとめ
とあるタスクにてプレーンなRubyがそのまま書かれていたので今回のような確認をしてみました。
localhostからcapistranoを実行する分にはそのまま記述して問題ありませんが、複数ホストにまたがる場合はタスクが失敗することがあります。
基本的にはプレーンなRuby処理はラップしておいて、execute
経由のrails runner
などで実行した方がいいのかなと思いました。