Un Capistrano de andar por casa
Recientemente he desarrollado una pequeña aplicación web en Rails que he alojado en Dreamhost. Antes de lanzarme a utilizar Capistrano para actualizar el código utilicé un pequeño script de bash, ejecutándolo desde la propia máquina de Dreamhost.
Antes de mostrarlo, me gustaría comentar un par de asuntos.
Compartiendo datos releases
Imaginad que tenéis una carpeta en donde los usuarios suben ficheros. O queréis que el diseñador, que tiene conocimientos nulos de Subversion, pueda retocar la hoja de estilos sin que os tenga que avisar cada vez que hace una modificación para que subáis una nueva release.
A estas situaciones me refiero cuando hablo de compartir datos entre releases.
Una solución, que no la única, es crearse una carpeta shared, con los contenidos que queramos compartir en subcarpetas suyas.
Así, simplemente las versiones funcionales tendrán enlaces simbólicos a los datos compartidos en el directorio.
Por ejemplo: si tenemos la carpeta public/stylesheets y la queremos compartir, crearemos en el shared una carpeta shared/stylesheets y haremos un enlace simbólico de public/stylesheets a ésta.
La filosofía es muy sencilla.
Activación del entorno de producción
En Dreamhost no hay spawners ejecutando los FastCGIs, sino que estos se ejecutan tal y como vienen. Es decir, si queremos activar el modo production no hay más remedio que hacerlo en el config/environment.rb de nuestra aplicación.
Pero, claro, en local queremos modo desarrollo. Y además, no queremos que cada vez que subamos una nueva versión tengamos que modificar el config/environment.rb para descomentar la línea # ENV['RAILS_ENV'] ||= 'production'.
Así que lo que se puede hacer es dejarla descomentada y ejecutar el servidor local en modo desarrollo. Eso es tan fácil como indicar un parámetro adicional.
Tanto Mongrel como Webrick aceptan un parámetro -e con el nombre del entorno: mongral_rails start -e development
El script de andar por casa
El script es algo así:
#!/bin/bash
date=`date -u +%Y%m%d%H%M00`
svn export http://repository.url/app --force releases/$date
rm current
ln -s `pwd`/releases/$date current
ln -s /home/user/app/shared/curriculumns current/public/curriculums
ln -s /home/user/app/shared/stylesheets current/public/stylesheets
ln -s /home/user/app/shared/vendor current/vendor
touch current/public/dispatch.fcgi
Simplemente:
- variable
$datecon la fecha y hora actuales - realizamos un export del repositorio en la carpeta
releases/$date - eliminamos el antiguo current y enlazamos a la última versión
- indiicamos todos los enlaces simbólicos de los datos compartidos
- reiniciamos nuestros
FastCGIs
En el próximo post sí que será ya una solución Capistrano.
