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:
- M0: Inscripción de los grupos
- V 18 Oct
- M1: Sistema funcionando con incremento
- L 21 Oct
- M2: Taller de automatización
- Semana del 16 de Diciembre
- M3: Entrega y defensa de proyectos
- Lunes 13 de Enero
- 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:
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:
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):
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.