Condividi tramite


Distribuire un contenitore personalizzato nel servizio app usando GitHub Actions

È possibile usare GitHub Actions per creare un flusso di lavoro di sviluppo software automatizzato. È possibile usare l'azione Distribuzione Web di Azure per automatizzare il flusso di lavoro e distribuire contenitori personalizzati nel servizio app di Azure.

Un flusso di lavoro viene definito da un file YAML (con estensione yml) nel percorso /.github/workflows/ del repository. Questa definizione contiene i vari passaggi e parametri presenti nel flusso di lavoro.

Per un flusso di lavoro del contenitore del servizio app, il file include tre sezioni:

Sezione Attività
autenticazione 1. Recuperare un'entità servizio o un profilo di pubblicazione.
2. Creare un segreto GitHub.
Build 1. Creare l'ambiente.
2. Compilare l'immagine del contenitore.
Distribuire 1. Distribuire l'immagine del contenitore.

Prerequisiti

Generare le credenziali per la distribuzione

È consigliabile eseguire l'autenticazione con Servizi app di Azure per GitHub Actions usando OpenID Connect. È anche possibile eseguire l'autenticazione con un'entità servizio o un profilo di pubblicazione.

Per l'autenticazione con Azure, salvare le credenziali del profilo di pubblicazione o l'entità servizio come segreto GitHub. È possibile accedere al segreto all'interno del flusso di lavoro.

Un profilo di pubblicazione è una credenziale a livello di app. Configurare il profilo di pubblicazione come segreto GitHub.

  1. Passare a Servizio app nel portale di Azure.

  2. Nel riquadro Panoramica selezionare Ottieni il profilo di pubblicazione.

    Note

    A partire da ottobre 2020, gli utenti devono impostare l'impostazione dell'app per le app WEBSITE_WEBDEPLOY_USE_SCM Web Linux su trueprima di scaricare il file. Per informazioni su come configurare le impostazioni comuni delle app Web, vedere Configurare un'app del servizio app nel portale di Azure.

  3. Salvare il file scaricato. Utilizza il contenuto del file per creare un segreto su GitHub.

Configurare il segreto GitHub per l'autenticazione

In GitHub esplorare il repository. Selezionare Impostazioni>Sicurezza>Segreti e variabili>Azioni>Nuovo segreto della repository.

Per usare le credenziali a livello di app, incollare il contenuto del file del profilo di pubblicazione scaricato nel campo del valore del segreto. Assegnare al segreto il nome AZURE_WEBAPP_PUBLISH_PROFILE.

Quando si configura il flusso di lavoro GitHub, usare il AZURE_WEBAPP_PUBLISH_PROFILE segreto nell'azione Deploy Azure Web App (Distribuisci app Web di Azure). Ad esempio:

- uses: azure/webapps-deploy@v2
  with:
    publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}

Configurare i segreti di GitHub per il Registro di sistema

Definire i segreti da usare con l'azione Accesso a Docker. L'esempio in questo articolo usa Registro Azure Container per il registro contenitori.

  1. Passare al contenitore nel portale di Azure o Docker e copiare il nome utente e la password. È possibile trovare il nome utente e la password di Registro Azure Container nel portale di Azure inImpostazioni>Chiavi di accesso per il Registro di sistema.

  2. Definire un nuovo segreto per il nome utente del Registro di sistema denominato REGISTRY_USERNAME.

  3. Definire un nuovo segreto per la password del Registro di sistema denominata REGISTRY_PASSWORD.

Compilare l'immagine del contenitore

L'esempio seguente illustra parte del flusso di lavoro che compila un'immagine Docker Node.js. Usare Docker Login per accedere a un registro contenitori privato. Questo esempio usa Registro Azure Container ma l'azione può essere usata anche per altri registri.

name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}
    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

È anche possibile usare Docker sign in per accedere a più registri contenitori contemporaneamente. Questo esempio include due nuovi segreti GitHub per l'autenticazione con docker.io. Nell'esempio si presuppone che sia presente un Dockerfile a livello radice del Registro di sistema.

name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}
    - uses: azure/docker-login@v1
      with:
        login-server: index.docker.io
        username: ${{ secrets.DOCKERIO_USERNAME }}
        password: ${{ secrets.DOCKERIO_PASSWORD }}
    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

L'esempio seguente mostra parte del flusso di lavoro che compila un'immagine Docker di Windows. Usare Docker Login per accedere a un registro contenitori privato. Questo esempio usa Registro Azure Container ma l'azione può essere usata anche per altri registri.

name: Windows Container Workflow
on: [push]
jobs:
  build:
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v2
    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}
    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

È anche possibile usare l'accesso a Docker per accedere a più registri contenitori contemporaneamente. Questo esempio include due nuovi segreti GitHub per l'autenticazione con docker.io. Nell'esempio si presuppone che sia presente un Dockerfile a livello radice del Registro di sistema.

name: Windows Container Workflow
on: [push]
jobs:
  build:
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v2
    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}
    - uses: azure/docker-login@v1
      with:
        login-server: index.docker.io
        username: ${{ secrets.DOCKERIO_USERNAME }}
        password: ${{ secrets.DOCKERIO_PASSWORD }}
    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

Eseguire la distribuzione in un contenitore del servizio app

Per distribuire l'immagine in un contenitore personalizzato nel servizio app, usare l'azione azure/webapps-deploy@v2. Questa azione prevede sette parametri:

Parametro Spiegazione
app-name (Obbligatorio) Nome dell'app di App Service.
publish-profile (Facoltativo) Usato con app Web (Windows e Linux) e contenitori di app Web (Linux). Scenario multi-contenitore non supportato. Pubblicare il contenuto del file del profilo \*.publishsettings con i segreti di Web Deploy.
slot-name (Facoltativo) Inserire uno slot esistente diverso dallo slot di produzione.
package (Facoltativo) Usato solo con le app Web: percorso del pacchetto o della cartella. \*.zip, \*.war, \*.jaro una cartella da distribuire.
images (Obbligatorio) Usato solo con contenitori di app Web: specificare il nome completo dell'immagine del contenitore. Ad esempio, myregistry.azurecr.io/nginx:latest o python:3.12.12-alpine/. Per un'app multi-contenitore, è possibile specificare più nomi di immagine del contenitore (separati da più righe).
configuration-file (Facoltativo) Usato solo con contenitori di app Web: percorso del file Docker Compose. Deve essere un percorso completo o relativo alla directory di lavoro predefinita. Obbligatorio per le app con più contenitori.
startup-command (Facoltativo) Immettere il comando di avvio. Ad esempio: dotnet run o dotnet filename.dll.
name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}

    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

    - uses: azure/webapps-deploy@v2
      with:
        app-name: 'myapp'
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
        images: 'mycontainer.azurecr.io/myapp:${{ github.sha }}'
name: Windows_Container_Workflow

on: [push]

jobs:
  build:
    runs-on: windows-latest

    steps:
    - uses: actions/checkout@v2

    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}

    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

    - uses: azure/webapps-deploy@v2
      with:
        app-name: 'myapp'
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
        images: 'mycontainer.azurecr.io/myapp:${{ github.sha }}'

È possibile trovare il set di azioni raggruppate in repository diversi in GitHub. Ogni repository contiene documentazione ed esempi che consentono di usare GitHub per CI/CD e distribuire le app in Azure.