Despliegue de aplicaciones: PaaS y Despliegue Continuo 22-23

De Wiki de EGC
Saltar a: navegación, buscar

Página_Principal -> 2022/2023 -> Prácticas - 22/23

Nota: En esta práctica se hacen uso de los servicios de CleverCloud, el cual no ofrece capa gratuita pero sí da un periodo de prueba (Actualmente da 20€ para nuevas cuentas)

Por lo tanto:

  1. Recomendamos no introducir nuestros datos bancarios para que no se nos haga ningún cargo involuntario tras el periodo de prueba.
  2. La realización de la práctica es voluntaria, aunque los conceptos que se enseñan en ella sí son materia de estudio.


Prerequisitos

  • Crear una cuenta en CleverCloud usando email y contraseña.
  • Asociar una llave SSH a la cuenta de CleverCloud en el menú de gestión de SSH.
  • Instalar CleverCloud CLI sobre Ubuntu:
1 # Instalamos llave de cifrado:
2 curl -fsSL https://clever-tools.clever-cloud.com/gpg/cc-nexus-deb.public.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/cc-nexus-deb.gpg
3 
4 # Añadimos el repositorio
5 echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/cc-nexus-deb.gpg] https://nexus.clever-cloud.com/repository/deb stable main" | sudo tee -a /etc/apt/sources.list
6 
7 # Instalamos CleverCloud tools
8 sudo apt update
9 sudo apt install clever-tools
  • Comprobar que la instalación es correcta con
1 clever login
2 # Se abrirá un navegador con el login de CleverCloud.

Despliegue puntual en CleverCloud

Ejercicio 1. Crear aplicación

  • Desde el "espacio personal" de CleverCloud cree una aplicación. Use la opción "Create a Brand new App".
  • Elija una aplicación de tipo "Python" e incluya "Postgress" como Add-on.
¿Para qué sirve el hecho de escoger un "Plan" o una "Localización" concreta?
  • Seguir las instrucciones para hacer un push de nuestros código de decide hacia CleverCloud.
  • Visualizar el log de la aplicación
¿Por qué está fallando?
¿Cuál es la URL dónde debería estar la aplicación desplegada en CleverCloud?

Ejercicio 2. Archivo de configuración de CleverCloud

CleverCloud realiza dos etapas:

  1. Build: Prepara el entorno, instala las dependencias, etc.
  2. Run: Despliega y expone la aplicación.

Parte de la configuración de estas etapas se hace en el archivo de configuración de CleverCloud. Para Python, este archivo deberá estar en clevercloud/python.json .

  • Cree ese archivo con el siguiente contenido:
{
    "build": {
        "folder": "decide"
    },
    "deploy": {
        "module": "decide.wsgi:application",
        "managetasks": [
			"collectstatic --noinput",
			"migrate"
        ]
    }
}
  • Como en CleverCloud no habrá local_settings, editaremos el decide/settings.py para que contenga una configuración válida para CleverCloud. Estos son los cambios principales que habrá que hacer:
  1. Permitir conexiones más allá de localhost: ALLOWED_HOSTS = ['*']
  2. Actualizar la url en BASEURL
  3. Añadir el bloque de API={ …} apuntando a base url. Puede copiarlo de algún local_settings.py
  4. Específicar las rutas de los archivos estáticos STATIC_URL = '/static/' y STATIC_ROOT= 'static/'
  5. El 'migrate' no funcionará si la base de datos no está bien configurada. Para ello puede observar en su aplicación en CleverCloud que hay una configuración de variables de entorno para sus Add-on de postgres. # Desde el settings.py puede acceder al valor de dichas variables con os.environ.get(NOMBRE_VARIABLE). Actualize el objeto "DATABASES" del settings.py para que acceda a dichas variables.
  • Vuelva a realizar un push a CleverCloud (no olvide hacer commit antes).
¿Por qué sigue sin funcionar?
  • El requirements.txt no lo está identificando al buscarlo, por defecto, dentro de la carpeta indicada en "folder". Copie el requirements.txt dentro de la carpeta decide (También puede especificar la ruta del requirements.txt usando la variable de entorno CC_PIP_REQUIREMENTS_FILE, ver siguiente ejercicio).

Ejercicio 3. Variables de entorno de CleverCloud

Hay otra parte de la configuración de CleverCloud que ha de especificarse dentro las variables de entorno de la aplicación.

  • Para que la aplicación se levante correctamente, ha de usar la versión de python 3.8 en la variable CC_PYTHON_VERSION.
  • Para indicar qué url dirige a los archivo estáticos, use STATIC_URL_PREFIX con el valor /static. Por ejemplo, el CSS de la aplicación.
  • Para indicar la ruta donde se almacenarán dichos archivos, use STATIC_FILES_PATH con el valor decide/static/.
  • Pulse sobre "Update changes" y reinicie la aplicacion desde el menú "Overview".
¿Puede ya nevegar hasta el menú de administración de decide?
  • Cree el superusuario accediendo por ssh con:

ssh -t ssh@sshgateway-clevercloud-customers.services.clever-cloud.com <<app_name>> El código de la aplicación (manage.py) se encuentra en una carpeta con el nombre de su aplicación.

Despliege continuo

Ejercicio 4. CleverCloud y GitHub Actions

Para integrar GitHub Actions y CleverCloud cree un workflow de GitHub Actions nuevo, con un solo job.

  • Use este workflow a modo de ejemplo:
name: Deploy example
on: [push]
jobs:
  deploy:
    runs-on: ubuntu-latest    
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - uses: 47ng/actions-clever-cloud@v1.3.1
        with:
          appID: app_fd57a008-7dbd-4636-8b34-af951947911f
        env:
          CLEVER_TOKEN: ${{ secrets.CLEVER_TOKEN }}
          CLEVER_SECRET: ${{ secrets.CLEVER_SECRET }}
  • Añada la dos secrets al proyecto de GitHub. Estas secrets se obtiene en el proceso de hacer clever login. Aunque lo hiciera en los prerrequisitos, puede repetirlo ahora.
  • Recuerde que necesita pushear este código (incluídos los cambios anteriores) a su repositorio en GitHub.
¿Ha funcionado el workflow?
¿Ha estado la aplicación en algún momento caída?

Ejercicio 5. Condiciones de despliegue

En GitHub Actions, los workflows tienen la capacidad de definir el/los evento/s que los disparan con la clausua "on:". Puedes ver [aquí] más detalles de dicha cláusula. Sin embargo eso no se puede especificar a nivel de job o de step. A esos niveles pueden expresarse sentencias "if" que permiten ejecutarlas condicionalmente. Puedes ver [aquí] más detalles de dicha cláusula.

  • Integra el job de "deploy" en el workflow que creaste en prácticas anteriores.
  • Para hacer que solo se lance el job "deploy" cuando estemos en una rama concreta, por ejemplo, "master", incluiya lo siguiente:
deploy:
    if: ${{github.ref == 'refs/heads/master' }}
  • Haga push del nuevo workflow incluyen el job de deploy y su condición. Posterioremente, haz un push de algún otro código a otra rama.
¿Se lanza el workflow?
¿Se lanza el job "deploy"? ¿En que estado se queda?


Modifica la clausula "on:" para que se lance el workflow solo cuando se hiciera push a la rama master. Despues de hacer un push del workflow, haz un push a otra rama.

¿Se lanza el workflow?

Ejercicio 6. Creación de incidencias

  1. El usuario “superuser” no se crea dentro del ciclo de despliegue continuo y obliga a hacer una tarea manual en los nuevos despliegues (salvo cuando se mantiene la BD).
  2. Crear una incidencia según las recomendaciones vistas en clase para el error que obtenemos al votar en heroku.
  3. Asegurarse que la incidencia creada incluye, al menos, un título descriptivo, información de qué es lo que ocurre y cómo puede reproducirse el error.