Hacer auto deploy con Bitbucket y Git

Bitbucket es un conocido hosting de repositorios para los sistemas de control de versiones distribuidos (DVCS del Inglés Distributed Version Control System) Git y Mercurial desarrollado y mantenido por la compañía australiana Atlassian.

Los repositorios creados en Bitbucket, disponen de seguimiento de tickets además de una wiki así como integración con diferentes servicios de terceros como Jenkins para integración continua de proyectos Java o Basecamp de 37Signals.

Uno de esos servicios es el POST Service que nos permite enviar una petición POST a un servicio web cuando hacemos push a uno de nuestros repositorios con un objeto JSON que contiene información sobre nuestro repositorio y los cambios realizados al mismo.

Para ejemplificar como realizar el auto deployment de nuestro código, vamos a crear un sencillo servidor web con Twisted al que haremos auto deploy cuando hagamos push además de pasar una simple batería de tests unitarios.

Pre requisitos

Se da por hecho que el lector conoce Git y Bitbucket (o Github) y que dispone de un servidor remoto al que puede acceder mediante SSH y donde puede ejecutar comandos, para este artículo se usa una instalación de GNU/Gentoo Linux de 64 bits en un servidor dedicado.

Crear un nuevo repositorio en Bitbucket

Lo primero que tenemos que hacer es crear un nuevo repositorio en Bitbucket, obviamente, si no tenemos cuenta debemos de crear una, es gratis. Voy a crear un repositorio con la siguiente configuración para nuestro ejemplo:

Name: DeployTest
Desmarco Private para hacer el repositorio público
Tipo de repositorio: Git (podríamos elegir Mercurial también)
En lenguaje selecciono Python
En descripción añado: Proyecto con despliegue automático para ejemplo en GenbetaDev
Y como web del proyecto: https://www.genbetadev.com

Hago click en "Create Repository" y Bitbucket crea un nuevo repositorio Git vacío para mi proyecto, ahora solo tengo que clonar el repositorio y añadir mi código en él, para ello hago uso de Git mediante la consola:

~/Desarrollo/bitbucket % git clone git@bitbucket.org:damnwidget/deploytest.git
Cloning into deploytest...
warning: You appear to have cloned an empty repository.

Ya tenemos el repositorio clonado, ahora añadamos algo de código.

Escribir nuestro código y hacer el primer push

Nuestra aplicación va a ser muy sencilla, el código necesario para la misma va a ser muy escueto. Para empezar vamos a utilizar el mismo código que hay en la página principal de Twisted:

#!/usr/bin/env python
from twisted.web import server, resource
from twisted.internet import reactor
class HelloResource(resource.Resource):
    isLeaf = True
    numberRequests = 0    
    def render_GET(self, request):
        self.numberRequests += 1
        request.setHeader("content-type", "text/plain")
        return "I am request #" + str(self.numberRequests) + "\n"
reactor.listenTCP(8080, server.Site(HelloResource()))
reactor.run()

Con este código ya podemos ir haciendo pruebas de nuestro servicio de auto deploy. Antes de nada, vamos a hacer un push de nuestro primer cambio:

$ ~/Desarrollo/bitbucket/deploytest (master*) % git add webservice.py  
$ ~/Desarrollo/bitbucket/deploytest (master*) % git commit -m "Initial Commit"
$ ~/Desarrollo/bitbucket/deploytest (master) % git push origin master
...
 * [new branch]      master -> master

Hemos utilizado el nombre "webservice.py para nuestro archivo y al ser el primer push al repositorio hemos utilizado nombre de remote y branch en el push. Ahora vamos a preparar nuestro servicio POST y a comprobar que envía la información adecuada utilizando para ello PostBin.

POST Service

PostBin es un servicio gratuito utilizado para capturar parámetros POST en formato JSON y traducirlos a un formato que puede ser utilizado para escribir tests y emular los datos recibidos por servicios externos.

Lo primero que vamos a hacer es click en el botón "Create" de PostBin y vamos a copiar la URL que nos arroja como resultado. Ahora nos dirigimos a la configuración de administración de nuestro repositorio Bitbucket y en la pestaña "Services" seleccionamos "POST" del desplegable y hacemos click en "Add Service" como vemos en la imagen.

Nos aparecerá un input box donde pegaremos la URL que nos hemos copiado de PostBin y hacemos click en "Save Settings".

Ahora podremos hacer tests de nuestro POST Service para comprobar que efectivamente funciona como se espera.

Comprobando el Hook

Para comprobar que el Hook se comporta como se espera vamos a crear el archivo README y vamos a añadirlo al repositorio para que éste lance nuestro POST Service a la URL del PostBin:

$ ~/Desarrollo/bitbucket/deploytest (master*) % git commit -m "Added README file to test WebHook"
$ ~/Desarrollo/bitbucket/deploytest (master*) % git push 
...
   315b4c2..35d4b6d  master -> master

Ahora podemos dirigir nuestro navegador a la URL que nos devolvió PostBin para comprobar los datos enviados por Bitbucket

Como podemos comprobar, toda la información relevante del commit está incuida en la información que envía Bitbucket a nuestro falso servicio POST.

Hasta aquí la primera parte de este tutorial de autodeployment con Bitbucket y Git, en el próximo post crearemos un servicio web real que capture esta información y pase una batería de tests antes de hacer deploy de la nueva versión en el repositorio.

Hasta entonces, happy hacking!.

Más en Genbetadev | Hacer auto deploy con Bitbucket y Git (parte 2), Sistemas de Control de Versiones

Portada de Genbeta