Usare il flusso di lavoro di GitHub Actions per distribuire il sito Web statico in Archiviazione di Azure
Articolo
Introduzione a GitHub Actions usando un flusso di lavoro per distribuire un sito statico in un account di archiviazione di Azure. Dopo aver configurato un flusso di lavoro di GitHub Actions, sarà possibile distribuire automaticamente il sito in Azure da GitHub quando si apportano modifiche al codice del sito.
Nota
Se si usa App Web statiche di Azure, non è necessario configurare manualmente un flusso di lavoro di GitHub Actions.
App Web statiche di Azure crea automaticamente un flusso di lavoro di GitHub Actions.
È comune usare una rete per la distribuzione di contenuti (rete CDN) per ridurre la latenza agli utenti in tutto il mondo e ridurre il numero di transazioni all'account di archiviazione. La distribuzione di contenuto statico in un servizio di archiviazione basato sul cloud può ridurre la necessità di un'istanza di calcolo potenzialmente costosa. Per altre informazioni, vedere Modello di hosting di contenuti statici.
az ad sp create-for-rbac --name "myML" --role contributor \
--scopes /subscriptions/<subscription-id>/resourceGroups/<group-name> \
--json-auth
Il parametro --json-auth è disponibile nelle versioni >dell'interfaccia della riga di comando di Azure = 2.51.0. Versioni precedenti a questo utilizzo --sdk-auth con un avviso di deprecazione.
Nell'esempio precedente sostituire i segnaposto con l'ID sottoscrizione, il nome del gruppo di risorse e il nome dell'app. L'output è un oggetto JSON con le credenziali di assegnazione di ruolo che forniscono l'accesso all'app del servizio app simile a questo esempio. Copiare l'oggetto JSON per un uso successivo.
OpenID Connessione è un metodo di autenticazione che usa token di breve durata. La configurazione di OpenID Connessione con GitHub Actions è un processo più complesso che offre sicurezza avanzata.
Questo comando restituirà JSON con un oggetto appId che corrisponde a client-id. 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.
Creare un'entità servizio. Sostituire con il $appID valore appId dall'output JSON. Questo comando genera l'output JSON con un'altra objectId operazione verrà usata nel passaggio successivo. Il nuovo objectId è .assignee-object-id
Questo comando genera un output JSON diverso objectId e verrà usato nel passaggio successivo. Il nuovo objectId è .assignee-object-id
Copiare da appOwnerTenantId usare come segreto GitHub per AZURE_TENANT_ID 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 generato assignee-object-id (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 objectId (generato durante la creazione dell'app) per l'applicazione Microsoft Entra.
Impostare un valore per CREDENTIAL-NAME per fare riferimento in un secondo momento.
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"
]
}
Selezionare Segreti di sicurezza > e variabili > Azioni.
Selezionare Nuovo segreto repository.
Incollare l'intero output JSON del comando dell'interfaccia della riga di comando di Azure nel campo del valore del segreto. Assegnare al segreto il nome AZURE_CREDENTIALS.
Selezionare Aggiungi segreto.
È necessario specificare l'ID client, l'ID tenant e l'ID sottoscrizione dell'applicazione all'azione di accesso. Questi valori possono essere forniti direttamente nel flusso di lavoro o possono essere archiviati nei segreti gitHub e a cui si fa riferimento nel flusso di lavoro. Il salvataggio dei valori come segreti GitHub è l'opzione più sicura.
Selezionare Segreti di sicurezza > e variabili > Azioni.
Selezionare Nuovo segreto repository.
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
Salvare ogni segreto selezionando Aggiungi segreto.
Selezionare Set up your workflow yourself (Configurare manualmente il flusso di lavoro).
Eliminare tutti quello che segue la sezione on: del file del flusso di lavoro. Il flusso di lavoro rimanente, ad esempio, potrà essere simile al seguente.
name: CI
on:
push:
branches: [ main ]
Rinominare il flusso di lavoro Blob storage website CI e aggiungere le azioni checkout e login. Queste azioni verificheranno il codice del sito ed eseguiranno l'autenticazione con Azure usando il AZURE_CREDENTIALS segreto GitHub creato in precedenza.
name: Blob storage website CI
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
Usare l'azione dell'interfaccia della riga di comando di Azure per caricare il codice nell'archivio BLOB e per eliminare l'endpoint rete CDN. Per az storage blob upload-batchsostituire il segnaposto con il nome dell'account di archiviazione. Lo script verrà caricato nel $web contenitore. Per az cdn endpoint purgesostituire i segnaposto con il nome del profilo rete CDN, rete CDN nome dell'endpoint e il gruppo di risorse. Per velocizzare l'eliminazione rete CDN, è possibile aggiungere l'opzione --no-wait a az cdn endpoint purge. Per migliorare la sicurezza, è anche possibile aggiungere l'opzione con la --account-keychiave dell'account di archiviazione.
Completare il flusso di lavoro aggiungendo un'azione di disconnessione da Azure. Ecco il flusso di lavoro completato. Il file verrà visualizzato nella cartella .github/workflows del repository.
Selezionare Set up your workflow yourself (Configurare manualmente il flusso di lavoro).
Eliminare tutti quello che segue la sezione on: del file del flusso di lavoro. Il flusso di lavoro rimanente, ad esempio, potrà essere simile al seguente.
name: CI with OpenID Connect
on:
push:
branches: [ main ]
Aggiungere una sezione autorizzazioni.
name: CI with OpenID Connect
on:
push:
branches: [ main ]
permissions:
id-token: write
contents: read
Aggiungere azioni di estrazione e accesso. Queste azioni verificheranno il codice del sito ed eseguiranno l'autenticazione con Azure usando i segreti GitHub creati in precedenza.
name: CI with OpenID Connect
on:
push:
branches: [ main ]
permissions:
id-token: write
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: azure/login@v1
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
Usare l'azione dell'interfaccia della riga di comando di Azure per caricare il codice nell'archivio BLOB e per eliminare l'endpoint rete CDN. Per az storage blob upload-batchsostituire il segnaposto con il nome dell'account di archiviazione. Lo script verrà caricato nel $web contenitore. Per az cdn endpoint purgesostituire i segnaposto con il nome del profilo rete CDN, rete CDN nome dell'endpoint e il gruppo di risorse. Per velocizzare l'eliminazione rete CDN, è possibile aggiungere l'opzione --no-wait a az cdn endpoint purge. Per migliorare la sicurezza, è anche possibile aggiungere l'opzione con la --account-keychiave dell'account di archiviazione.
Completare il flusso di lavoro aggiungendo un'azione di disconnessione da Azure. Ecco il flusso di lavoro completato. Il file verrà visualizzato nella cartella .github/workflows del repository.
Aprire il primo risultato per visualizzare i log dettagliati dell'esecuzione del flusso di lavoro.
Pulire le risorse
Quando il sito Web statico e il repository GitHub non sono più necessari, pulire le risorse distribuite eliminando il gruppo di risorse e il repository GitHub.