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:

  1. variable $date con la fecha y hora actuales
  2. realizamos un export del repositorio en la carpeta releases/$date
  3. eliminamos el antiguo current y enlazamos a la última versión
  4. indiicamos todos los enlaces simbólicos de los datos compartidos
  5. reiniciamos nuestros FastCGIs

En el próximo post sí que será ya una solución Capistrano.