Teaser Image
Blog Logo

Javi


7 minutos de lectura

Desde que escribí Octoberry Pi tenía pensado hacer algo para no publicar inmediatamente lo que hubiera escrito y hacerlo a horas menos intempestivas que lo suele ser habitual ya que suelo terminar de escribir de madrugada. La solución pasaba por usar cron pero hasta estas navidades no he terminado de dejarlo listo.

Hace poco migré el blog de Octopress a la ultima versión de Jekyll. Principalmente porque, aunque Octopress es sencillo, creo que viene demasiado cargado de plugins, la organización de las carpetas me parece un poco confusa y además, la versión 3.0 de Octopress no tendrá nada que ver con la actual ya que se transforma en una serie de plugins avanzados para Jekyll así que me pareció conveniente adentrarme en la austeridad del framework original.

Pese al cambio, el montaje no ha variado mucho del descrito en el articulo arriba mencionado. Lo resumo a continuación por si no queréis leerlo:

  1. Carpeta en Dropbox donde están los borradores de los artículos que voy escribiendo y los que están para publicar. Tanto en el iPad como en el iPhone uso Editorial para escribir, maquetar, buscar enlaces, fotos,... En el MacBook Pro, si edito algún artículo, ahora mismo usaría Textmate 2 que es el que tengo más preparado
  2. Raspberry Pi. No tiene gran cosa instalada: ruby con rvm, unas cuantas gemas necesarias para publicar este blog y git para subir los cambios en el proyecto tanto al repositorio de Github que permite que leas esto como al repositorio privado de Bitbucket donde está la chicha que no quiero que se vea... ;-)

La automatización de la publicación la consigo con dos scripts. El primero es una tarea de Rake en el que se indican todos los pasos para publicar el blog:

desc "Publicación automática"
task :publicar do
  puts "\n## Generación del sitio estático con Octopress"
  status = system("jekyll build")
  puts status ? "Todo ha ido bien" : "Algo ha salido mal"
  puts "\n## Despliegue del sitio en Github Pages"
  status = system("octopress deploy")
  puts status ? "Todo ha ido bien" : "Algo ha salido mal"
  puts "\n## Staging modified files"
  status = system("git add -A")
  puts status ? "Todo ha ido bien" : "Algo ha salido mal"
  puts "\n## Committing a site build at #{Time.now.utc}"
  message = "Build site at #{Time.now.utc}"
  status = system("git commit -m \"#{message}\"")
  puts status ? "Todo ha ido bien" : "Algo ha salido mal"
  puts "\n## Pushing commits to remote"
  status = system("git push origin source")
  puts status ? "Todo ha ido bien" : "Algo ha salido mal"
  puts "\n## Publicando tweet de último post escrito"
  Rake::Task[:share_with_twitter].execute
end

La mezcla de castellano e ingles se debe a que me base en un Rakefile que ya tenía parte de lo que yo necesitaba. En general no me gusta traducir lo que han escrito otros en ingles y no me gusta escribir en ingles lo que, normalmente, solo voy a ver yo. Sois libres de criticarme por esto, no me vais a quitar el sueño.

Aunque está clarito lo que hace este script, un poco más de detalle nunca viene mal:

  1. Generación del sitio. Jekyll construye un sitio hmtl completo que guarda en la carpeta _site
  2. Despligue en Github. Un nuevo plugin de Octopress 3.0, Octopress Deploy, hace un push de la carpeta _site a la rama master del repositorio de Github vinculado a Github Pages, que es, por así decirlo, mi hosting.
  3. Commit de los cambios realizados. Siempre, después de publicar en Github Pages hago un commit y subo los cambios al repositorio de Bitbucket. Normalmente, lo único que se añade es el nuevo post y las imágenes que pueda incluir pero a veces realizo modificaciones desde la raspberry.
  4. Publico el tweet de spam. Cada vez que escribo un nuevo artículo, publico un tweet para que la gente que me sigue se pueda enterar. Este tweet contiene un enlace acortado con Karmacracy mediante un plugin de cosecha propia. Es de los poquitos plugins que tiene este blog.

Esta tarea no es exclusiva para la raspberry, la uso también en el Mac cuando publico desde allí.

El script específico de la Raspberry es el que pongo a continuación. Inicialmente hice unos cuantos más pero con esta versión me es suficiente:

#!/usr/bin/env bash

set -e
./Dropbox-Uploader/dropbox_uploader.sh download /drafts/Blog ./drafts/
mv ./drafts/Blog/*.markdown ./blog/_posts
cd blog
/home/pi/.rvm/gems/ruby-2.1.0/bin/rake publicar

Otro script que no es gran cosa:

  1. Descarga de la carpeta de Dropbox donde guardo los post a la Raspberry.
  2. Mueve los ficheros con extensión markdown a la carpeta del blog donde se almacenan. Mis borradores no tienen extensión markdown sino md. Igual esto está un poco cogido con pinzas pero a mi me vale.
  3. Cambia al directorio del blog. Ahora que lo veo, creo que esto no sería necesario. Como no he probado otra cosa, lo dejo. Igual más adelante lo actualizo.
  4. Ejecuta la tarea con rake. He probado de muchas maneras, la única que me ha funcionado es la que, de forma unívoca, dice la versión de rake que debe usar.

Aunque parezca mentira, la automatización ha llevado más tiempo del que podría pensarse. Para empezar no estoy muy familiarizado con el mundo Linux. Tengo una tarea planificada con cron en el Mac, la descarga de los informes de iTunes Connect, lo que no me convierte en ningún experto. Además, cualquiera que haya trabajado con Ruby sabrá el dolor de cabeza que suponen las gemas, las versiones de Ruby y todo lo relacionado. Durante varios días me estuve pegando con esto porque, cuando se ejecutaba la tarea con cron se produción errores que cuando ejecutaba el script a mano no se daban.

Inicialmente, la tarea en cron era así:

30 9 * * * /home/pi/scripts/publicar.sh

Y lo único que veía eran los típicos mensajes diciendo que la versión de la gema fulanita en Ruby patatín no encuentran la dependencia de la gema menganita en Ruby patatán... lógico: patatín y patatán no tendrían que mezclarse.
Después de probar muchas cosas, de buscar mucho en Google y de cargarme la imagen de la Raspberry dos veces encontré las palabrás mágicas en la página de rvm, ese ser tan querido y odiado al mismo tiempo. Decían así:

rvm cron setup

A partir de ese momento, mi crontab quedó así:

#sm start rvm
PATH="/home/pi/.rvm/gems/ruby-2.1.0/bin:/home/pi/.rvm/gems/ruby-2.1.0@global/bin:/home/pi/.rvm/rubies/ruby-2.1.0/bin:/home/pi/.rvm/gems/ruby-2.
1.0/bin:/home/pi/.rvm/gems/ruby-2.1.0@global/bin:/home/pi/.rvm/rubies/ruby-2.1.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/b
in:/usr/local/games:/usr/games:/opt/node/bin:/home/pi/.rvm/bin:/home/pi/.rvm/bin"
GEM_HOME='/home/pi/.rvm/gems/ruby-2.1.0'
GEM_PATH='/home/pi/.rvm/gems/ruby-2.1.0:/home/pi/.rvm/gems/ruby-2.1.0@global'
MY_RUBY_HOME='/home/pi/.rvm/rubies/ruby-2.1.0'
IRBRC='/home/pi/.rvm/rubies/ruby-2.1.0/.irbrc'
#sm end rvm
30 9 * * * /home/pi/scripts/publicar.sh

Al parecer, no es suficiente con tocar los .profile y .bash_profile para que coger la versión buena con rvm si no que es necesario informar al inicio del cron la ruta que tiene que seguir para encontrar la versión correcta. No es lo más bonito del mundo pero desde entonces, a eso de las nueve y media de la mañana, puedes encontrarte artículos recién publicados, como este.

Imagen de cabecera obtenida de re:splashed

Image

Javi Moreno

Puede que no haya ido a donde quería ir, pero creo que he terminado donde tenía que estar.

Ir a la página principal