Eseguire la distribuzione di un contenitore personalizzato nel servizio app usando Azure Pipelines
Azure DevOps consente di ospitare, compilare, pianificare e testare il codice con flussi di lavoro gratuiti. Tra questi, Azure Pipelines consente di distribuire l'applicazione con CI/CD funzionante con qualsiasi piattaforma e cloud. Una pipeline è definita come file YAML nella directory radice del repository.
In questo articolo si usa Azure Pipelines per distribuire un'applicazione contenitore Windows nel servizio app da un repository Git in Azure DevOps. Si presume che l'utente abbia già un'applicazione .NET con un dockerfile di supporto in Azure DevOps.
Prerequisiti
- Un account Azure con una sottoscrizione attiva. Creare un account gratuitamente.
- Un'organizzazione di Azure DevOps. Crearne una gratuitamente.
- Un'app di Windows funzionante con Dockerfile ospitato in Azure Repos.
Aggiungere una connessione al servizio
Prima di creare la pipeline, è necessario creare la connessione al servizio perché durante la creazione del modello viene chiesto di scegliere e verificare la connessione. Una connessione al servizio consente di connettersi al Registro di sistema a scelta (ACR o Docker Hub) quando si usano i modelli di attività. Quando si aggiunge una nuova connessione al servizio, scegliere l'opzione Registro Docker. Il modulo seguente chiede di scegliere tra Docker Hub o Registro Azure Container, insieme alle informazioni relative. Per seguire questa esercitazione, usare Registro Azure Container. È possibile creare una nuova connessione al servizio seguendo le istruzioni riportate qui.
Proteggere i segreti
Poiché si usano informazioni sensibili a cui non si vuole che altri utenti abbiano accesso, sono usate variabili per proteggere le informazioni. Creare una variabile seguendo le istruzioni riportate qui.
Per aggiungere una variabile, fare clic sul pulsante Variabili accanto al pulsante Salva in alto a destra nella visualizzazione di modifica per la pipeline. Selezionare il pulsante Nuova variabile e immettere le informazioni. Aggiungere le variabili seguenti con i propri segreti appropriati da ogni risorsa.
- vmImageName: 'windows-latest'
- imageRepository: 'your-image-repo-name'
- dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
- dockerRegistryServiceConnection: 'your-service-connection-number'
Crea una nuova pipeline
Dopo aver creato il repository con l'applicazione .NET e il dockerfile di supporto, seguire la procedura per creare la pipeline.
- Passare a Pipelines sulla barra dei menu a sinistra e fare clic sul pulsante Crea pipeline
- Nella schermata successiva selezionare Azure Repos Git come opzione del repository e selezionare il repository in cui si trova il codice
- Nella scheda Configura scegliere l'opzione Pipeline di base
- Nella scheda Revisione successiva fare clic sul pulsante Salva
Creare ed eseguire il push di un'immagine nel Registro Azure Container
Dopo aver creato e salvato la pipeline, sarà necessario modificarla per eseguire i passi per la compilazione del contenitore, il push in un registro e la distribuzione dell'immagine nel servizio app. Per iniziare, passare al menu Pipelines, scegliere la pipeline creata e fare clic sul pulsante Modifica.
Prima di tutto è necessario aggiungere l'attività Docker in modo da poter compilare l'immagine. Aggiungere il codice seguente e sostituire il Dockerfile: app/Dockerfile con il percorso al Dockerfile.
trigger:
- main
pool:
vmImage: 'windows-latest'
variables:
vmImageName: 'windows-latest'
imageRepository: 'your-image-repo-name'
dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
dockerRegistryServiceConnection: 'your-service-connection-number'
- stage: Build
displayName: Build and push stage
jobs:
- job: Build
displayName: Build job
pool:
vmImage: $(vmImageName)
steps:
- task: Docker@2
displayName: Build and push an image to container registry
inputs:
command: buildAndPush
repository: $(imageRepository)
dockerfile: $(dockerfilePath)
containerRegistry: $(dockerRegistryServiceConnection)
tags: |
$(tag)
Aggiungere l'attività di distribuzione del servizio app
Successivamente, è necessario configurare l'attività di distribuzione. Questo richiede il nome della sottoscrizione, il nome dell'applicazione e il registro contenitori. Aggiungere una nuova fase al file YAML incollando il codice seguente.
- stage: Deploy
displayName: Deploy to App Service
jobs:
- job: Deploy
displayName: Deploy
pool:
vmImage: $(vmImageName)
steps:
Passare quindi alla scheda Mostra assistente nell'angolo in alto a destra e individuare l'attività di distribuzione del servizio app di Azure, quindi compilare il modulo seguente:
- Tipo di connessione: Azure Resource Manager
- Sottoscrizione di Azure: your-subscription-name
- Tipo di servizio app: app Web per contenitori (Windows)
- Nome servizio app: your-app-name
- Registro di sistema o spazio dei nomi: your-azure-container-registry-namespace
- Immagine: your-azure-container-registry-image-name
Dopo aver compilato questi elementi, fare clic sul pulsante Aggiungi per aggiungere l'attività seguente:
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: 'my-subscription-name'
appType: 'webAppHyperVContainer'
WebAppName: 'my-app-name'
DockerNamespace: 'myregsitry.azurecr.io'
DockerRepository: 'dotnetframework:12'
Dopo aver aggiunto l'attività, la pipeline è pronta per l'esecuzione. Fare clic sul pulsante Convalida e salva ed eseguire la pipeline. La pipeline esegue i passaggi per compilare ed eseguire il push dell'immagine del contenitore di Windows in Registro Azure Container e distribuire l'immagine nel servizio app.
Di seguito è riportato l'esempio del file YAML completo:
trigger:
- main
pool:
vmImage: 'windows-latest'
variables:
vmImageName: 'windows-latest'
imageRepository: 'your-image-repo-name'
dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
dockerRegistryServiceConnection: 'your-service-connection-number'
- stage: Build
displayName: Build and push stage
jobs:
- job: Build
displayName: Build job
pool:
vmImage: $(vmImageName)
steps:
- task: Docker@2
displayName: Build and push an image to container registry
inputs:
command: buildAndPush
repository: $(imageRepository)
dockerfile: $(dockerfilePath)
containerRegistry: $(dockerRegistryServiceConnection)
tags: |
$(tag)
- stage: Deploy
displayName: Deploy to App Service
jobs:
- job: Deploy
displayName: Deploy
pool:
vmImage: $(vmImageName)
steps:
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: 'my-subscription-name'
appType: 'webAppHyperVContainer'
WebAppName: 'my-app-name'
DockerNamespace: 'myregsitry.azurecr.io'
DockerRepository: 'dotnetframework:12'