Esercizio - Creare una pipeline di Azure DevOps per distribuire l'app nativa del cloud
Il responsabile vuole modificare l'integrazione continua/distribuzione continua per l'app eShop aziendale per l'uso di Azure Pipelines. Si creerà ora una pipeline di Azure DevOps per compilare e distribuire il servizio prodotti.
Creare una pipeline di Azure DevOps
Importante
Prima di iniziare, è necessario avere un account Azure DevOps. Se non è disponibile, è possibile crearne uno gratuitamente in dev.azure.com.
- Accedere a dev.azure.com.
- Selezionare + Nuovo progetto.
- Per Nome progetto immettere eShop deployment (Distribuzione eShop).
- Lasciare l'opzione Visibilità impostata su Privato, selezionare Crea.
- A sinistra selezionare Pipeline e quindi crea pipeline.
- Nella pagina Connessione selezionare GitHub per Dove si trova il codice?
- Se richiesto, accedere a GitHub e autorizzare Azure Pipelines ad accedere all'account GitHub.
- Per Selezionare un repository selezionare il repository con fork.
- Nella pagina Configura selezionare l'opzione Distribuisci in servizio Azure Kubernetes.
- Nel riquadro Distribuisci in servizio Azure Kubernetes selezionare la sottoscrizione di Azure e quindi continua.
- Se richiesto, accedere alla sottoscrizione di Azure.
- Per Cluster selezionare il cluster del servizio Azure Kubernetes creato nell'unità precedente aks-eshop.
- Per Spazio dei nomi lasciare selezionata Esistente e quindi selezionare default.
- Per Registro Contenitori selezionare il Registro Azure Container creato nell'unità precedente, ad esempio acseshop186748394.
- Per Nome immagine immettere productservice.
- Per Porta del servizio immettere 8080.
- Selezionare Convalida e configura.
Esaminare il file YAML della pipeline
Azure Pipelines usa i file YAML per definire i passaggi per compilare e distribuire l'app. Il file YAML viene archiviato nel repository GitHub ed è stato creato automaticamente in base alle informazioni fornite.
Esaminiamo il file YAML:
trigger:
- main
resources:
- repo: self
variables:
# Container registry service connection established during pipeline creation
dockerRegistryServiceConnection: '3bcbb23c-6fca-4ff0-8719-bfbdb64a89b1'
imageRepository: 'productservice'
containerRegistry: 'acseshop186748394.azurecr.io'
dockerfilePath: '**/Dockerfile'
tag: '$(Build.BuildId)'
imagePullSecret: 'acseshop18674839414442d34-auth'
# Agent VM image name
vmImageName: 'ubuntu-latest'
stages:
- stage: Build
displayName: Build stage
jobs:
- job: Build
displayName: Build
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)
- upload: manifests
artifact: manifests
- stage: Deploy
displayName: Deploy stage
dependsOn: Build
jobs:
- deployment: Deploy
displayName: Deploy
pool:
vmImage: $(vmImageName)
environment: 'PhilStollerymod9cloudnativeexercisecode-1959.default'
strategy:
runOnce:
deploy:
steps:
- task: KubernetesManifest@0
displayName: Create imagePullSecret
inputs:
action: createSecret
secretName: $(imagePullSecret)
dockerRegistryEndpoint: $(dockerRegistryServiceConnection)
- task: KubernetesManifest@0
displayName: Deploy to Kubernetes cluster
inputs:
action: deploy
manifests: |
$(Pipeline.Workspace)/manifests/deployment.yml
$(Pipeline.Workspace)/manifests/service.yml
imagePullSecrets: |
$(imagePullSecret)
containers: |
$(containerRegistry)/$(imageRepository):$(tag)
Le sezioni trigger e risorse definiscono quando deve essere eseguita la pipeline. In questo caso, la pipeline verrà eseguita quando viene eseguito il commit di una modifica nel ramo principale del repository.
La sezione variables definisce le variabili usate nella pipeline. Le variabili vengono usate per definire il Registro Azure Container e il Dockerfile da usare.
YAML definisce quindi un processo di compilazione che usa l'agente ubuntu-latest . Il processo usa l'attività Docker per compilare ed eseguire il push dell'immagine nel Registro Azure Container.
L'ultima fase consiste nel distribuire il servizio prodotto aggiornato nel servizio Azure Kubernetes. Il processo usa l'attività KubernetesManifest per distribuire l'immagine nel servizio Azure Kubernetes.
Eseguire la pipeline
Nella parte superiore destra della pagina Verifica YAML della pipeline selezionare Salva ed esegui. Nel riquadro Salva ed esegui:
- Selezionare Crea un nuovo ramo per questo commit.
- Lasciare tutte le altre opzioni impostate sulle impostazioni predefinite.
- Seleziona Salva ed Esegui.
Monitorare e risolvere i problemi della pipeline
Azure Pipelines viene monitorato e gestito dal portale di Azure DevOps. Si esaminerà ora l'output dell'esecuzione della pipeline creata.
La pagina di riepilogo mostra tutte le fasi della pipeline in esecuzione. È possibile selezionare una fase per visualizzare i passaggi in modo più dettagliato. In un momento si noterà che la pipeline non è riuscita. Selezionare la fase di compilazione .
Nella fase di compilazione è possibile osservare che la compilazione non è riuscita. Selezionare il passaggio Compila ed esegui il push di un'immagine per Registro Azure Container passaggio. L'errore nel file di log mostra:
##[error]Unhandled: No Dockerfile matching /home/vsts/work/1/s/**/Dockerfile was found.
Correggere l'errore
In DevOps tornare alla pagina di riepilogo della pipeline. Si modificherà la pipeline creata per correggere l'errore.
In alto a destra selezionare il menu Altre azioni , quindi selezionare Modifica pipeline.
La riga 17 del file YAML definisce il Dockerfile da usare e per impostazione predefinita la pipeline prevede che sia presente un file denominato Dockerfile nella radice del repository.
EShop usa un file Docker diverso per il servizio prodotto denominato DockerfileProducts. Modifica riga 17 in modo che sia:
dockerfilePath: '**/DockerfileProducts.acr'
Seleziona Salva.
Nel riquadro Salva selezionare Salva.
Selezionare Esegui e quindi nel riquadro Esegui pipeline selezionare Esegui.
Osservare il completamento della fase di compilazione. La fase Distribuisci viene sospesa fino a quando non viene selezionata e per consentire l'esecuzione.
La pipeline viene completata correttamente. Selezionare la fase Distribuisci per visualizzare i passaggi.