Archivo historico de la wiki de EGC

Contenido archivado y de solo lectura, importado de la wiki original en julio de 2026. Puede contener enlaces rotos y material obsoleto.

Despliegue de aplicaciones: PaaS y Despliegue Continuo 22-23

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

# Instalamos llave de cifrado:
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

# Añadimos el repositorio
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

# Instalamos CleverCloud tools
sudo apt update
sudo apt install clever-tools
clever login
# Se abrirá un navegador con el login de CleverCloud.

Despliegue puntual en CleverCloud

Ejercicio 1. Crear aplicación

¿Para qué sirve el hecho de escoger un "Plan" o una "Localización" concreta?

¿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.

{
    "build": {
        "folder": "decide"
    },
    "deploy": {
        "module": "decide.wsgi:application",
        "managetasks": [
            "collectstatic --noinput",
            "migrate"
        ]
    }
}
  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.

¿Por qué sigue sin funcionar?

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.

¿Puede ya nevegar hasta el menú de administración de decide?

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.

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 }} 

¿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 https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#onpushpull_requestbranchestags 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 https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#jobsjob_idstepsif aquí más detalles de dicha cláusula.

deploy:
    if: ${{github.ref == 'refs/heads/master' }}

¿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.