Luego de estar trabajando con Heroku por un par de semanas, hoy voy a compartir algunos algunos consejos útiles.
Suele ser una buena práctica al desarrollar una aplicación, manejar distintos ambientes. En general suelen manejarse al menos 4 ambientes, puede que los nombres varíen, pero en líneas generales podríamos decir:
- Desarrollo, donde se desarrolla aplicación
- Test/integración, ambiente similar de desarrollo donde se ejecutan la pruebas
- Staging, ambiente de prueba lo más parecido posible al de producción donde se realizan las pruebas de aceptación (UAT)
- Producción, ambiente final donde correr la aplicación
Al trabajar con Heroku tendremos
- Desarrollo es la maquina del desarrollador
- Test/integración, es el build server
- Producción ya dijimos que seria heroku, por lo cual
- Staging también debería ser heroku.
Si uno está dispuesto a pagar, heroku nos permite manejar más de un ambiente en la misma aplicación, pero si pretendemos un enfoque gasolero al máximo, entonces tendremos que generar 2 aplicaciones: una representará nuestro ambiente productivo y la otra a nuestro ambiente de staging. Dado que el comportamiento de ciertos componentes puede varias dependiendo de ambiente en que se encuentre, para que nuestra aplicación Heroku de staging se comporte como tal, tendremos que setear la correspondiente variable de entorno utilizando el siguiente comando
heroku config:add RACK_ENV=staging
Esta variable tiene como valor por defecto production y por eso es que no la modificaremos para nuestra aplicación de producción.
Utilizando esta variable podremos definir distintos parametros de configuración para cada uno de nuestros ambientes.
configure :production do
DataMapper::setup(:default, ENV['DATABASE_URL'])
DataMapper.auto_upgrade!
end
configure :staging do
DataMapper::setup(:default, ENV['DATABASE_URL'])
DataMapper.auto_upgrade!
end
configure :development do
DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/mydata.db")
DataMapper::Model.raise_on_save_failure = true
DataMapper.auto_upgrade!
end
configure :test do
DataMapper.setup(:default, "sqlite::memory:")
end
Para poder desplegar nuestra aplicación a los correspondientes ambientes, tendremos que agregar los correspondientes repositorios git remotos. En general uno ya lo tendremos seguramente bajo el nombre heroku, pero para evitar confusiones lo mejor seria removerlo y volver a agregarlo con un nombre mas representativo. Para ello podemos hacer
git remote add production <git-de-la-app-heroku-de-production>
git remote add staging <git-de-la-app-heroku-de-staging>
El hecho de que el despligue a Heroku este basado en git, hace muy simple el versionado de la aplicación y la vuelta atras a una versión anterior. Pero más allá de esto hay un plugin que estoy utilizando llamado Releases. Este plugin ofrece cierta funcionalidad básica en su versión gratuita (como agregar un número amigable de versión a cada despliegue y la posibilidad de hacer un rollback del último despliegue).
Continuará…