miércoles, 6 de agosto de 2014

Auto-deploy con github y NodeJS

nodejs

Hace unos días estaba creando una aplicación en Velneo para actualizar otras aplicaciones utilizando GitHub como repositorio para mi fuente y me comentaron acerca de los auto-deploy con GitHub como una funcionalidad para mi aplicación así que me di a la tarea de investigar un poco cuales eran las mejores opciones para hacer funcional esta idea.


Luego de leer mucho, probar y demás... utilizando php, ruby, python, me decidí por NodeJS, ya que tiene una facilidad increible para crear "webserver's" sencillos, asi que es sumamente fácil poner en práctica un auto-deploy con github y sus webhooks utilizando alguna librería. Comenzaré entonces explicando paso a paso como lograr esto.


Debes tener en cuenta que para lograr esto, la máquina o servidor donde deseas hacer el auto-deploy debe tener una ip pública o algún dns para que por medio de los webhooks reciba la petición.


Cual es el funcionamiento de los webhooks? Bueno, cuando hacemos un push a un repositorio en github, este enviará una petición POST a la URL que hayamos configurado. Esta URL se especifica en la configuración del repositorio. Esta petición POST incluira una variable "payload" con información del ultimo commit del repositorio.


Luego de esto entonces nosotros nos encargaremos de ejecutar cualquier acción que deseemos al recibir esta petición, ya sea utilizando NodeJS directamente o algún script .sh


Bueno, comenzaremos con cumplir los requerimientos básicos, aquí probaremos con un servidor Centos, así que comenzaremos con instalar NodeJS y NPM



yum install nodejs npm -y

Con esto instalamos directamente los dos paquetes, y con "-y" aceptamos directamente y así no nos pide confirmación.


Luego tenemos que movernos a la carpeta donde crearemos nuestro script, en este caso la crearemos y nos moveremos dentro para instalar gith, que usaremos para escuchar y recibir el payload.



# Creamos la carpeta
mkdir nodeapp
# Nos movemos a la carpeta creada
cd nodeapp
# Instalamos gith en esta carpeta
npm install gith
# Abrimos un archivo para el contenido de nuestro script
nano script.js

ya que tenemos instalado gith, procedemos a crear nuestro script JS



// Escuchamos en el puerto que deseemos
var gith = require('gith').create( 9001 );
// Importamos execFile, para correr nuestro script de bash
var execFile = require('child_process').execFile;
// Usamos gith
gith({
// Repositorio
repo: 'xploshioOn/autodeploy'
// Le decimos que se ejecute esto cuando se agreguen, eliminen o modifiquen archivos
}).on( 'file:all', function( payload ) {
// Si la rama es la master
if( payload.branch === 'master' )
{
// Ejecutamos nuestro script
execFile('/nodeapp/script.sh', function(error, stdout, stderr) {
// Finalizó sin problemas
console.log( 'script completado' );
});
}
});

Comento la mayoría de las lineas para un mejor entendimiento de este.


Igualmente dejo un enlace a Gith para que puedan tener información completa de la librería.


Luego procedemos a jugar con nuestro script shell



nano /nodeapp/script.sh

#!/bin/bash
# Inicializamos git
git init
# Hacemos pull del repositorio
git pull

Esto teniendo en cuenta que nuestro repositorio haya sido clonado directamente y ya tenga el remote.origin.url bien...


Teniendo esta estructura, podemos agregar mas lineas a nuestro script JS o sh para ejecutar las acciones que creamos convenientes cada vez que se actualice nuestro repositorio en github o se haga un push.


Ahora luego de configurar el webhook en nuestro repositorio a http://nuestroservidor.com:9001, ya tenemos nuestro script que escucha, github que nos enviará una petición y al recibir ejecutará nuestro sh, solo nos queda una cosa por hacer, necesitamos que el script js se ejecute automatcamente y esté escuchando siempre. para eso utilizamos forever.



# Instalar forever globalmente 
sudo npm install -g forever
# Inicializamos nuestro script
forever start /nodeapp/script.js

puedes detenerlo con stop apuntando a la misma ruta o ver todos los scripts levantados con list.


En mi aplicación envío correos, para lo cual utilicé nodemailer en mi script node, e igualmente agregué un par de cosillas mas a mi script sh...


Espero les sirva y pues cualquier duda, o algún funcionamiento mas que necesiten, no duden en comentar.


Saludos.

No hay comentarios:

Publicar un comentario