Share via


Configuración de la implementación continua para una aplicación web de Python en Azure Container Apps

Este artículo forma parte de un tutorial sobre cómo incluir e implementar una aplicación web de Python en Azure Container Apps. Container Apps permite implementar aplicaciones en contenedor sin administrar infraestructura compleja.

En esta parte del tutorial, aprenderá a configurar la implementación o entrega continuas (CD) para la aplicación contenedora. CD forma parte de la práctica de DevOps de integración continua/entrega continua (CI/CD), que es la automatización del flujo de trabajo de desarrollo de aplicaciones. En concreto, se usan Acciones de GitHub para la implementación continua.

En este diagrama de servicio se resaltan los componentes descritos en este artículo: configuración de CI/CD.

A screenshot of the services in the Tutorial - Deploy a Python App on Azure Container Apps. Sections highlighted are parts related to continuous integration - continuous delivery (CI/CD).

Requisitos previos

Para configurar la implementación continua, necesita:

  • Los recursos y su configuración creados en el artículo anterior de esta serie de tutoriales, que incluye Azure Container Registry y una aplicación de contenedor en Azure Container Apps.

  • Una cuenta de GitHub a la que bifurca el código de ejemplo (Django o Flask) y puede conectarse desde Azure Container Apps. (Si descargó el código de ejemplo en lugar de bifurcar, asegúrese de insertar el repositorio local en la cuenta de GitHub).

  • Opcionalmente, Git instalado en el entorno de desarrollo para realizar cambios de código e insertar en el repositorio en GitHub. Como alternativa, puede realizar los cambios directamente en GitHub.

Configuración de CD para un contenedor

En un artículo anterior de este tutorial, creó y configuró una aplicación contenedora en Azure Container Apps. Parte de la configuración estaba extrayendo una imagen de Docker de una instancia de Azure Container Registry. La imagen de contenedor se extrae del registro al crear una revisión de contenedor, como cuando se configura por primera vez la aplicación de contenedor.

En esta sección, configurará la implementación continua mediante un flujo de trabajo de Acciones de GitHub. Con la implementación continua, se crea una nueva imagen de Docker y una revisión de contenedor en función de un desencadenador. El desencadenador de este tutorial es cualquier cambio en la rama principal del repositorio, como con una solicitud de incorporación de cambios (PR). Cuando se desencadena, el flujo de trabajo crea una nueva imagen de Docker, la inserta en Azure Container Registry y actualiza la aplicación contenedora a una nueva revisión mediante la nueva imagen.

Los comandos de la CLI de Azure se pueden ejecutar en Azure Cloud Shell o en una estación de trabajo que tenga la CLI de Azure instalada.

Si ejecuta comandos en un shell de Git Bash en un equipo Windows, escriba el siguiente comando antes de continuar:

export MSYS_NO_PATHCONV=1

Paso 1. Cree una entidad de servicio con el comando az ad sp create-for-rbac .

az ad sp create-for-rbac \
--name <app-name> \
--role Contributor \
--scopes "/subscriptions/<subscription-ID>/resourceGroups/<resource-group-name>"

Donde:

  • <app-name> es un nombre para mostrar opcional para la entidad de servicio. Si deja desactivada la --name opción, se genera un GUID como nombre para mostrar.
  • <subscription-ID> es el GUID que identifica de forma única la suscripción en Azure. Si no conoce el identificador de suscripción, puede ejecutar el comando az account show y copiarlo de la id propiedad en la salida.
  • <resource-group-name> es el nombre de un grupo de recursos que contiene el contenedor de Azure Container Apps. El control de acceso basado en rol (RBAC) está en el nivel de grupo de recursos. Si ha seguido los pasos del artículo anterior de este tutorial, el nombre del grupo de recursos es pythoncontainer-rg.

Guarde la salida de este comando para el paso siguiente, en particular, el identificador de cliente (appId propiedad), el secreto de cliente (password propiedad) y el identificador de inquilino (tenant propiedad).

Paso 2. Configure Acciones de GitHub con el comando az containerapp github-action add .

az containerapp github-action add \
--resource-group <resource-group-name> \
--name python-container-app \
--repo-url <https://github.com/userid/repo> \
--branch main \
--registry-url <registry-name>.azurecr.io \
--service-principal-client-id <client-id> \
--service-principal-tenant-id <tenant-id> \
--service-principal-client-secret <client-secret> \
--login-with-github

Donde:

  • <resource-group-name> es el nombre del grupo de recursos. Si sigue este tutorial, es "pythoncontainer-rg".
  • <https://github.com/userid/repo> es la dirección URL del repositorio de GitHub. Si sigue los pasos descritos en este tutorial, será o https://github.com/userid/msdocs-python-django-azure-container-appshttps://github.com/userid/msdocs-python-flask-azure-container-apps; donde userid es el identificador de usuario de GitHub.
  • <registry-name> es el registro de contenedor existente que creó para este tutorial, o uno que puede usar.
  • <client-id> es el valor de la appId propiedad del comando anterior az ad sp create-for-rbac . El identificador es un GUID del formulario 000000000-0000-0000-0000-0000000000.
  • <tenant-id> es el valor de la tenant propiedad del comando anterior az ad sp create-for-rbac . El identificador también es un GUID similar al identificador de cliente.
  • <client-secret> es el valor de la password propiedad del comando anterior az ad sp create-for-rbac .

En la configuración de la implementación continua, se usa una entidad de servicio para habilitar Acciones de GitHub para acceder a los recursos de Azure y modificarlos. El acceso a los recursos está restringido por los roles asignados a la entidad de servicio. A la entidad de servicio se le asignó el rol integrado Colaborador en el grupo de recursos que contiene la aplicación contenedora.

Si ha seguido los pasos del portal, la entidad de servicio se creó automáticamente. Si ha seguido los pasos de la CLI de Azure, primero ha creado la entidad de servicio explícitamente antes de configurar la implementación continua.

Reimplementación de la aplicación web con Acciones de GitHub

En esta sección, realizará un cambio en la copia bifurcada del repositorio de ejemplo y confirmará que el cambio se implementa automáticamente en el sitio web.

Si aún no lo ha hecho, cree una bifurcación del repositorio de ejemplo (Django o Flask). Puede hacer que el código cambie directamente en GitHub o en el entorno de desarrollo desde una línea de comandos con Git.

Paso 1. Vaya a la bifurcación del repositorio de ejemplo e inicie en la rama principal .

Screenshot showing a fork of the sample repo and starting in the main branch.

Paso 2. Realizar un cambio.

  • Vaya al archivo /templates/base.html . (Para Django, la ruta de acceso es: restaurant_review/templates/restaurant_review/base.html).)
  • Seleccione Editar y cambie la frase "Azure Restaurant Review" a "Azure Restaurant Review - Redeployed".

Screenshot showing how to make a change in a template file in the fork of the sample repo.

Paso 3. Confirme el cambio directamente en la rama principal .

  • En la parte inferior de la página que edita, seleccione el botón Confirmar .
  • La confirmación inicia el flujo de trabajo de Acciones de GitHub.

Screenshot showing how to commit a change in a template file in the fork of the sample repo.

Nota:

Hemos mostrado realizar un cambio directamente en la rama principal . En los flujos de trabajo de software típicos, realizará un cambio en una rama distinta de main y, a continuación, creará una solicitud de incorporación de cambios (PR) para combinar esos cambios en main. Las solicitudes de incorporación de cambios también inician el flujo de trabajo.

Acerca de las acciones de GitHub

Visualización del historial de flujos de trabajo

Paso 1. En GitHub, vaya a la bifurcación del repositorio de ejemplo y abra la pestaña Acciones .

Screenshot showing how to view GitHub Actions for a repo and look at workflows.

Secretos de flujo de trabajo

En el archivo .github/workflows/<workflow-name>.yml archivo de flujo de trabajo que se agregó al repositorio, verá los marcadores de posición de las credenciales necesarias para los trabajos de actualización de aplicaciones de compilación y contenedor del flujo de trabajo. La información de credenciales se almacena cifrada en el repositorio Configuración en Secretos de seguridad/y acciones de variables/.

Screenshot showing how to see where GitHub Actions secrets are stored in GitHub.

Si cambia la información de credenciales, puede actualizarla aquí. Por ejemplo, si se vuelven a generar las contraseñas de Azure Container Registry, deberá actualizar el valor de REGISTRY_PASSWORD. Para más información, consulte Secretos cifrados en la documentación de GitHub.

Aplicaciones autorizadas de OAuth

Al configurar la implementación continua, autoriza Azure Container Apps como una aplicación de OAuth autorizada para su cuenta de GitHub. Container Apps usa el acceso autorizado para crear un archivo YML de Acciones de GitHub en .github/workflows/<workflow-name>.yml. Puede ver las aplicaciones autorizadas/y revocar permisos en Aplicaciones de integración de su cuenta.

Screenshot showing how to see the authorized apps for a user in GitHub.

Sugerencias de solución de problemas

Errores al configurar una entidad de servicio con el comando de la CLI az ad sp create-for-rba de Azure.

  • Recibe un error que contiene "InvalidSchema: No se encontraron adaptadores de conexión".

  • Recibe un error que contiene "Más de una aplicación tiene el mismo nombre para mostrar".

    • Este error indica que el nombre ya se ha tomado para la entidad de servicio. Elija otro nombre o deje el --name argumento y se generará automáticamente un GUID como nombre para mostrar.

Error en el flujo de trabajo de Acciones de GitHub.

  • Para comprobar el estado de un flujo de trabajo, vaya a la pestaña Acciones del repositorio.
  • Si hay un flujo de trabajo con errores, explore en profundidad su archivo de flujo de trabajo. Debe haber dos trabajos "build" e "deploy". Para un trabajo con errores, examine la salida de las tareas del trabajo para buscar problemas.
  • Si ve un mensaje de error con el tiempo de espera del protocolo de enlace TLS, ejecute el flujo de trabajo manualmente seleccionando Desencadenar implementación automática en la pestaña Acciones del repositorio para ver si el tiempo de espera es un problema temporal.
  • Si configura la implementación continua para la aplicación contenedora como se muestra en este tutorial, el archivo de flujo de trabajo (.github/workflows/<workflow-name>.yml) se crea automáticamente. No es necesario modificar este archivo para este tutorial. Si lo hizo, revierta los cambios e intente el flujo de trabajo.

El sitio web no muestra los cambios que ha combinado en la rama principal .

  • En GitHub: compruebe que se ejecutó el flujo de trabajo acciones de GitHub y que ha comprobado el cambio en la rama que desencadena el flujo de trabajo.
  • En Azure Portal: compruebe Azure Container Registry para ver si se creó una nueva imagen de Docker con una marca de tiempo después del cambio en la rama.
  • En Azure Portal: compruebe los registros de la aplicación contenedora. Si hay un error de programación, lo verá aquí.
    • Vaya a la aplicación contenedora | Administración de revisiones | <contenedor> activo | Detalles de revisión | Registros de consola
    • Elija el orden de las columnas para mostrar "Time Generated", "Stream_s" y "Log_s". Ordene los registros por primera vez más reciente y busque los mensajes stderr y stdout de Python en la columna "Stream_s". La salida "print" de Python será mensajes stdout .
  • Con la CLI de Azure, use el comando az containerapp logs show .

¿Qué ocurre cuando desconecta la implementación continua?

  • Detener la implementación continua significa desconectar la aplicación contenedora del repositorio. Para desconectar:

  • Después de desconectarse, en el repositorio de GitHub:

    • El archivo .github/workflows/<workflow-name>.yml se quita del repositorio.
    • No se quitan las claves secretas.
    • Azure Container Apps permanece como una aplicación de OAuth autorizada para su cuenta de GitHub.
  • Después de desconectar, en Azure:

    • El contenedor se deja con el último contenedor implementado. Puede volver a conectar la aplicación contenedora con Azure Container Registry para que las nuevas revisiones de contenedor recojan la imagen más reciente.
    • Las entidades de servicio creadas y usadas para la implementación continua no se eliminan.

Pasos siguientes

Si ha terminado con el tutorial y no quiere incurrir en costos adicionales, quite los recursos usados. La eliminación de un grupo de recursos quita todos los recursos del grupo y es la manera más rápida de quitar recursos. Para obtener un ejemplo de cómo quitar grupos de recursos, consulte Limpieza del tutorial containerize.

Si planea compilar en este tutorial, estos son algunos pasos siguientes que puede seguir.