##Índice
- Proyecto elegido y breve descripción
- Servicios necesarios
- Integración continua
- Despliegue en un PaaS
- Entorno de pruebas
- Despliegue en IaaS
Para el proyecto de esta asignatura he decidido realizar un bot de Telegram. Con este bot se pretende resolver el problema de los jugadores de Comunio(una página web en la que se juegan ligas internas en la que existen una serie de puntuaciones para cada jugador según haya jugado en dicha jornada de liga) en la que se podrá consultar el mercado de fichajes, la alineación que tiene para esa jornada y muchas más opciones que se irán indicando en hitos posteriores.
-
Servidor de base de datos, que posiblemente se realizara en MySQL : El servidor de bases de datos almacenará el nombre de usuario y contraseña de Comunio para así, si ya ha realizado alguna petición al bot, no sería necesario volver a pedirle usuario y contraseña.
-
Despliegue en la nube
-
Monitorización
-
Herramienta aún por determinar para escrapear los datos: Posiblemente se realizarán consultas dependiendo de lo que el usuario pida y éste devuelve la información necesaria para poder ser mostrada
-
Usaremos el lenguaje Python para el desarrollo del bot
Probablemente se alojará en una cuenta de Amazon
Usaremos TravisCI para realizar test continuos
Automatizaremos tareas, realizaremos despliegue continuo,.. pero esto se irán explicando en los siguientes hitos.
En este hito hemos visto como añadir integración continua a nuestro proyecto.
Deberemos subir nuestro proyecto y sincronizarlo con Travis-CI para que realice la integración continua. Primero necesitamos enlazar la cuenta de GitHub al servicio, una vez realizado esto, debemos indicarle que repostorios queremos que controle y una vez hecho esto, indicarle como se compila, las dependencias que debe usar y la ejecución del test. Esto es simplemente añadir un fichero .travis.yml con lo descrito anteriormente. Mi archivo .travis.yml es el siguiente:
language: python
python:
- "2.7"
# command to install dependencies
install: make install
# command to run tests
script: make test
Le estamos indicando el lenguaje que usamos, la instalación de las dependencias y la ejecución mediante un fichero Makefile. Dicho fichero es el siguiente:
install:
pip install -r requirements.txt
test:
cd bot_telegram && python test.py
execute:
cd bot_telegram && python bot.py
Nos fijamos en cada opción del Makefile. La primera opción "install" nos instala las dependencias que necesitamos, las cuales las tenemos en el fichero requirements.txt (más adelante lo mostraré). La siguiente opción es "test", llamando a test.py que es donde lo tenemos definido. Por último la opción "execute" que nos ejecutaría el bot
Por tanto, Travis analizará cada commit que se realice al repositorio y realizará un test para ver si está correcto o no
Y travis nos dice lo siguiente:
Podemos ver que ha funcionado correctamente y por eso se nos genera el icono en verde que pone "build passing", insertado al inicio de este documento.
También le hemos dicho a travis que tenemos una variable de entorno y que queremos que guarde su valor. Para ello, accedemos a los ajustes del repositorio donde lo queremos y añadimos el nombre y su valor. Quedaría algo asi:
Para este hito he decidido realizar el despliegue en Heroku. Para ello, nos hemos tenido que registrar en la web y a partir de ahi crear una aplicación con una base de datos. La base de datos que he usado ha sido la propia de Heroku (PostgreSQL) y que está alojada en AmazonAWS. Para acceder a dicha base de datos realizamos lo siguiente (en el código de nuestro botesta hecho):
con_bd = psycopg2.connect(database='d6f0n6kc34qjo7',user=(os.environ["USR_BD"]),password=(os.environ["PASS_BD"]),host='ec2-54-225-117-56.compute-1.amazonaws.com')
donde, para ello, nos hemos definido dos variables de entorno, llamadas USR_BD y PASS_BD
para no mostrarlo públicamente y que alguien nos pueda modificar las tablas.
He hecho exactamente lo mismo con el Token del Bot.
Añadir que para que Travis pase los test y Heroku funcione correctamente, en el apartado Settings de ambos servicios debemos configurar estas variables con su valor.
Una vez hecho esto, accedemos a la web de Heroku y seleccionamos la casilla que dice que tras pasar los test de Travis nuestra aplicación se subirá a Heroku. Esto es marcando simplemente esta casilla:
Por tanto, cada vez que hagamos un push a nuestro repositorio se esperará a que pase los test de Travis. Si lo logra, la aplicación se despliegue en Heroku.
Para el despliegue necesitaremos un fichero llamada Procfile, cuyo contenido es el siguiente:
worker: cd bot_telegram && python bot.py
Como se trata de un bot de Telegram, necesitamos poner "worker" o "bot" para que a los 60 segundos sin recibir peticiones no se caiga. SI tuviesemos páginas webs simplemente con poner web bastaría.
Este fichero debe encontrarse en la raíz y es el archivo que Heroku ejecuta, por tanto, debemos decirle que ejecute el bot, en mi caso el fichero bot.py.
A parte, he creado un archivo llamado runtime.txt que contiene la versión de Python que estamos usando. El contenido de dicho fichero es el siguiente:
python-2.7.12
Una vez que tengamos nuestros ficheros de forma correcta, nos disponemos a subirlo a Heroku. Para ello simplemente nos creamos una nuesva aplicación, le damos el nombre que queramos y configuramos su despliegue como expliqué anteriormente, sincronizado con GitHub.
Podemos acceder a las características de nuestra base de datos(que se encuentra en la página de Heroku), y copiar la url que aparece en Heroku CLI en nuestra terminal.
Para poder ver los logs desde la terminal tenemos que poner la orden
heroku logs --tail --ps postgres --app <nombre_app>
o, como se puede ver en la siguiente imagen, mediante la web de Heroku. Podemos ver que el bot está funcionando correctamente
Ahi podemos ver que nuestro bot está lanzado y funcionando.
En definitiva, hemos visto como configurar el despliegue en Heroku, usar la base de datos que Heroku nos proporciona como es PostgreSQL y los diferentes archivos de configuración que necesitamos para que la aplicación funcione correctamente.
Podremos probar nuestra aplicación hablando al bot por el nombre de @Comuni_bot. Veamos simplemente un /start para ver que nos responde(podemos ver las diferentes funcionalidades en el fichero bot.py):
Por tanto, podemos ver que el despliegue está bien hecho y que nuestra aplicación esta funcionando.
También he realizado test usando Snap-Ci. Heroku desplegará la aplicación automaticamente si dicho test se ha pasado correctamente. Podemos ver el resultado en la siguiente imagen(aparte del botón de la build)
Para el entorno de pruebas he usado Docker.Para ello, he generado una imagen que se encuentra disponible en DockerHub.
Podemos ver como crear una cuenta en DockerHub y sincronizarlo con Github aquí
Para generar la imagen con el bot y sus dependencias instaladas usamos el fichero Dockerfile. En dicho fichero se especifican las acciones que se van a realizar para preparar la imagen.
Le indicamos la imagen que vamos a usar, que es la de Ubuntu oficial, que actualice los repositorios, que instale los paquetes necesarios de Python y que se descargue el repositorio de IV en el que tenemos todas las funcionalidades del bot. También se instalarán los requirements y todo lo necesario para generar el contenedor.
Ejecutaremos las siguientes ordenes para descargarnos y lanzar el contenedor:
sudo docker pull sergiocaceres/iv
sudo docker run -e "TOKENBOT=-----" -e "PASS_BD=----" -e "USR_BD=----" -i -t sergiocaceres/iv /bin/bash
Como se puede observar, las variables de entorno tienen un valor, pero por cuestiones de privacidad no las he mostrado.
Una vez dentro del contenedor, debemos ejecutar cd IV/ && make execute
y el bot ya empezará a funcionar.
Podremos ver un ejemplo de su ejecución aquí
La aplicación con la que he venido trabajando se ha desplegado en Azure. He empleado Vagrant como herramienta para la creación de la máquina virtual en la cual se alojará nuestra aplicación, en mi caso el bot de Telegram. También contendrá Ansible para el aprovisionamiento y Fabric para instalar y poner el bot en ejecución.
Todos los ficheros nombrados anteriormente son los siguientes: Vagranfile para crear la máquina virtual, playbook de Ansible para el aprovisionamiento, el fichero fabfile para acceder remotamente y, por último, el fichero comuni_bot.conf para lanzar el bot con supervisor y se mantenga en uso aunque se cierre la terminal. Si no se quiere usar supervisor, se puede utilizar nohup, actúa de la misma manera.
Para crear la máquina virtual usaremos la siguiente orden:
sudo vagrant up --provider=azure
Una vez está instalada y lanzada la máquina virtual, ejecutaremos el bot usando Fabric con la orden:
fab -H nombremaquina@nombreDNSmv funcion
Con esto nuestro bot ya estaría funcionando perfectamente y listo para poder hablarle.
No obstante, se ha creado un script que automatiza todo este proceso para que simplemente con lanzar el script, se descarguen los requisitos necesarios, cree la máquina virtual en Azure y lance la ejecución del bot con nohup. Puede verse el script aquí
Para encontrar más información del despliegue, pulsar aquí