LoginSignup
3
3

More than 5 years have passed since last update.

Rails + Capistrano 3 でデプロイ日時を取得

Posted at

初めに

アップデートサイクルが早いWebアプリでは、ときどきデプロイ日時を取得したいときがあります。特に身内で使っているものに関しては。Railsそのものにはデプロイ日時を記録する機構はないですが、Capistranoにタスクを追加することで、簡単にデプロイ日時を取得できます。

Capistranoにタスクを追加

デプロイ時の時刻をファイルに記録する処理を、:publishing タスクの after に登録します。deploy:update_deployed_date というタスクを追加して、web role の、プロジェクトのルートに last_deploy というファイルをtouchします。touch時にファイルのatimeとmtimeが現在時刻に更新されるので、Railsアプリ側からはこのファイルのatimeまたはmtimeを読み取ることで、デプロイ時の日時を取得できます。

config/deploy.rb
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で取得します。

config/initializers/deployed_date.rb
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オブジェクトを参照するコードを書くことになり若干つらいので、ヘルパメソッドに記述します。

app/helpers/application_helper.rb
module ApplicationHelper
  def deploied_at
    begin
      Rails.application.config.deploied_at.strftime("%Y-%m-%d")
    rescue
      nil 
    end 
  end 
end
app/views/layouts/application.html.erb
<p>Deployed on <%= deploied_at %></p>

おわりに

この記事を書いてから調べてわかったのですが、Capistranoの release_name メソッドでリリース日時を "%Y%m%d%H%M%S" で取得できるんですね...

参考

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3