Rails.app.revisionでデプロイを追跡する

Rails 8.2はRails.app.revisionを導入しました。これは本番環境で実行されているコードのバージョンを追跡するためのシンプルだが強力な追加機能です。エラーレポートやキャッシュキーのためにgitコミットを追跡するカスタムコードを追加したことがある場合、これが組み込みになりました。

変更内容

新しいRails.app.revisionメソッドは現在のデプロイメント識別子を返します。デフォルトでは、Railsは2つの場所を探します:

  1. アプリケーションルートのREVISIONファイル(Capistranoなどのデプロイツールによって一般的に作成される)
  2. 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は一般的なパターンを標準化する小さな品質向上です。すでに手動でリビジョンを追跡している場合、そのコードを削除して組み込みメソッドを使用できるようになりました。

実装の詳細についてはcommitPR #56490を参照してください。