しゅがーブログ

技術ネタとか書いていけたらな…

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などで実行した方がいいのかなと思いました。