Tutorial: Configuración de la implementación continua para una aplicación web de Python en Azure Container Apps
Este artículo forma parte de una serie de tutoriales 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 este tutorial ha:
- Configura la implementación continua de una aplicación contenedora mediante un flujo de trabajo de GitHub Actions .
- Realice un cambio en una copia del repositorio de ejemplo para desencadenar el flujo de trabajo de las acciones de GitHub.
- Resuelva los problemas que pueda encontrarse con la configuración de la implementación continua.
- Quite los recursos que no necesite al finalizar la serie de tutoriales.
La implementación continua está relacionada con la práctica de DevOps de integración continua y entrega continua (CI/CD), que es la automatización del flujo de trabajo de desarrollo de aplicaciones.
En el diagrama siguiente se resaltan las tareas de este tutorial.
Prerrequisitos
Para configurar la implementación continua, necesita:
Los recursos (y su configuración) que creó en el tutorial anterior, que incluye una instancia de Azure Container Registry y una aplicación de contenedor de Azure Container Apps.
Una cuenta de GitHub en la que bifurcaste el código de ejemplo (Django o Flask) y a la que se pueda conectar desde Azure Container Apps. (Si descargó el código de ejemplo en lugar de bifurcar, asegúrese de subir el repositorio local a su cuenta de GitHub).
Opcionalmente, tener Git instalado en el entorno de desarrollo para realizar cambios en el código y subirlos al repositorio en GitHub. Como alternativa, puede realizar los cambios directamente en GitHub.
Configuración de la implementación continua para un contenedor
En el tutorial anterior, creó y configuró una aplicación de contenedor 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 cuando se crea un contenedor revisión, como cuando se configura por primera vez la aplicación contenedora.
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. Cuando se desencadena el flujo de trabajo, crea una nueva imagen de Docker, la inserta en la instancia de Azure Container Registry y actualiza la aplicación contenedora a una nueva revisión mediante la nueva imagen.
Puede ejecutar los comandos de la CLI de Azure en Azure Cloud Shell o en una estación de trabajo con 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
Cree una entidad de servicio mediante 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>"
En el comando :
- <app-name> es un nombre para mostrar opcional para la entidad de servicio. Si se omite la opción
--name
, se genera un GUID como nombre para mostrar. - <ID de suscripción> es el GUID que identifica de forma única tu suscripción en Azure. Si no conoce su ID de suscripción, puede ejecutar el comando az account show y copiarlo desde la propiedad
id
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 tutorial anterior, el nombre del grupo de recursos es
pythoncontainer-rg
.
Guarde la salida de este comando para el paso siguiente. En concreto, guarde el identificador de cliente (propiedad
appId
), el secreto de cliente (propiedadpassword
) y el ID de tenant (propiedadtenant
).- <app-name> es un nombre para mostrar opcional para la entidad de servicio. Si se omite la opción
Configure acciones de GitHub mediante 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
En el comando :
- <resource-group-name> es el nombre del grupo de recursos. En este tutorial, es
pythoncontainer-rg
. - <https://github.com/userid/repo> es la dirección URL del repositorio de GitHub. En este tutorial, escoja entre
https://github.com/userid/msdocs-python-django-azure-container-apps
ohttps://github.com/userid/msdocs-python-flask-azure-container-apps
. En esas direcciones URL,userid
es el identificador de usuario de GitHub. - <nombre del registro> es la instancia de Azure Container Registry existente que creó en el tutorial anterior o una que puede usar.
- <> client-id es el valor de la propiedad
appId
del comandoaz ad sp create-for-rbac
anterior. El Id. es un GUID con el formato00000000-0000-0000-0000-00000000
. - <tenant-id> es el valor de la propiedad
tenant
del comandoaz ad sp create-for-rbac
anterior. El ID también es un GUID, similar al identificador del cliente. - <client-secret> es el valor de la propiedad
password
del comandoaz ad sp create-for-rbac
anterior.
- <resource-group-name> es el nombre del grupo de recursos. En este tutorial, es
En la configuración de la implementación continua, una entidad de servicio llamada permite que GitHub Actions acceda a los recursos de Azure y los modifique. Los roles asignados al principal de servicio restringen el acceso a los recursos. A la entidad de servicio se le asignó el rol integrado de Colaborador en el grupo de recursos que contiene la aplicación de contenedor.
Si ha seguido los pasos del portal, la entidad de servicio se habrá creado automáticamente. Si has seguido los pasos de la CLI de Azure, has creado explícitamente el principal de servicio antes de configurar la implementación continua.
Reimplementación de la aplicación web con Acciones de GitHub
En esta sección, realizas un cambio en la copia clonada del repositorio de ejemplo. Después, puede confirmar que el cambio se implementa automáticamente en el sitio web.
Si aún no lo ha hecho, realice una bifurcación del repositorio de ejemplo (Django o Flask). Puede realizar cambios en su código directamente en GitHub o en su entorno de desarrollo desde la línea de comandos con Git.
Vaya a la bifurcación del repositorio de ejemplo e inicie en la rama principal.
Realice un cambio:
- Vaya al archivo /templates/base.html. (Para Django, la ruta es restaurant_review/templates/restaurant_review/base.html).
- Seleccione Editar y cambie la frase
Azure Restaurant Review
aAzure Restaurant Review - Redeployed
.
En la parte inferior de la página que está editando, asegúrese de que Confirmar directamente en la rama principal está seleccionado. A continuación, seleccione el botón Confirmar cambios.
La confirmación inicia el flujo de trabajo de Acciones de GitHub.
Nota
En este tutorial se muestra cómo realizar un cambio directamente en la rama principal. En los flujos de trabajo de software típicos, se realiza un cambio en una rama distinta de principal y, a continuación, se crea un pull request para combinar el cambio en principal. Las solicitudes de incorporación de cambios también inician el flujo de trabajo.
Descripción de acciones de GitHub
Visualización del historial de flujos de trabajo
Si necesita ver el historial de flujos de trabajo, use uno de los procedimientos siguientes.
En GitHub, vaya a la bifurcación del repositorio de ejemplo y abra la pestaña Acciones.
Secretos de flujo de trabajo
El archivo de flujo de trabajo .github/workflows/<workflow-name>.yml que se agregó al repositorio incluye marcadores de posición para las credenciales necesarias para los trabajos de creación y actualización de la aplicación de contenedor del flujo de trabajo. La información de credenciales se almacena cifrada en el área Configuración, en Seguridad>Secretos y variables>Acciones.
Si cambia la información de credenciales, puede actualizarla aquí. Por ejemplo, si se vuelven a generar las contraseñas de Azure Container Registry, debe actualizar el valor de REGISTRY_PASSWORD
. Para obtener más información, consulte secretos cifrados en la documentación de GitHub.
Aplicaciones autorizadas de OAuth
Al configurar la implementación continua, designa 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 YAML de acciones de GitHub en .github/workflows/<workflow-name>.yml. Puede ver las aplicaciones autorizadas y revocar permisos en su cuenta, en Integrations>Applications.
Solución de problemas
Experimenta errores al configurar un principal de servicio mediante la CLI de Azure.
Esta sección puede ayudarle a solucionar los errores que obtiene al configurar una entidad de servicio mediante el comando az ad sp create-for-rba
de la CLI de Azure.
Si recibe un error que contiene "InvalidSchema: No se encontraron adaptadores de conexión":
Compruebe el shell en el que se está ejecutando. Si usa un shell de Bash, establezca las variables de
MSYS_NO_PATHCONV
comoexport MSYS_NO_PATHCONV=1
.Para obtener más información, consulte el problema de GitHub No se puede crear una entidad de servicio con la CLI de Azure desde el shell de Git Bash.
Si recibe un error que contiene "Más de una aplicación tiene el mismo nombre para mostrar":
- El nombre ya se usa en la entidad de servicio. Elija otro nombre o deje el argumento
--name
. 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 de del repositorio:
- Si hay un flujo de trabajo con errores, explore en profundidad el archivo de flujo de trabajo. Debería haber dos trabajos: compilar e implementar. Para un trabajo fallido, compruebe la salida de las tareas del trabajo para buscar problemas.
- Si hay un mensaje de error que indica "Tiempo de espera del protocolo de enlace TLS", ejecute el flujo de trabajo manualmente. En el repositorio, en la pestaña Acciones, seleccione Desencadenar implementación automática para verificar 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/<nombre de flujo de trabajo>.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 fusionado en la rama principal
En GitHub:
- Compruebe que se ejecutó el flujo de trabajo de Acciones de GitHub y que ha comprobado el cambio en la rama que desencadena el flujo de trabajo.
En Azure Portal:
Compruebe la instancia de 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.
Compruebe los registros de la aplicación contenedora para ver si hay un error de programación:
- Vaya a la aplicación de contenedor y, a continuación, vaya a Administración de revisión><contenedor activo>>Detalles de revisión>Registros de consola.
- Elija el orden de las columnas para mostrar Hora de generación, Stream_s y Log_s.
- Ordene los registros por más reciente y busque los mensajes
stderr
de Python ystdout
en la columna Stream_s. La salida deprint
de Python son mensajesstdout
.
En la CLI de Azure:
- Utiliza el comando az containerapp logs show.
Quiere detener la implementación continua.
Detener la implementación continua significa desconectar la aplicación contenedora del repositorio.
En Azure Portal:
- Vaya a la aplicación de contenedor. En el menú de servicio, seleccione Implementación continuay, a continuación, seleccione Desconectar.
En la CLI de Azure:
- Utilice el comando az container app github-action remove.
Después de desconectar:
- El archivo .github/workflows/<workflow-name>.yml se quita del repositorio.
- Las claves secretas no se quitan del repositorio.
- Azure Container Apps permanece como una aplicación de OAuth autorizada para su cuenta de GitHub.
- En Azure, el contenedor se queda con el último contenedor que fue implementado. Puede volver a conectar la aplicación contenedora con la instancia de Azure Container Registry para que las nuevas revisiones de contenedor recojan la imagen más reciente.
- En Azure, las entidades de servicio que ha creado y usado para la implementación continua no se eliminan.
Quitar recursos
Si ha terminado con la serie de tutoriales y no quiere incurrir en costos adicionales, quite los recursos que usó.
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 ver un ejemplo de cómo quitar grupos de recursos, consulte Tutorial sobre contenedorización y limpieza.
Contenido relacionado
Si tiene previsto desarrollar a partir de este tutorial, estos son algunos próximos pasos que puede seguir: