¿Qué es Heroku?
Heroku es una plataforma como servicio (PaaS) en la nube, que nos permite arrancar un entorno de desarrollo para el lenguaje que queramos, de un modo transparente, y sin tener que perder tiempo por nuestra parte en configurar nada en nuestro sistema local. Podríamos decir que es un entorno de desarrollo "llave en mano". Al crear una aplicación en Heroku, éste nos ofrece un entorno sobre Debian, preparado ya para programar con ruby, php, java, node, o el lenguaje que necesitemos.
Nos ofrece también un repositorio Git, donde alojar nuestros fuentes. Cada vez que hagamos un push, Heroku compilará nuestro proyecto, y un servidor web al que podremos acceder para ver nuestra aplicación online: http://nuestraapp.herokuapp.com/
Para este pequeño "manual", voy a suponer que ya estás familiarizado con el desarrollo de aplicaciones con Grunt, Less, Jade, etc. Por tanto, entiendo que tu aplicación ya tiene un archivo package.json. Lo que voy a explicar aquí, es cómo modificarla para poder hacer deploys en Heroku, desde Cloud9:
Instalar el motor Node
Para que Node funcione correctamente en Heroku, debemos especificar en package.json que vamos a usar Node.js junto con su versión: algo que no era necesario para compilar en local, pero sí lo es en Heroku. Para ello, debemos añadir la propiedad "engines" a nuestro package.json:
"engines": { "node": "0.10.x" }
No es necesario especificar que necesitaremos npm, ni su versión, ya que npm viene en el lote del motor Node.
Instalar Express, Grunt y Bower en nuestra app de Heroku
Por defecto, cuando compilamos una aplicación en Heroku, ésta se compila en modo producción, por lo tanto, lo que pongamos en "devDependencies" de nuestro package.json será ignorado. Llegados a este punto podemos hacer dos cosas:
- o cambiamos el entorno a modo desarrollo, de tal modo que se instalen las dependencias definidas en "devDependencies",
- o especificamos en "dependencies" las dependencias para producción.
Personalmente prefiero esta última opción, es decir, usar el entorno de producción en Heroku. Por tanto, copiamos los paquetes de "devDependencies" a "dependencies", y además, le añadimos también algunos paquetes que por defecto en Heroku no están instalados: express, bower, grunt y grunt-cli. Nuestro package.json quedaría así (por ejemplo):
"dependencies": { "express": "~3.3.4", "bower": "latest", "grunt": "latest", "grunt-cli": "latest", ... resto de paquetes ... }, "devDependencies": { "grunt": "latest", ... resto de paquetes ... }
Ejecutar Bower install en Heroku
Si en nuestra app hemos usado Bower, necesitaremos ejecutar el comando 'bower install' para instalar los repositorios al compilar. Para ello, añadimos la instrucción al bloque "scripts" en package.json:
"scripts": { "postinstall": "./node_modules/bower/bin/bower install" }
Crear el servidor de archivos estáticos
Imaginemos que nuestra app tiene la siguiente estructura:
/app --> Archivos fuente |--/fonts |--/img |--/jade |--/js |--/less \--/test /dev --> Compilación de desarrollo |--/css |--/fonts |--/html |--/img |--/js \--/test /pro --> Compilación de producción (concatenada, minificada y ofuscada) |--/css |--/fonts |--/html |--/img |--/js \--/test
Por defecto, Heroku no nos crea un servidor HTTP. Debemos crearlo nosotros con Node. Para ello nos creamos un archivo javascript al que llamaremos por ejemplo "web.js".
Suponiendo que hemos configurado nuestra app, para que compile los estáticos en la carpeta /dev, y dentro de ella nuestro archivo index se encuentra en html/index.html, este sería nuestro archivo "web.js" para arrancar un servidor de estáticos en Heroku:
web.js
var express = require("express"), app = express.createServer(), port = process.env.PORT || 3000; process.env.PWD = process.cwd(); app.configure(function(){ app.use(express.static(process.env.PWD + '/dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); //Error Handling app.use(express.logger()); app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); app.use(app.router); }); app.get('/', function(req, res){ res.redirect("html/index.html"); res.render("index.html"); }); app.listen(port, function() { console.log("Listening on " + port + "\nDirectory: " + process.env.PWD + "/dev"); });
Ahora nos falta decirle a Heroku que ejecute dicho archivo. Para ello debemos crearnos un archivo llamado Procfile. Esto lo explico en el siguiente apartado.
Crear el archivo Procfile
Una vez configurado correctamente package.json, nos creamos un archivo nuevo llamado Procfile, en el que indicamos a Heroku lo que ejecutar al realizar el deploy. Es aquí debemos decirle a Heroku que arranque el servidor web, para que sirva los archivos estáticos generados previamente con grunt. Este sería nuestro Procfile:
web: node web.js
Instalar cliente Heroku en Cloud9
Para poder ejecutar comandos de Heroku, y manejar nuestro entorno desde la terminal de Cloud9, necesitamos instalar el cliente. Para ello escribimos, en el terminal de Cloud9:
wget http://assets.heroku.com/heroku-client/heroku-client.tgz tar xzfv heroku-client.tgz cd heroku-client/bin PATH=$PATH:$PWD
Acceso al bash de Heroku desde Cloud9
Una vez instalado el cliente, desde el terminal de Cloud9 tendremos acceso al bash Heroku. Para ello abrimos un terminal de Cloud9, y escribimos:
heroku run bash -a nombre-de-nuestra-app
Configuramos el Buildpack
Cuando hacemos un git push a nuestro repositorio de Heroku, éste prepara los archivos para ser compilados. El conjunto de acciones que se realizan para compliar, se define en un Buildpack. Heroku dispone de varios Buildpacks, dependiendo del lenguaje y lo que queramos hacer. Sin embargo en este caso, necesitamos un BUILDPACK "no oficial", para que de soporte a Grunt. Para instalar dicho buildpack, escribimos en el terminal:
heroku config:add BUILDPACK_URL=https://github.com/mbuchetics/heroku-buildpack-nodejs-grunt.git -a nombre-de-nuestra-app
En este momento se compilarán nuestros archivos, tal y como lo hubiéramos compilado en Gruntfile.js, y tendremos acceso a ellos desde el servidor web de estáticos, en la URL: http://nombredenuestraapp.herokuapp.com
Añadir deploy en Cloud9
En este apartado veremos cómo lanzar un deploy desde Cloud9:
Después elegimos el servicio Heroku.com:
Configurar el entorno a "development" (opcional)
Este paso es opcional, y explica cómo proceder si quisiéramos cambiar el entorno a desarrollo, en vez de producción que es como lo tiene Heroku por defecto. Desde la terminal de Cloud9 escribimos:
heroku config:set NODE_ENV=development -a nombre-de-nuestra-app heroku labs:enable user-env-compile -a nombre-de-nuestra-app
No hay comentarios :
Publicar un comentario