初めに
アップデートサイクルが早いWebアプリでは、ときどきデプロイ日時を取得したいときがあります。特に身内で使っているものに関しては。Railsそのものにはデプロイ日時を記録する機構はないですが、Capistranoにタスクを追加することで、簡単にデプロイ日時を取得できます。
Capistranoにタスクを追加
デプロイ時の時刻をファイルに記録する処理を、:publishing
タスクの after に登録します。deploy:update_deployed_date
というタスクを追加して、web
role の、プロジェクトのルートに last_deploy
というファイルをtouchします。touch時にファイルのatimeとmtimeが現在時刻に更新されるので、Railsアプリ側からはこのファイルのatimeまたはmtimeを読み取ることで、デプロイ時の日時を取得できます。
namespace :deploy do
desc 'Update deployed date'
task :update_deployed_date do
on roles(:web) do
execute :touch File.join(current_path, "last_deploy")
end
end
after :publishing, :update_deployed_date
end
Railsアプリ側の設定
Railsアプリ側では、プロジェクトのルートにあるlast_deploy
ファイルのatimeをinitializersで取得します。
Rails.application.config.deploied_at = begin
last_deploy_path = Rails.root.join("last_deploy")
File.new(last_deploy_path).atime
rescue
nil
end
これでRailsアプリ内のどこからでも Rails.application.config.deploied_at
からデプロイ日時を取得できます。ただこれだとviewにRails
オブジェクトを参照するコードを書くことになり若干つらいので、ヘルパメソッドに記述します。
module ApplicationHelper
def deploied_at
begin
Rails.application.config.deploied_at.strftime("%Y-%m-%d")
rescue
nil
end
end
end
<p>Deployed on <%= deploied_at %></p>
おわりに
この記事を書いてから調べてわかったのですが、Capistranoの release_name
メソッドでリリース日時を "%Y%m%d%H%M%S"
で取得できるんですね...