Rails.app.revisionでデプロイを追跡する
Rails 8.2はRails.app.revisionを導入しました。これは本番環境で実行されているコードのバージョンを追跡するためのシンプルだが強力な追加機能です。エラーレポートやキャッシュキーのためにgitコミットを追跡するカスタムコードを追加したことがある場合、これが組み込みになりました。
変更内容
新しいRails.app.revisionメソッドは現在のデプロイメント識別子を返します。デフォルトでは、Railsは2つの場所を探します:
- アプリケーションルートの
REVISIONファイル(Capistranoなどのデプロイツールによって一般的に作成される) - REVISIONファイルが存在しない場合は現在のgitコミットSHA
Rails.app.revision
# => "3d31d593e6cf0f82fa9bd0338b635af2f30d627b"
なぜこれが重要か
実行されているコードを正確に知ることは以下に役立ちます:
- エラーレポート: 例外にリビジョンを添付して、バグを特定のコミットに追跡できる
- デプロイ検証: 最新のデプロイが実際に適用されたことを確認
- キャッシュ無効化: キャッシュキーにリビジョンを含めてデプロイ時にキャッシュを無効化
- モニタリングダッシュボード: デプロイメントごとのパフォーマンスメトリクスを追跡
この変更前は、次のようなコードを書いていました:
# config/initializers/revision.rb
REVISION = if File.exist?(Rails.root.join("REVISION"))
File.read(Rails.root.join("REVISION")).strip
else
`git rev-parse HEAD`.strip
end
今は単にRails.app.revisionです。
使い方
デフォルトの動作
REVISIONファイルを作成するCapistranoなどのツールでデプロイする場合、そのまま動作します:
Rails.app.revision # REVISIONファイルから読み取り
REVISIONファイルのないgitリポジトリにいる場合:
Rails.app.revision # 現在のgit SHAを返す
カスタム設定
config/application.rbで明示的に設定:
module MyApp
class Application < Rails::Application
# 環境変数から(コンテナ化されたデプロイメントで一般的)
config.revision = ENV["GIT_SHA"]
# または遅延評価のためのprocから
config.revision = -> { File.read("BUILD_ID").strip }
end
end
エラーレポートとの統合
リビジョンはエラーレポーターのコンテキストに自動的に追加されます:
Rails.error.report(exception)
# コンテキストには以下が含まれる:
# {
# rails: {
# version: "8.2.0",
# app_revision: "abc123...",
# environment: "production"
# }
# }
キャッシュキーで
def cache_key
"my_data/#{Rails.app.revision}/#{id}"
end
注意点
- REVISIONファイルが存在せず、gitリポジトリにいない場合は
nilを返す - gitフォールバックは
.gitディレクトリが存在する場合にのみ機能する(一部のDockerビルドではこれを除外) - コンテナ化されたデプロイメントでは、
config.revision = ENV["GIT_SHA"]を明示的に設定することを推奨
まとめ
Rails.app.revisionは一般的なパターンを標準化する小さな品質向上です。すでに手動でリビジョンを追跡している場合、そのコードを削除して組み込みメソッドを使用できるようになりました。