Gestión de incidencias y integración continua completa
En esta práctica recrearemos un despliegue completo en el cual una vez realicemos commit a nuestro repositorio Github, Travis se encargará de ejecutar las pruebas y en caso de que pase las pruebas el mismo se encargará de desplegar la versión commiteada a Heroku.
Asimismo, veremos como reportar incidencias de una manera correcta Gestión de incidencias
Para la realización de esta práctica es recomendable haber realizado con anterioridad las prácticas de automatización de pruebas y de despliegue en Heroku.
Para comenzar la práctica necesitamos instalar en nuestra mmáquina tanto Heroku CLI como travis CLI
Instalando Heroku
$ sudo snap install --classic heroku
Instalando Travis CLI
//Quizás sea necesario instalar ruby-dev $ sudo apt install ruby-dev
$ gem install travis -v 1.8.10 --no-rdoc --no-ri
Comenzando preparando las pruebas y el despliegue
1) Actualizamos el fichero requirements para permitir el despliegue y la correcta ejecución de las pruebas
Django==2.0
django-heroku
gunicorn
pycryptodome==3.6.6
djangorestframework==3.7.7
django-cors-headers==2.1.0
requests==2.18.4
django-filter==1.1.0
psycopg2==2.8.4
django-rest-swagger==2.2.0
coverage==4.5.2
django-nose==1.4.6
jsonnet==0.12.1
2) Creamos un fichero para guardar los valores del settings para travis (i.e $git$/decide/travis_local_settings.py)
ALLOWED_HOSTS = ["*"]
# Modules in use, commented modules that you won't use
MODULES = [
'authentication',
'base',
'booth',
'census',
'mixnet',
'postproc',
'store',
'visualizer',
'voting',
]
APIS = {
'authentication': 'http://localhost:8000',
'base': 'http://localhost:8000',
'booth': 'http://localhost:8000',
'census': 'http://localhost:8000',
'mixnet': 'http://localhost:8000',
'postproc': 'http://localhost:8000',
'store': 'http://localhost:8000',
'visualizer': 'http://localhost:8000',
'voting': 'http://localhost:8000',
}
BASEURL = 'http://localhost:8000'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'HOST': 'localhost',
'PORT': '5432',
}
}
# number of bits for the key, all auths should use the same number of bits
KEYBITS = 256
3) Introducimos los cambios pertinentes en el fichero decide/decide/settings.py para establecer los valores por defecto de la configuración de despliegue en Heroku.
import os
import django_heroku
...
BASEURL = 'http://heroku-meet-travis.herokuapp.com'
APIS = {
'authentication': BASEURL,
'base': BASEURL,
'booth': BASEURL,
'census': BASEURL,
'mixnet': BASEURL,
'postproc': BASEURL,
'store': BASEURL,
'visualizer': BASEURL,
'voting': BASEURL,
}
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'decide',
'USER': 'decide',
'PASSWORD': 'decide',
'HOST': 'localhost',
'PORT': '5432',
}
}
...
INSTALLED_APPS = INSTALLED_APPS + MODULES
django_heroku.settings(locals())
4) Preparamos y añadimos al repositorio el Procfile para Heroku
% prepara el repositorio para su despliegue.
release: sh -c 'cd decide && python manage.py migrate'
% especifica el comando para lanzar Decide
web: sh -c 'cd decide && gunicorn decide.wsgi --log-file -'
4.1) Creamos nuestra app de heroku
heroku create <<app-name>>
5) Preparamos el fichero .travis.yml
enial
services:
- postgresql
addons:
postgresql: '9.4'
before_script:
- psql -U postgres -c "create user decide password 'decide'"
- psql -U postgres -c "create database test_decide owner decide"
- psql -U postgres -c "ALTER USER decide CREATEDB"
language: python
python:
- '3.6'
install:
- pip install -r requirements.txt
script:
- cd decide
- cp travis_local_settings.py local_settings.py
- python ./manage.py test --keepdb
deploy:
provider: heroku
app: <<your app name>>
strategy: git
6) Para que heroku permita la comunicación con travis debemos añadir una API key al travis.yml
$ travis encrypt $(heroku auth:token) --add deploy.api_key
7) Finalmente, vamos a eliminar el test test_multiple_auths_mock(self) de la mixnet
8) Añadir un test simple en auth, por ejemplo en decide/authentication/basic_test.py
from django.test import TestCase
class SimpleTest(TestCase):
def test_basic_addition(self):
self.assertEqual(1 + 1, 2)
9) Probar la app como hicimos en la práctica de Heroku
10) Crear una incidencia según las recomendaciones vistas en clase para el error que obtenemos al votar en heroku.
Repositorio con los cambios realizados [[1]]