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.
Si no tiene una aplicación existente, registre una nueva aplicación de Microsoft Entra ID 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 suclient-id
. Laid
esAPPLICATION-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 deAZURE_CLIENT_ID
más adelante.Crear una entidad de servicio. Reemplace
$appID
por el valor de appId de la salida de JSON.Este comando genera una salida JSON con una entidad de servicio
id
. La entidad de servicioid
se usa como valor del argumento--assignee-object-id
en el comandoaz role assignment create
del paso siguiente.Copie el valor
appOwnerOrganizationId
de la salida JSON que se usará como secreto de GitHub paraAZURE_TENANT_ID
más adelante.az ad sp create --id $appId
Cree una asignación de roles para la nueva entidad de servicio. De forma predeterminada, la asignación de roles se vinculará a la suscripción predeterminada. Reemplace
$subscriptionId
por el identificador de la suscripción,$resourceGroupName
por el nombre del grupo de recursos y$servicePrincipalId
por el id. de la entidad de servicio recién creada.az role assignment create --role contributor --subscription $subscriptionId --assignee-object-id $servicePrincipalId --assignee-principal-type ServicePrincipal --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName
Ejecute el siguiente comando a fin de crear una credencial de identidad federada para la aplicación de Microsoft Entra ID.
- Reemplace
APPLICATION-OBJECT-ID
por el valor objectId (generado al crear la aplicación) de la aplicación de Microsoft Entra ID. - 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
orepo: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
.
- Trabajos en el entorno de Acciones de GitHub:
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" ] }
- Reemplace
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.
En GitHub, vaya al repositorio.
Vaya a Configuración en el menú de navegación.
Seleccione Seguridad > Secretos y variables > Acciones.
Seleccione New repository secret (Nuevo secreto del repositorio).
Cree secretos para
AZURE_CLIENT_ID
,AZURE_TENANT_ID
yAZURE_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 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:
- Restaura el código fuente con la acción de restauración.
- Inicia sesión en Azure con la acción de inicio de sesión de Azure y recopila información del entorno y los recursos de Azure.
- Implementa recursos con la acción para implementar Azure Resource Manager.
Para ejecutar el flujo de trabajo de creación de recursos de Azure:
Abra el archivo
azuredeploy.yaml
en.github/workflows
en el repositorio.Actualice el valor de
AZURE_RESOURCE_GROUP
al nombre de su grupo de recursos.Actualice los valores de
WEB_APP_NAME
ySQL_SERVER_NAME
al nombre de la aplicación web y al nombre del servidor SQL.Vaya a Acciones y seleccione Ejecutar flujo de trabajo.
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.
Adición de registros de contenedor y secretos de SQL
En Azure Portal, abra la instancia recién creada de Azure Container Registry en su grupo de recursos.
Vaya a Claves de acceso y copie los valores de nombre de usuario y contraseña.
Cree nuevos secretos de GitHub para
ACR_USERNAME
y una contraseñaACR_PASSWORD
en el repositorio.En Azure Portal, abra la base de datos Azure SQL. Haga clic en Mostrar cadenas de conexión y copie el valor.
Cree un secreto para
SQL_CONNECTION_STRING
. Reemplace{your_password}
con suSQL_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:
- El trabajo de compilación restaura el código fuente con la acción de restauración. A continuación, el trabajo usa la acción de inicio de sesión de Docker y un script personalizado para autenticarse con Azure Container Registry, compilar una imagen de contenedor e implementarla en Azure Container Registry.
- El trabajo de implementación inicia sesión en Azure con la acción de inicio de sesión de Azure y recopila información del entorno y los recursos de Azure. A continuación, el trabajo actualiza la configuración de la aplicación web con la acción de configuración de Azure App Service y se implementa en un espacio de ensayo de App Service con la acción de Azure Web Deploy. Por último, el trabajo ejecuta un script personalizado para actualizar la base de datos de SQL y cambia el espacio de ensayo a producción.
Para ejecutar el flujo de trabajo de compilación, inserción e implementación:
Abra el archivo
build-deploy.yaml
en.github/workflows
en el repositorio.Compruebe que las variables de entorno de
AZURE_RESOURCE_GROUP
yWEB_APP_NAME
coinciden con las deazuredeploy.yaml
.Actualice el valor
ACR_LOGIN_SERVER
del servidor de inicio de sesión de Azure Container Registry.