Hacer auto deploy con Bitbucket y GIT IV

En el anterior artículo expresamos nuestra intención de iniciar un proyecto de Comunidad en Genbeta Dev para crear una herramienta simple pero efectiva y que aporte valor desde el primer momento al hacer commits en nuestros repositorios de Bitbucket.

Decidimos que la herramienta sería licenciada bajo la GPL y estaría a disposición de toda la Comunidad. Muy al hilo, nuestro compañero Txema publicaba un artículo donde se trataba como colaborar en proyectos de software libre.

Hoy continuamos con este experimento en Genbeta Dev dando los primeros pasos para generar nuestro proyecto de Software Libre.

El entorno de desarrollo

Lo primero que vamos a preparar es un entorno de desarrollo que no esté contaminado por la configuración o instalación de paquetes de nuestro equipo. Para ello vamos a hacer uso de virtualenv. Virtualenv es una herramienta cuyo objetivo es crear entornos aislados Python.

Crear un entorno aislado es muy sencillo, tan solo tenemos que ejecutar un comando en el terminal:

$ virtualenv --no-site-packages gdeployer

Usamos la opción --no-site-packages para que no se incluya ninguno de los paquetes que tenemos en nuestra instalación global de Python. Una vez se ha generado nuestro entorno, lo activamos ejecutando:

source gdeployer/bin/activate
. Esto activará nuestro entorno aislado (podemos comprobarlo ejecutando type python) y añadirá el nombre del mismo, en este caso gdeployer, a nuestro prompt.

Instalando las dependencias

En nuestro entrono aislado tenemos una copia de nuestro propio intérprete de Python así como de easy_install y pip, yo prefiero utilizar pip porque nos aporta un mayor control de los paquetes que instalamos. Vamos a proceder a instalar las dependencias de nuestro proyecto.

(gdeployer) $ pip install fabric

Esto instalará además un par de dependencias de Fabric que son ssh y pycrypto. Una vez instalado fabric, vamos a instalar twisted:

(gdeployer) $ pip install twisted

Twisted instalará también su dependencia zope.interface que es utilizada para implementar los adaptadores y las interfaces en twisted.

Ya tenemos todas nuestras dependencias instaladas, podemos comprobarlo haciendo un ls a nuestro entorno ls gdeployer/lib/python2.7/site-packages. En tu caso la versión de Python puede ser diferente.

IPython (opcional)

A mi me gusta usar IPython que nos proporciona un ambiente interactivo avanzado con el que podemos reemplazar a la consola de python y a IDLE. ¿Qué que tengo contra IDLE?, nada en absoluto pero si podemos utilizar herramientas más potentes sería una insensatez no hacerlo, ¿no crees?.

Para instalar IPython (también conocido como IP[y]) utilizaremos pip en nuestro entorno aislado:

(gdeployer) $ pip install ipython

Ya tenemos preparado nuestro entorno aislado y podemos empezar a programar nuestra modesta aplicación. Yo voy a utilizar Sublime Text 2 para ello pero el lector puede utilizar eclipse, komodo, TextMate, Kate, KDEVelop, IntelliJ IDEA o lo que le venga en gana por supuesto.

Empezando el proyecto

Lo primero que voy a hacer es crear un directorio que sirva como raiz del proyecto e inicializarlo como repositorio GIT (quizás los usuarios de otros IDEs o editores prefieran hacerlo de otra manera):

(gdeployer) $ cd ~/Desarrollo/Genbetadev
(gdeployer) $ mkdir gdeployer
(gdeployer) $ cd gdeployer
(gdeployer) $ git init 
Initialized empty Git repository in /home/damnwidget/Desarrollo/Genbetadev/gdeployer/.git/

Ahora vamos a añadir al repositorio los archivos AUTHORS (que editaremos más adelante) y LICENSE. El archivo LICENSE vamos a descargarlo de la página de la Free Software Foundation:

(gdeployer) $ wget http://www.gnu.org/licenses/gpl-3.0.txt
(gdeployer) $ mv gpl-3.0.txt LICENSE
(gdeployer) touch AUTHORS

Ya podemos hacer nuestro primer commit en local:

(gdeployer) $ git add .
(gdeployer) $ git commit -m "Initial Commit"
[master (root-commit) ecde43c] Initial Commit
 1 files changed, 674 insertions(+), 0 deletions(-)
 create mode 100644 AUTHORS
 create mode 100644 LICENS

Y llegó el momento de abrir nuestro directorio con nuestro editor de texto / IDE favorito y empezar con el mejunje. En mi caso y como ya sabéis voy a utilizar Sublime Text 2 así que lo único que tengo que hacer es abrir el directorio que acabamos de crear y usar la acción Save Project As... del menú Project.

Como estoy usando ST2 voy a hacer uso del plugin SublimeRope (si usas ST2, programas en Python y no sabes lo que es SublimeRope, te recomiendo que le eches un ojo al post donde hablamos de él anteriormente en Genbetadev) y crear un nuevo proyecto Rope desde la paleta de comandos.

Al hacerlo, Rope me solicita tanto el directorio donde crear el subdirectorio .ropeproject así como (y esto es muy importante) el directorio del virtualenv que queremos utilizar, en mi caso añado la ruta completa a nuestro virtualenv gdeployer.

Al definir el virtualenv, SublimeRope utilizará nuestra instalación de Python aislada en lugar de la instalación del sistema y además lo hará de forma correcta desde el primer momento. Después me preguntan por qué hablo de ST2 y por qué lo uso, pues por pequeños detalles como este.

Los usuarios de PyDev en Eclipse pueden seguir estos pasos y estos otros los de IntelliJ IDEA. Para otros IDEs consultar en Google.

Crear el proyecto (con cualquier IDE o editor que usemos) nos va a generar archivos de configuración de proyecto o subdirectorios. En mi caso me ha generado dos archivos para el proyecto de ST2 gdeployer.sublime-project y geployer.sublime-workspace y un subdirectorio para el de Rope .ropeproject. Voy a decirle a GIT que los ignore añadiéndolos al archivo .gitignore, de esta manera, no obligamos a los developers a usar un IDE o arquitectura específica.

Yo suelo añadir el propio archivo .gitignore al gitignore, así los detalles de mi entorno de desarrollo quedan ocultos a otros desarrolladores. Aprovecho y añado a los sospechosos habituales (*.pyc, _trial_temp/, etc).

Subir el proyecto a Bitbucket

Vamos a subir el proyecto a Bitbucket aprovechando un cambio al archivo AUTHORS, este archivo contendrá los nombres y correos de todas las personas que aporten algo al proyecto, de momento, su contenido es el que sigue:

GDeployer is a Genbetadev Community Project https://www.genbetadev.com
See LICENSE for details
GDeployer members are (and/or has been)
    Developers
        * Oscar Campos 
    Bugs reports, Testing and Documentation
        * ...

He creado un repositorio público en Bitbucket y ahora necesito vincularlo a nuestro repositorio y hacer el push inicial:

(gdeployer) $ git remote add origin ssh://git@bitbucket.org/damnwidget/gdeployer.git
(gdeployer) $ git commit -a -m "Added people to AUTHORS file"
(gdeployer) $ git push -u origin master

Ya tenemos el repositorio listo para forkear, de momento vamos a dejarlo aquí hasta el próximo post donde definiremos la metodología de desarrollo que vamos a seguir y unas reglas básicas de contribución de código y de estilo.

La URL del repositorio es: https://bitbucket.org/damnwidget/gdeployer/overview y tenemos un remote enlazado y actualizado permanentemente también en GitHub.

Happy Hacking!.

Más en Genbeta Dev | Hacer Autodeploy con Bitbucket y GIT

Portada de Genbeta