Rastrea despliegues con Rails.app.revision

Rails 8.2 introduce Rails.app.revision, una adición simple pero poderosa para rastrear qué versión de tu código está ejecutándose en producción. Si alguna vez has añadido código personalizado para rastrear commits de git para reportes de errores o claves de caché, esto ahora está integrado.

Qué Cambió

Un nuevo método Rails.app.revision devuelve el identificador del despliegue actual. Por defecto, Rails lo busca en dos lugares:

  1. Un archivo REVISION en la raíz de tu aplicación (comúnmente creado por herramientas de despliegue como Capistrano)
  2. El SHA del commit actual de git si no existe archivo REVISION
Rails.app.revision
# => "3d31d593e6cf0f82fa9bd0338b635af2f30d627b"

Por Qué Esto Importa

Saber exactamente qué código está ejecutándose ayuda con:

  • Reportes de errores: Adjunta la revisión a excepciones para poder rastrear bugs a commits específicos
  • Verificación de despliegues: Confirma que tu último despliegue realmente se aplicó
  • Invalidación de caché: Incluye la revisión en claves de caché para invalidar cachés en despliegue
  • Dashboards de monitoreo: Rastrea métricas de rendimiento por despliegue

Antes de este cambio, escribirías algo como:

# 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

Ahora es simplemente Rails.app.revision.

Cómo Usarlo

Comportamiento por defecto

Si despliegas con Capistrano o herramientas similares que crean un archivo REVISION, simplemente funciona:

Rails.app.revision # lee del archivo REVISION

Si estás en un repositorio git sin archivo REVISION:

Rails.app.revision # devuelve el SHA actual de git

Configuración personalizada

Configúralo explícitamente en config/application.rb:

module MyApp
  class Application < Rails::Application
    # Desde variable de entorno (común en despliegues containerizados)
    config.revision = ENV["GIT_SHA"]

    # O desde un proc para evaluación diferida
    config.revision = -> { File.read("BUILD_ID").strip }
  end
end

Integración con reportes de errores

La revisión se añade automáticamente al contexto del reporter de errores:

Rails.error.report(exception)
# El contexto ahora incluye:
# {
#   rails: {
#     version: "8.2.0",
#     app_revision: "abc123...",
#     environment: "production"
#   }
# }

En claves de caché

def cache_key
  "my_data/#{Rails.app.revision}/#{id}"
end

Cosas a Tener en Cuenta

  • Devuelve nil si no existe archivo REVISION y no estás en un repositorio git
  • El fallback de git solo funciona si el directorio .git está presente (algunas builds de Docker lo excluyen)
  • Para despliegues containerizados, prefiere configurar config.revision = ENV["GIT_SHA"] explícitamente

Conclusión

Rails.app.revision es una pequeña mejora de calidad de vida que estandariza un patrón común. Si ya estás rastreando revisiones manualmente, ahora puedes eliminar ese código y usar el método integrado.

Consulta el commit y PR #56490 para detalles de implementación.