Gestion de Liberaciones, Despliegue y Entregas - Giratina-Votacion/decide GitHub Wiki

Gestión de liberaciones y entregas

Para las liberaciones y entregas del proyecto, seguimos el esquema de milestones que nos da la asignatura, marcando así cuatro fechas importantes:

  1. M0: Inscripción de los grupos
  • V 18 Oct
  1. M1: Sistema funcionando con incremento
  • L 21 Oct
  1. M2: Taller de automatización
  • Semana del 16 de Diciembre
  1. M3: Entrega y defensa de proyectos
  • Lunes 13 de Enero
  1. M4: Mejoras
  • 31 Enero

Para cada una de esos milestones, se preparará una versión del proyecto, correctamente anotada para identificarla.

Nombrado de los entregables

Para nombrar los entregables, usamos el siguiente esquema:

vX.Y.Z-DDMMYY

Donde:

  • DD representa el día de la entrega
  • MM representa el mes de la entrega
  • X representa la siguiente versión funcional del proyecto
  • Y y Z representan las versiones que hayan podido hacerse de la release

Creación automática de releases con Travis CI

Podemos configuar Travis CI para que nos publique automáticamente un nuevo release cuando se haga un commit correcto a master. Un segmento de ejemplo del archivo .travis.yml que necesitaríamos es:

- python-codacy-coverage -r coverage.xml #Ejecutar los tests para asegurarse de que no hay errores
- if [ $TRAVIS_BRANCH == master ](/Giratina-Votacion/decide/wiki/-$TRAVIS_BRANCH-==-master-); then git archive --format zip --output ./decide_release.zip master; fi
before_deploy:
- git tag $RELEASE_NAME
deploy:
  provider: releases
  api_key: 
    secure: $TRAVIS_RELEASE_TOKEN
  file: decide_release.zip
  skip_cleanup: true
  on:
    branch: master

En este archivo, encontramos una serie de variables:

  • $TRAVIS_BRANCH: La rama que en la que se está ejecutando el build de Travis.
  • $RELEASE_NAME: Es una variable establecida por el equipo de desarrollo, para dar nombre a la release siguiendo la nomenclatura vista anteriormente.
  • $TRAVIS_RELEASE_TOKEN: Esta es una variable necesaria para que Travis pueda realizar el release utilizando nuestro usuario de GitHub, y debemos crearla desde dicho portal. Debemos crear este token mediante la herramienta de GitHub para gestionarlos.

Así, el código anterior prepararía un .zip con el código de la release en caso de que se encontrara en la rama master, y le añadiria el tag que hayamos definido en la configuración de Travis. Luego, con la sentencia deploy, desplegaría la release en GitHub bajo nuestro nombre, pues al tener el token de acceso tiene permiso para hacerlo.

Gestión de despliegue

Para el despliegue, tenemos diferentes opciones: Despliegue en local, despliegue con Docker y despliegue en Heroku.

Despliegue en local

Es posible desplegar Decide de forma local, utilizando un entorno virtual. Para ello, se puede usar un entorno virtual propio o puede usarse el entorno virtual que se incluye en el repositorio de Decide.

Configurar el entorno virtual

Configurar el entorno virtual es muy simple: Sólo tendremos que, desde la carpeta raíz del proyecto:

cd decide/myvirtual/bin

source activate

Así, entraremos en nuestro entorno virtual. (NOTA: Si se ha creado un entorno virtual propio, usando python3 -m venv env, la ruta a seguir cambiará). Una vez dentro del entorno virtual, es necesario instalar las dependencias del proyecto decide. Para ello, debemos hacer, suponiendo de nuevo que nos encontramos en la carpeta raíz:

pip3 install -r requirements.txt

Esto instalará las dependencias del proyecto, y ya podremos proceder a ejecutarlo siguiendo el siguiente bloque de instrucciones:

cd decide

python3 ./manage.py makemigrations

python3 ./manage.py migrate

python3 ./manage.py createsuperuser

Con este comando crearemos el usuario administrador con el que podremos acceder al sistema. Para ejecutarlo, sólo queda por hacer: python3 ./manage.py runserver

Opcional: Ejecutar python3 ./manage.py test para comprobar que todas las pruebas pasan correctamente.

Una vez ejecutados todos los comandos anteriores, podremos acceder a http://localhost:8000/admin, introducir las credenciales que creamos con el comando createsuperuser, y empezar a utilizar el sistema.

Despliegue con Docker

¿Qué es Docker?

Docker es una tecnología de contenedores que permitirá ejecutar decide mediante el uso de contenedores e imágenes, lo que nos proporciona automatización en el despliegue y una capa de abstracción extra del sistema que usemos.

Configuración de Docker: Dockerfile

En el dockerfile encontramos las instrucciones que Docker ejecutará a la hora de montar y desplegar nuestro proyecto. Este es el dockerfile que encontramos en nuestro proyecto:

 from python:3.7-alpine
 RUN apk add --no-cache git postgresql-dev gcc libc-dev
 RUN apk add --no-cache gcc g++ make libffi-dev python3-dev build-base
 
 RUN pip install gunicorn
 RUN pip install psycopg2
 RUN pip install ipdb
 RUN pip install ipython
 
 WORKDIR /app
 RUN git clone https://github.com/wadobo/decide.git .
 RUN pip install -r requirements.txt
 
 WORKDIR /app/decide
 # local settings.py
 ADD docker-settings.py /app/decide/local_settings.py

 RUN ./manage.py collectstatic

 #CMD ["gunicorn", "-w 5", "decide.wsgi", "--timeout=500", "-b 0.0.0.0:5000"]

Como desplegar en Docker

Docker es muy sencillo de configurar. En primer lugar, debemos instalarlo, si no lo tenemos ya: sudo apt instal docker.io (Nota: En caso de que ocurra cualquier problema con Docker o docker-compose durante su instalación o ejecución, recomendamos encarecidamente consultar la documentación de Docker).

Una vez tengamos Docker instalado, podemos proceder a desplegar decide. En primer lugar, si ya se ha desplegado decide anteriormente usando docker, es importante retirar las imágenes y contenedores anteriores, para evitar problemas.

Para desplegar decide en Docker, debemos ejecutar los siguientes comandos (asumiendo el directorio raíz de decide como el actual):

cd docker docker-compose up -d docker exec -ti decide_web ./manage.py createsuperuser Con esto, habremos desplegado el sistema en docker, y habremos creado un usuario administrador con el que acceder a Decide, si accedemos a http://10.5.0.1:8000/admin.

###Otras opciones con Docker

Lanzar la consola de django:

$ docker exec -ti decide_web ./manage.py shell

Ejecutar los tests:

$ docker exec -ti decide_web ./manage.py test

Lanzar una consola de la base de datos SQL:

$ docker exec -ti decide_db ash -c "su - postgres -c 'psql postgres'"

Nota: En nuestro proyecto, se incluye un script que permite desplegar automáticamente cualquier rama en Docker al ejecutarlo. Puede ver más información sobre este script en su correspondiente sección en Gestión de la construcción e integración contínua

##Despliegue con Heroku

¿Qué es Heroku?

Heroku es una plataforma como servicio (PaaS) que nos permite construir y operar con nuestras operaciones directamente en la nube. Además, puede funcionar de manera conjunta a Travis CI para asegurar una integración contínua completa: Al desplegar en nuestro repositorio, Travis empezará a analizar el build asociado, y si es correcto mandará a Heroku el despliegue de la aplicación.

Como configurar Heroku

Primero, vamos a ver cómo configurar heroku sin la integración con Travis.

Paso 1. Crear la aplicación

Lo primero es crear la aplicación en la que desplegaremos nuestro sistema. Esto podemos hacerlo directamente desde la consola de comandos, haciendo:

cd ruta_de_nuestro_repositorio

heroku create "nombre_deseado"

Con esto, previo inicio de sesión en Heroku, se nos creará una aplicación con el nombre que hayamos escogido, y se asociará automáticamente a nuestro repositorio.

Paso 2. Procfile

Heroku necesita un Procfile para funcionar. En este archivo, se pueden definir muchas cosas, como el servidor web de la aplicación, cosas que ejecutar antes del despliegue de la misma... A continuación, vemos un ejemplo de Procfile: image

Paso 3. Desplegar Decide

Una vez hechos los pasos anteriores, desplegar en Heroku es tan fácil como ejecutar:

git push heroku master

Y con este comando se desplegará, desde la rama master de nuestro proyecto, la aplicación. NOTA: Si quisieramos desplegar desde otra rama distinta de nuestro repositorio, podríamos hacerlo usando:

git push heroku rama_distinta:master

Paso 4. Terminar configuración de Decide

Una vez tengamos desplegado decide en Heroku, observaremos que no tenemos ninguna cuenta de administrador, por lo que no podremos loguearnos dentro del sistema. Para solucionar esto, es necesario crear una, y podemos hacer eso mismo desde la consola de comandos, accediendo a:

$ heroku run -a nombre-app bash

$ ./decide/manage makemigrations

$ ./decide/manage migrate

$ ./decide/manage createsuperuser

Con esto, accederemos a la consola de la aplicación y crearemos un superusuario que nos permitirá ejecutar nuestra labor de administrador correctamente.

Integración con Travis.

Para integrar Travis y Heroku, es necesario realizar una serie de cambios, tanto en nuestro .travis.yml como en el archivo settings.py encontrado dentro de ./decide/decide.

Archivo .travis.yml

En este archivo necesitaremos añadir, como mínimo, el nombre de nuestra aplicación en Heroku, el proveedor del servicio de despliegue (heroku), la estrategia a seguir (Git), y una api key que conectará las dos aplicaciones. A continuación, un ejemplo de un archivo .travis.yml:

image

Además de lo anteriormente mencionado, el apartado On: Branch: permite seleccionar qué ramas son las que, al tener un build válido, deben ser desplegadas en Heroku. NOTA: La api key se añade automáticamente al archivo .travis.yml si ejecutamos el siguiente comando: travis encrypt $(heroku auth:token) --add deploy.api_key (Primero debemos haber creado la aplicación Heroku, para ello, podemos seguir los pasos que vimos anteriormente en la guía de despliegue sin integración con Travis).

Archivo settings.py

En este archivo, será necesario ejecutar varios cambios, que citamos a continuación (los cambios han sido sacados de nuestro commit para permitir la integración entre Travis y Heroku): image

Archivo travis_local_settings.py

Necesitaremos, por último, crear este archivo. Como base, podemos usar el archivo local_settings.py, encontrado dentro de ./decide.

Una vez hayamos efectuado estos cambios, tan sólo debemos hacer un commit con los cambios y subirlos al repositorio, y dejar que Travis haga el resto. Una vez el despliegue se haya ejecutado correctamente, debemos remitirnos al paso 4 de la guía de Heroku sin integración con Travis para terminar de configurar Decide.