Share via


Tutorial: Implementación de una aplicación de ASP.NET Core y una base de datos en Azure Container Apps mediante Acciones de GitHub

En este tutorial, aprenderá a implementar una aplicación de ASP.NET Core y SQL Database en Azure Container Apps mediante Visual Studio y Acciones de GitHub. También aprenderá a administrar las migraciones y las actualizaciones de bases de datos de Entity Framework en Acciones de GitHub, aunque los conceptos también se pueden aplicar a otros entornos y herramientas de CI/CD.

Requisitos previos

Necesita Visual Studio 2022 instalado con las cargas de trabajo ASP.NET y desarrollo web y desarrollo de Azure.

Si ya ha instalado Visual Studio:

  • Para instalar las actualizaciones más recientes de Visual Studio, seleccione Ayuda>Buscar actualizaciones.
  • Compruebe que las cargas de trabajo ASP.NET y desarrollo web y desarrollo de Azure están instaladas seleccionando Herramientas>Obtener herramientas y características.

Configuración local de la aplicación de ejemplo

Use la aplicación de ejemplo ToDo para seguir este tutorial. Clone la aplicación desde GitHub mediante el siguiente comando:

git clone https://github.com/Azure-Samples/msdocs-app-service-sqldb-dotnetcore.git
cd msdocs-app-service-sqldb-dotnetcore

Vaya a la carpeta del proyecto y abra la solución DotNetCoreSqlDb.sln en Visual Studio.

La aplicación ToDo está lista para usarse, pero será preciso establecer una conexión con el localdb servidor SQL Server que está disponible en Visual Studio. La conexión a localdb le permitirá ejecutar la aplicación y conservar las tareas pendientes mientras trabaja localmente.

  1. Haga clic con el botón derecho en el nodo Servicios conectados del Explorador de soluciones de Visual Studio y seleccione Agregar > Base de datos de SQL Server.
  2. En el cuadro de diálogo Conectar a dependencia, seleccione SQL Server Express LocalDB (local) y, luego, seleccione Siguiente.
  3. En el cuadro de diálogo Conectar a SQL Server Express LocalDB (local) y establezca los valores siguientes:
    • Nombre de cadena de conexión: deje el valor predeterminado.
    • Valor de cadena de conexión: deje el valor predeterminado.
    • Guardar el valor de la cadena de conexión en: seleccione No.
    • Seleccione Siguiente.
  4. En la pantalla Resumen de cambios, deje la configuración con sus valores predeterminados y seleccione Finalizar para completar el flujo de trabajo.

Visual Studio muestra un resumen de las dependencias del servicio, lo que incluye la conexión a LocalDB.

A screenshot showing how to add a migration using Visual Studio.

Luego, deberá crear una migración inicial y usarla para actualizar la base de datos local con el esquema correcto para la aplicación de tareas pendientes.

  1. Seleccione el icono ..., que se encuentra a la derecha de la lista de dependencias de servicio que hay junto a la conexión LocalDB, y elija Agregar migración.
  2. En el cuadro de diálogo Migraciones de Entity Framework, espere un momento para que Visual Studio busque la clase DbContext que se incluye en el proyecto. Una vez cargados los valores, seleccione Finalizar.
  3. Visual Studio genera la carpeta Migrations en el proyecto y crea una clase de migraciones inicial. Esta clase se puede usar para actualizar la base de datos con el esquema correcto.
  4. Vuelva a seleccionar el icono ... que se encuentra junto al servicio LocalDB y seleccione Actualizar base de datos.
  5. En el cuadro de diálogo Migraciones de Entity Framework, espere un momento para que Visual Studio vuelva a buscar la clase DbContext y elija Finalizar. Visual Studio ejecuta la migración y crea el esquema de la base de datos en el servidor de LocalDB.

Para iniciar el proyecto, seleccione el botón de ejecución de DotNetCoreSqlDb en la parte superior de la ventana de Visual Studio.

Cuando se cargue la aplicación, compruebe que la base de datos funciona correctamente, para lo que debe especificar una nueva tarea pendiente. La tarea pendiente aparece en la vista de lista principal de la página principal de la aplicación.

Exploración de la configuración de inicio de la aplicación

La aplicación de ejemplo incluye el siguiente código en el archivo Program.cs:

if(builder.Environment.IsDevelopment())
{
    builder.Services.AddDbContext<MyDatabaseContext>(options =>
        options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
}
else
{
    builder.Services.AddDbContext<MyDatabaseContext>(options =>
        options.UseSqlServer(Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")));
}

Este código aplica las siguientes configuraciones:

  • Cuando la aplicación se ejecuta localmente, la cadena de conexión localdb se extrae del archivo appsettings.json y se proporciona a Entity Framework. Esta configuración permite que la cadena de conexión localdb se proteja en el control de código fuente para que otros desarrolladores puedan conectarse fácilmente a una base de datos local durante el desarrollo. También permite que las migraciones de Entity Framework se ejecuten localmente. De forma predeterminada, Entity Framework no detectará las cadenas de conexión almacenadas en variables de entorno al ejecutar migraciones.
  • Cuando la aplicación se ejecuta en los flujos de trabajo de Acciones de GitHub o en producción, la cadena de conexión se extrae de las variables de entorno. Las variables de entorno pueden impedir que las cadenas de conexión seguras de producción se protejan en el control de código fuente o se incluyan en los archivos de configuración.

Creación de los servicios de Azure

La aplicación requerirá que se creen los siguientes servicios de Azure para una implementación correcta:

  • Container App: se requiere para hospedar y ejecutar la aplicación implementada.
  • Container Registry: almacena el artefacto de imagen compilado de la aplicación en contenedor.
  • SQL Database: una base de datos de Azure SQL para almacenar los datos de la aplicación.

Las características de publicación de Visual Studio pueden controlar la creación de estos recursos.

Creación de Azure Container App y Azure Container Registry

  1. En el Explorador de soluciones de Visual Studio, haga clic con el botón derecho en el nodo del proyecto de nivel superior y seleccione Publicar.

  2. En el cuadro de diálogo de publicación, seleccione Azure como destino de implementación y, después, seleccione Siguiente.

  3. Para el destino específico, seleccione Azure Container Apps (Linux) y después Siguiente.

  4. Cree una aplicación de contenedor en la que realizar la implementación. Seleccione el botón + Crear nuevo para abrir un cuadro de diálogo nuevo y escriba los siguientes valores:

    A screenshot showing how to create a container app.

    • Nombre de la aplicación de contenedor: deje el valor predeterminado o escriba un nombre.
    • Nombre de la suscripción: seleccione la suscripción en la que se va a realizar la implementación.
    • Grupo de recursos: seleccione Nuevo y cree un grupo de recursos denominado msdocs-app-db-ef.
    • Entorno de aplicaciones de contenedor: seleccione Nuevo para abrir el cuadro de diálogo de entorno de aplicaciones de contenedor y escriba los valores siguientes:
      • Nombre del entorno: mantenga el valor predeterminado.
      • Ubicación: seleccione una ubicación cerca de usted.
      • Área de trabajo de Azure Log Analytics: seleccione Nuevo para abrir el cuadro de diálogo Área de trabajo de Log Analytics.
        • Nombre: deje el valor predeterminado.
        • Ubicación: seleccione una ubicación cercana a usted y, después, seleccione Aceptar para cerrar el cuadro de diálogo.
      • Seleccione Aceptar para cerrar el cuadro de diálogo del entorno de aplicaciones de contenedor.
    • Seleccione Crear para cerrar el cuadro de diálogo de aplicaciones de contenedor original. Visual Studio crea el recurso de aplicación de contenedor en Azure.
  5. Una vez que se crea el recurso, asegúrese de que está seleccionado en la lista de aplicaciones de contenedor y, después, seleccione Siguiente.

  6. Tendrá que crear una instancia de Azure Container Registry para almacenar el artefacto de imagen publicado para la aplicación. Seleccione el icono + de color verde en la pantalla del registro de contenedor.

    A screenshot showing how to create a new container registry.

  7. Deje los valores predeterminados y, después, seleccione Crear.

  8. Tras crear el registro de contenedor, asegúrese de que está seleccionado y, después, seleccione Siguiente.

  9. En la pantalla Tipo de implementación, seleccione CI/CD mediante flujos de trabajo de Acciones de GitHub (genera un archivo yml) y, después, elija Finalizar. Si Visual Studio le pide que habilite el usuario administrador para acceder al contenedor de Docker publicado, seleccione .

Visual Studio crea y muestra el perfil de publicación. La mayoría de los pasos y detalles de publicación se describen en el archivo .yml de Acciones de GitHub, que se puede ver haciendo clic en el botón Editar flujo de trabajo de la vista resumen del perfil de publicación. Este archivo se trata con mayor profundidad en un lugar posterior del artículo.

Creación de la base de datos de Azure SQL

  1. En el Explorador de soluciones, haga clic con el botón derecho en el nodo Servicios conectados y seleccione Agregar > Base de datos de SQL Server.
  2. En el cuadro de diálogo Conectar con dependencia, seleccione Azure SQL Base de datos y, luego, elija Siguiente.
  3. Seleccione + Crear nuevo para agregar una base de datos nueva.
  4. En el cuadro de diálogo Azure SQL Database, escriba los siguientes valores:
    • Nombre de base de datos: deje el valor predeterminado.
    • Nombre de suscripción: seleccione la misma suscripción que antes.
    • Grupo de recursos: seleccione el mismo grupo msdocs-app-db-ef creado anteriormente.
    • Servidor de bases de datos: seleccione Nuevo... y, después, escriba los siguientes valores en el nuevo elemento emergente:
      • Nombre del servidor de bases de datos: escriba un nombre de servidor único o anexe números aleatorios al final del nombre que se genera automáticamente.
      • Ubicación: elija una ubicación cercana a usted.
      • Nombre de usuario del administrador: escriba el valor que desee.
      • Contraseña del administrador: escriba el valor que desee.
      • Contraseña del administrador (confirmar): escriba la misma contraseña para confirmar. Seleccione Aceptar para cerrar el cuadro de diálogo de SQL Server
    • Seleccione Crear para crear el servidor de SQL Server y la base de datos SQL.
    • Cuando finalice la operación, seleccione el servidor en la lista y elija Siguiente.
  5. En el cuadro de diálogo Conectar a Azure SQL Database, deje los valores predeterminados, pero asegúrese de que No está seleccionado en la parte inferior en la opción Guardar valor de cadena de conexión en.
  6. Seleccione Finalizar y Visual Studio creará los recursos de SQL.

Conexión de Container App a Azure SQL

  1. En la página de información general de la instancia de Container App que creó, seleccione Conector de servicio (versión preliminar) en el panel de navegación izquierdo.

  2. Seleccione + Crear para crear una nueva conexión.

  3. En el control flotante Crear conexión, escriba los siguientes valores:

    • Contenedor: seleccione el contenedor dotnetcoresqldb que ha creado.

    • Tipo de servicio: seleccione Base de datos SQL.

    • Suscripción: seleccione la misma suscripción que usó para crear la aplicación de contenedor.

    • Nombre de conexión: deje el valor predeterminado.

    • SQL Server: seleccione el servidor de bases de datos que creó anteriormente.

    • Base de datos SQL: seleccione la bases de datos que creó anteriormente.

    • Tipo de cliente: seleccione .NET.

      A screenshot showing how to use service connector.

  4. Seleccione Siguiente: Autenticación y escriba los valores siguientes:

    • Seleccione Cadena de conexión para el tipo de autenticación.
    • Nombre de usuario: escriba el nombre de usuario que utilizó al crear el servidor de bases de datos.
    • Contraseña: escriba la contraseña que utilizó al crear el servidor de bases de datos.
  5. Deje el resto de la configuración con los valores predeterminados y seleccione Siguiente: Redes.

  6. Deje el valor predeterminado seleccionado y elija Siguiente: Revisar y crear.

  7. Una vez que Azure valide la configuración, seleccione Crear.

Poco después debería aparecer la conexión a la base de datos SQL. Seleccione la flecha para expandir la conexión y vea el valor AZURE_SQL_CONNECTIONSTRING. Este nombre de conexión coincide con el nombre de la cadena de conexión de la variable de entorno definida en la aplicación de ejemplo.

Configuración de un flujo de trabajo de Acciones de GitHub

GitHub puede usar el archivo de flujo de trabajo de Acciones de GitHub generado por Visual Studio para compilar e implementar la aplicación en Azure cuando se insertan cambios. Actualmente, este proceso funcionaría, pero la aplicación implementada produciría una excepción. Aunque se creó la base de datos de Azure SQL, se debe agregar un paso al flujo de trabajo de Acciones de GitHub para generar el esquema. La cadena de conexión de la base de datos de Azure SQL se puede almacenar de forma segura como un secreto en GitHub y el flujo de trabajo la puede recuperar cuando se ejecuta.

Recuperación de la cadena de conexión y su incorporación a los secretos de GitHub

  1. En Azure Portal, busque la base de datos que creó en la barra de búsqueda principal y selecciónela en los resultados.

  2. En la página de información general de la base de datos, seleccione Cadenas de conexión en el panel de navegación izquierdo.

  3. En la pestaña ADO.NET, copie la cadena de conexión fuera del campo de formulario.

    A screenshot showing how to retrieve the connection string.

  4. Vaya al repositorio bifurcado de GitHub de la aplicación.

  5. En la pestaña Configuración, seleccione Secretos > Acciones en el panel de navegación izquierdo y, después, elija Nuevo secreto de repositorio.

  6. En la página Nuevo secreto, especifique los siguientes valores:

    • Nombre: escriba en un nombre de DbConnection.

    • Secreto: pegue la cadena de conexión copiada de Azure. Asegúrese de reemplazar el marcador de posición de la contraseña en la cadena de conexión por la contraseña que eligió al crear la base de datos.

    • Seleccione Add secret (Agregar secreto).

      A screenshot showing how to create a GitHub secret.

La cadena de conexión ahora se almacena de forma segura en los secretos del repositorio de GitHub y se puede recuperar mediante un flujo de trabajo de GitHub.

Modificación del flujo de trabajo de Acciones de GitHub para habilitar migraciones

  1. Abra el archivo .yml del flujo de trabajo de Acciones de GitHub generado por Visual Studio, para lo que debe seleccionar el botón Editar flujo de trabajo en la página de resumen de publicación.

    A screenshot showing how to edit the workflow.

  2. Anexe el siguiente YAML al final del archivo del flujo de trabajo:

    - name: Run EF 
      run: | 
        dotnet tool install --global dotnet-ef
        dotnet tool restore
        dotnet ef database update -p DotNetCoreSqlDb --connection '${{ secrets.DBConnection }}'
    

    Este código instala las herramientas de línea de comandos de Entity Framework y ejecuta las migraciones de la aplicación. Cuando se ejecuta el flujo de trabajo, el código también usa el parámetro connection del comando database update para invalidar la cadena de conexión localdb almacenada en el archivo appsettings.jsoncon el valor que se agregó a los secretos de GitHub.

Ejecución del flujo de trabajo de Acciones de GitHub y prueba de la implementación

  1. Confirme los cambios en la aplicación e insértela en el repositorio bifurcado mediante el siguiente comando:

    git add --all
    git commit -m "Added GitHub Actions workflow"
    git push
    
  2. Vaya al repositorio de GitHub y seleccione la pestaña Acciones. Si la inserción se realizó correctamente, debería haberse desencadenado automáticamente una ejecución de flujo de trabajo.

  3. Seleccione el flujo de trabajo activo para ver los detalles del registro de cada paso a medida que se completan. La migración se ejecuta por última vez para actualizar la base de datos en Azure.

    A screenshot showing the GitHub action workflow.

Tras completarse el flujo de trabajo, la aplicación se implementa en Azure Container Apps y se conecta a la base de datos con un esquema actualizado.

Para probar la implementación, vaya a la página principal de la aplicación contenedora y cree una tarea pendiente, tal como lo hizo localmente. La dirección URL de la aplicación contenedora se puede encontrar en la página de información general de la aplicación en Azure Portal.