Tutorial: Uso de Acciones de GitHub para implementar en un contenedor personalizado de App Service y conectarse a una base de datos

En este tutorial le guiaremos a través de la configuración de un flujo de trabajo de Acciones de GitHub para implementar una aplicación ASP.NET Core en contenedores con un back-end de Azure SQL Database. Cuando haya terminado, tendrá una aplicación ASP.NET en ejecución en Azure y conectada a SQL Database. En primer lugar, deberá crear los recursos de Azure con una plantilla de ARM del flujo de trabajo de Acciones de GitHub.

En este tutorial, aprenderá a:

  • Usar un flujo de trabajo de Acciones de GitHub para agregar recursos a Azure con una plantilla de Azure Resource Manager (plantilla ARM).
  • Usar un flujo de trabajo de Acciones de GitHub para crear un contenedor con los últimos cambios de la aplicación web.

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Requisitos previos

Para completar este tutorial, necesita:

  • Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
  • Una cuenta de GitHub. Si no tiene ninguna, regístrese gratis.
    • Un repositorio de GitHub para almacenar las plantillas de Resource Manager y los archivos del flujo de trabajo. Para crear uno, vea Creación de un repositorio.

Descarga del ejemplo

Bifurque el proyecto de ejemplo en el repositorio de muestras de Azure.

https://github.com/Azure-Samples/dotnetcore-containerized-sqldb-ghactions/

Creación del grupo de recursos

Abra Azure Cloud Shell en https://shell.azure.com. También puede usar la CLI de Azure si la ha instalado localmente. (Para obtener más información sobre Cloud Shell, consulte el artículo de información general de Cloud Shell).

    az group create --name {resource-group-name} --location {resource-group-location}

Genere las credenciales de implementación.

Open ID Connect es un método de autenticación que usa tokens de corta duración. La configuración de OpenID Connect con Acciones de GitHub es un proceso más complejo que ofrece seguridad reforzada.

  1. Si no tiene una aplicación existente, registre una nueva aplicación de Microsoft Entra y una entidad de servicio que puedan acceder a los recursos.

    az ad app create --display-name myApp
    

    Este comando genera un JSON de salida con un appId que es su client-id. La objectId es APPLICATION-OBJECT-ID y se usará para crear credenciales federadas con llamadas a la Graph API. Guarde el valor que se usará como secreto de GitHub de AZURE_CLIENT_ID más adelante.

  2. Crear una entidad de servicio. Reemplace $appID por el valor de appId de la salida de JSON. Este comando genera una salida de JSON con un objectId diferente y se usará en el siguiente paso. El nuevo objectId es assignee-object-id.

    Este comando genera una salida de JSON con un objectId diferente y se usará en el siguiente paso. El nuevo objectId es assignee-object-id.

    Copie el appOwnerTenantId para usarlo como secreto de GitHub para AZURE_TENANT_ID más adelante.

     az ad sp create --id $appId
    
  3. Cree una asignación de roles por suscripción y objeto. De forma predeterminada, la asignación de roles se vinculará a la suscripción predeterminada. Reemplace $subscriptionId por el ID de suscripción, $resourceGroupName por el nombre del grupo de recursos y $assigneeObjectId por el valor de assignee-object-id generado (el id. de objeto de la entidad de servicio recién creada).

    az role assignment create --role contributor --subscription $subscriptionId --assignee-object-id  $assigneeObjectId --assignee-principal-type ServicePrincipal --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName
    
  4. Ejecute el siguiente comando para crear una credencial de identidad federada para la aplicación de Microsoft Entra.

    • Reemplace APPLICATION-OBJECT-ID por el objectId (generado al crear la aplicación) de la aplicación de Microsoft Entra.
    • Establezca un valor para CREDENTIAL-NAME al que haga referencia más adelante.
    • Establezca subject. Este valor lo define GitHub en función del flujo de trabajo:
      • Trabajos en el entorno de Acciones de GitHub: repo:< Organization/Repository >:environment:< Name >
      • En el caso de los trabajos no vinculados a un entorno, incluya la ruta de acceso de referencia para una rama o etiqueta en función de la ruta de acceso de referencia usada para desencadenar el flujo de trabajo: repo:< Organization/Repository >:ref:< ref path>. Por ejemplo, repo:n-username/ node_express:ref:refs/heads/my-branch o repo:n-username/ node_express:ref:refs/tags/my-tag.
      • En el caso de los flujos de trabajo desencadenados por un evento de solicitud de incorporación de cambios: repo:< Organization/Repository >:pull_request.
    az ad app federated-credential create --id <APPLICATION-OBJECT-ID> --parameters credential.json
    ("credential.json" contains the following content)
    {
        "name": "<CREDENTIAL-NAME>",
        "issuer": "https://token.actions.githubusercontent.com",
        "subject": "repo:octo-org/octo-repo:environment:Production",
        "description": "Testing",
        "audiences": [
            "api://AzureADTokenExchange"
        ]
    }
    

Para más información sobre cómo crear una aplicación de directorio activo, un principal de servicio y credenciales federadas en el portal Azure, consulte Conectar GitHub y Azure.

Configuración del secreto de GitHub para la autenticación

Debe especificar el identificador de cliente, el identificador de inquilino y el identificador de suscripción en la acción de inicio de sesión. Estos valores se pueden proporcionar directamente en el flujo de trabajo o se pueden almacenar en secretos de GitHub y se puede hacer referencia a ellos en el flujo de trabajo. Guardar los valores como secretos de GitHub es la opción más segura.

  1. En GitHub, vaya al repositorio.

  2. Vaya a Configuración en el menú de navegación.

  3. Seleccione Seguridad > Secretos y variables > Acciones.

    Captura de pantalla de la adición de un secreto

  4. Seleccione New repository secret (Nuevo secreto del repositorio).

  5. Cree secretos para AZURE_CLIENT_ID, AZURE_TENANT_ID y AZURE_SUBSCRIPTION_ID. Use estos valores de la aplicación de Microsoft Entra para los secretos de GitHub:

    Secreto de GitHub Aplicación de Microsoft Entra
    AZURE_CLIENT_ID Id. de aplicación (cliente)
    AZURE_TENANT_ID Id. de directorio (inquilino)
    AZURE_SUBSCRIPTION_ID Id. de suscripción
  6. Guarde todos los secretos, para lo que debe seleccionar Add secret (Agregar secreto).

Adición de un secreto de SQL Server

Cree un nuevo secreto en el repositorio para SQL_SERVER_ADMIN_PASSWORD. Este secreto puede ser cualquier contraseña que cumpla con los estándares de Azure para la seguridad de contraseñas. Tenga en cuenta que no podrá volver a acceder a esta contraseña, así que guárdela por separado.

Creación de recursos de Azure

El flujo de trabajo de creación de recursos de Azure ejecuta una plantilla de ARM para implementar recursos en Azure. El flujo de trabajo:

Para ejecutar el flujo de trabajo de creación de recursos de Azure:

  1. Abra el archivo azuredeploy.yaml en .github/workflows en el repositorio.

  2. Actualice el valor de AZURE_RESOURCE_GROUP al nombre de su grupo de recursos.

  3. Actualice los valores de WEB_APP_NAME y SQL_SERVER_NAME al nombre de la aplicación web y al nombre del servidor SQL.

  4. Vaya a Acciones y seleccione Ejecutar flujo de trabajo.

    Ejecute el flujo de trabajo de Acciones de GitHub para agregar recursos.

  5. Compruebe que su acción se haya ejecutado correctamente; para ello, compruebe si hay una marca de verificación verde en la página Acciones.

    Ejecución exitosa de creación de recursos.

Adición de registros de contenedor y secretos de SQL

  1. En Azure Portal, abra la instancia recién creada de Azure Container Registry en su grupo de recursos.

  2. Vaya a Claves de acceso y copie los valores de nombre de usuario y contraseña.

  3. Cree nuevos secretos de GitHub para ACR_USERNAME y una contraseña ACR_PASSWORD en el repositorio.

  4. En Azure Portal, abra la base de datos Azure SQL. Haga clic en Mostrar cadenas de conexión y copie el valor.

  5. Cree un secreto para SQL_CONNECTION_STRING. Reemplace {your_password} con su SQL_SERVER_ADMIN_PASSWORD.

Compilación, inserción e implementación de la imagen

El flujo de trabajo de compilación, inserción e implementación crea un contenedor con los últimos cambios de la aplicación, envía el contenedor a Azure Container Registry y actualiza el espacio de ensayo de la aplicación web para que apunte al último contenedor insertado. El flujo de trabajo contiene un trabajo de compilación e implementación:

Para ejecutar el flujo de trabajo de compilación, inserción e implementación:

  1. Abra el archivo build-deploy.yaml en .github/workflows en el repositorio.

  2. Compruebe que las variables de entorno de AZURE_RESOURCE_GROUP y WEB_APP_NAME coinciden con las de azuredeploy.yaml.

  3. Actualice el valor ACR_LOGIN_SERVER del servidor de inicio de sesión de Azure Container Registry.

Pasos siguientes