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:

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.

  1. 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 a client-id. Il objectId è APPLICATION-OBJECT-ID e verrà usato per la creazione di credenziali federate con chiamate API Graph. Salvare il valore da usare come AZURE_CLIENT_ID segreto GitHub in un secondo momento.

  2. Creare un'entità servizio. Sostituire il $appID con il valore appId dall’output JSON. Questo comando genera l'output JSON con una diversa objectId che verrà usata nel passaggio successivo. Il nuovo objectId è assignee-object-id.

    Questo comando genera un output JSON con una diversa objectId e verrà usato nel passaggio successivo. Il nuovo objectId è assignee-object-id.

    Copiare appOwnerTenantId da usare come segreto GitHub per AZURE_TENANT_ID in un secondo momento.

     az ad sp create --id $appId
    
  3. 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 il assignee-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
    
  4. 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 o repo: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.
    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"
        ]
    }
    

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.

  1. In GitHub, andare al proprio repository.

  2. Passare a Impostazioni nel menu di spostamento.

  3. Selezionare Segreti di sicurezza > e variabili > Azioni.

    Screenshot dell'aggiunta di un segreto

  4. Selezionare Nuovo segreto repository.

  5. Creare segreti per AZURE_CLIENT_ID, AZURE_TENANT_IDe AZURE_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
  6. 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:

Per eseguire il flusso di lavoro crea risorse di Azure:

  1. Aprire il azuredeploy.yaml file all'interno .github/workflows del repository.

  2. Aggiornare il valore di con il nome del gruppo di AZURE_RESOURCE_GROUP risorse.

  3. Aggiornare i valori di e SQL_SERVER_NAME al nome dell'app WEB_APP_NAME Web e al nome di SQL Server.

  4. Passare a Azioni e selezionare Esegui flusso di lavoro.

    Eseguire il flusso di lavoro di GitHub Actions per aggiungere risorse.

  5. Verificare che l'azione sia stata eseguita correttamente controllando la presenza di un segno di spunta verde nella pagina Azioni .

    Esecuzione riuscita della creazione di risorse.

Aggiungere il registro contenitori e i segreti SQL

  1. Nella portale di Azure aprire il Registro Azure Container appena creato nel gruppo di risorse.

  2. Passare a Chiavi di accesso e copiare i valori di nome utente e password.

  3. Creare nuovi segreti GitHub per ACR_USERNAME e ACR_PASSWORD password nel repository.

  4. Nella portale di Azure aprire il database SQL di Azure. Aprire le stringhe di Connessione ion e copiare il valore.

  5. Creare un nuovo segreto per SQL_CONNECTION_STRING. Sostituire {your_password} con il SQL_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:

  1. Aprire il build-deploy.yaml file all'interno .github/workflows del repository.

  2. Verificare che le variabili di ambiente per AZURE_RESOURCE_GROUP e WEB_APP_NAME corrispondano a quelle in azuredeploy.yaml.

  3. Aggiornare il valore per il ACR_LOGIN_SERVER server di accesso Registro Azure Container.

Passaggi successivi