Esercitazione: Usare GitHub Actions per eseguire la distribuzione in un contenitore personalizzato servizio app e connettersi a un database
Questa esercitazione illustra come configurare un flusso di lavoro di GitHub Actions per distribuire un'applicazione ASP.NET Core in contenitori con un back-end database SQL di Azure. Al termine sarà disponibile un'app ASP.NET in esecuzione in Azure e connessa al database SQL. Prima di tutto si creeranno risorse di Azure con un flusso di lavoro GitHub Actions modello di Resource Manager.
In questa esercitazione apprenderai a:
- Usare un flusso di lavoro di GitHub Actions per aggiungere risorse ad Azure con un modello di Azure Resource Manager (modello di Resource Manager)
- Usare un flusso di lavoro di GitHub Actions per compilare un contenitore con le modifiche più recenti dell'app Web
Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.
Prerequisiti
Per completare questa esercitazione, sono necessari gli elementi seguenti:
- Un account Azure con una sottoscrizione attiva. Creare un account gratuitamente.
- Un account GitHub. Se non è disponibile, iscriversi per riceverne uno gratuito.
- Un repository GitHub per archiviare i modelli di Resource Manager e i file del flusso di lavoro. Per crearne uno, vedere Creazione di un nuovo repository.
Scaricare l'esempio
Creare una copia tramite fork del progetto di esempio nel repository Azure Samples.
https://github.com/Azure-Samples/dotnetcore-containerized-sqldb-ghactions/
Creare il gruppo di risorse
Aprire Azure Cloud Shell in https://shell.azure.com. In alternativa, è possibile usare l'interfaccia della riga di comando di Azure se è stata installata in locale. Per altre informazioni su Cloud Shell, vedere Panoramica di Cloud Shell.
az group create --name {resource-group-name} --location {resource-group-location}
Generare le credenziali per la distribuzione
OpenID Connect è un metodo di autenticazione che utilizza token di breve durata. Configurare OpenID Connect con GitHub Actions è un processo più complesso che offre una maggiore sicurezza.
Se non si dispone di un'applicazione esistente, registrare una nuova applicazione Microsoft Entra e un'entità servizio in grado di accedere alle risorse.
az ad app create --display-name myApp
Questo comando genererà un oggetto JSON con un
appId
che corrisponde aclient-id
. IlobjectId
èAPPLICATION-OBJECT-ID
e verrà usato per la creazione di credenziali federate con chiamate API Graph. Salvare il valore da usare comeAZURE_CLIENT_ID
segreto GitHub in un secondo momento.Creare un'entità servizio. Sostituire il
$appID
con il valore appId dall’output JSON. Questo comando genera l'output JSON con una diversaobjectId
che verrà usata nel passaggio successivo. Il nuovoobjectId
èassignee-object-id
.Questo comando genera un output JSON con una diversa
objectId
e verrà usato nel passaggio successivo. Il nuovoobjectId
èassignee-object-id
.Copiare
appOwnerTenantId
da usare come segreto GitHub perAZURE_TENANT_ID
in un secondo momento.az ad sp create --id $appId
Creare una nuova assegnazione di ruolo per sottoscrizione e oggetto. Per impostazione predefinita, l'assegnazione di ruolo verrà associata alla sottoscrizione predefinita. Sostituire
$subscriptionId
con l'ID sottoscrizione,$resourceGroupName
con il nome del gruppo di risorse e$assigneeObjectId
con ilassignee-object-id
generato (l'ID oggetto dell'entità servizio appena creato).az role assignment create --role contributor --subscription $subscriptionId --assignee-object-id $assigneeObjectId --assignee-principal-type ServicePrincipal --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName
Eseguire il comando seguente per creare una nuova credenziale di identità federata per l'applicazione Microsoft Entra.
- Sostituire
APPLICATION-OBJECT-ID
con il objectId (generato durante la creazione dell'app) per l'applicazione Microsoft Entra. - Impostare un valore per
CREDENTIAL-NAME
a cui fare riferimento in seguito. - Impostare
subject
. Il valore di questo valore è definito da GitHub a seconda del flusso di lavoro:- Processi nell'ambiente GitHub Actions:
repo:< Organization/Repository >:environment:< Name >
- Per i processi non associati a un ambiente, includere il percorso di riferimento per branch/tag in base al percorso di riferimento usato per attivare il flusso di lavoro:
repo:< Organization/Repository >:ref:< ref path>
. Ad esempio,repo:n-username/ node_express:ref:refs/heads/my-branch
orepo:n-username/ node_express:ref:refs/tags/my-tag
. - Per i flussi di lavoro attivati da un evento di richiesta pull:
repo:< Organization/Repository >:pull_request
.
- Processi nell'ambiente GitHub Actions:
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" ] }
- Sostituire
Per informazioni su come creare un'applicazione active directory, un'entità servizio e credenziali federate in portale di Azure, vedere Connessione GitHub e Azure.
Configurare il segreto GitHub per l'autenticazione
È necessario specificare l'ID client, l'ID tenant el'ID sottoscrizione dell'applicazione all'azione di accesso. Questi valori possono essere forniti direttamente nel flusso di lavoro oppure possono essere archiviati nei segreti gitHub e riportati nel flusso di lavoro. Salvare i valori come segreti GitHub è l'opzione più sicura.
In GitHub, andare al proprio repository.
Passare a Impostazioni nel menu di spostamento.
Selezionare Segreti di sicurezza > e variabili > Azioni.
Selezionare Nuovo segreto repository.
Creare segreti per
AZURE_CLIENT_ID
,AZURE_TENANT_ID
eAZURE_SUBSCRIPTION_ID
. Usare questi valori dell'applicazione Microsoft Entra per i segreti di GitHub:Segreto GitHub Applicazione Microsoft Entra AZURE_CLIENT_ID ID applicazione (client) AZURE_TENANT_ID ID della directory (tenant) AZURE_SUBSCRIPTION_ID ID sottoscrizione Salvare ogni segreto selezionando Aggiungi segreto.
Aggiungere un segreto di SQL Server
Creare un nuovo segreto nel repository per SQL_SERVER_ADMIN_PASSWORD
. Questo segreto può essere qualsiasi password che soddisfi gli standard di Azure per la sicurezza delle password. Non sarà possibile accedere nuovamente a questa password, quindi salvarla separatamente.
Creare risorse Azure
Il flusso di lavoro crea risorse di Azure esegue un modello di Resource Manager per distribuire le risorse in Azure. Flusso di lavoro:
- Estrae il codice sorgente con l'azione Checkout.
- Accedere ad Azure con l'azione Di accesso di Azure e raccogliere informazioni sull'ambiente e sulle risorse di Azure.
- Distribuisce le risorse con l'azione Distribuisci di Azure Resource Manager.
Per eseguire il flusso di lavoro crea risorse di Azure:
Aprire il
azuredeploy.yaml
file all'interno.github/workflows
del repository.Aggiornare il valore di con il nome del gruppo di
AZURE_RESOURCE_GROUP
risorse.Aggiornare i valori di e
SQL_SERVER_NAME
al nome dell'appWEB_APP_NAME
Web e al nome di SQL Server.Passare a Azioni e selezionare Esegui flusso di lavoro.
Verificare che l'azione sia stata eseguita correttamente controllando la presenza di un segno di spunta verde nella pagina Azioni .
Aggiungere il registro contenitori e i segreti SQL
Nella portale di Azure aprire il Registro Azure Container appena creato nel gruppo di risorse.
Passare a Chiavi di accesso e copiare i valori di nome utente e password.
Creare nuovi segreti GitHub per
ACR_USERNAME
eACR_PASSWORD
password nel repository.Nella portale di Azure aprire il database SQL di Azure. Aprire le stringhe di Connessione ion e copiare il valore.
Creare un nuovo segreto per
SQL_CONNECTION_STRING
. Sostituire{your_password}
con ilSQL_SERVER_ADMIN_PASSWORD
.
Compilare, eseguire il push e distribuire l'immagine
Il flusso di lavoro di compilazione, push e distribuzione compila un contenitore con le modifiche più recenti dell'app, inserisce il contenitore in Registro Azure Container e aggiorna lo slot di gestione temporanea dell'applicazione Web in modo che punti al contenitore più recente sottoposto a push. Il flusso di lavoro contiene un processo di compilazione e distribuzione:
- Il processo di compilazione estrae il codice sorgente con l'azione Checkout. Il processo usa quindi l'azione di accesso Docker e uno script personalizzato per l'autenticazione con Registro Azure Container, compilare un'immagine del contenitore e distribuirla in Registro Azure Container.
- Il processo di distribuzione accede ad Azure con l'azione di accesso di Azure e raccoglie informazioni sull'ambiente e sulle risorse di Azure. Il processo aggiorna quindi l'Impostazioni dell'app Web con l'azione Impostazioni del servizio app Azure e distribuisce in uno slot di staging servizio app con l'azione Distribuzione Web di Azure. Infine, il processo esegue uno script personalizzato per aggiornare il database SQL e scambia lo slot di staging nell'ambiente di produzione.
Per eseguire il flusso di lavoro di compilazione, push e distribuzione:
Aprire il
build-deploy.yaml
file all'interno.github/workflows
del repository.Verificare che le variabili di ambiente per
AZURE_RESOURCE_GROUP
eWEB_APP_NAME
corrispondano a quelle inazuredeploy.yaml
.Aggiornare il valore per il
ACR_LOGIN_SERVER
server di accesso Registro Azure Container.