Esercizio - Creare una pipeline di Azure DevOps per distribuire l'app nativa del cloud

Completato

Il manager vuole cambiare il CI/CD per l'app eShop aziendale per utilizzare Azure Pipelines. Ora creerai una pipeline di Azure DevOps per creare e distribuire il servizio di 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.

  1. Accedere a dev.azure.com.
  2. Selezionare + Nuovo progetto.
  3. Per Nome progetto, immettere eShop deployment.
  4. Lasciare l'opzione Visibilità impostata su Privato e selezionare Crea.
  5. A sinistra selezionare Pipeline e quindi crea pipeline.
  6. Nella pagina Connetti selezionare GitHub per Dove si trova il codice?
  7. Se richiesto, accedere a GitHub e autorizzare Azure Pipelines ad accedere all'account GitHub.
  8. Per Seleziona un repository, selezionare il repository con fork.
  9. Nella pagina Configura selezionare l'opzione Distribuisci nel servizio Azure Kubernetes .
  10. Nel riquadro Distribuisci nel servizio Azure Kubernetes selezionare la sottoscrizione di Azure e quindi selezionare Continua.
  11. Se richiesto, accedere alla sottoscrizione di Azure.
  12. Per il Cluster, selezionare l'AKS cluster che hai creato nell'unità precedente, aks-eshop.
  13. Per Spazio dei nomi lasciare selezionato Esistente e quindi selezionare predefinito.
  14. Per registro Contenitori selezionare il Registro Azure Container creato nell'unità precedente, ad esempio acseshop186748394.
  15. Per il campo Nome immagine, digitare productservice.
  16. Per Porta del servizio immettere 8080.
  17. 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.

Si esaminerà 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 e pubblicare l'immagine in Registro Azure Container.

L'ultima fase consiste nel distribuire il servizio del prodotto aggiornato su AKS. Il processo usa l'attività KubernetesManifest per distribuire l'immagine su AKS.

Eseguire la pipeline

In alto a destra della pagina Rivedi il YAML della pipeline, selezionare Salva ed esegui. Nel riquadro Salva ed esegui:

  1. Selezionare Crea un nuovo ramo per questo commit.
  2. Lasciare tutte le altre opzioni impostate sulle impostazioni predefinite.
  3. Seleziona Salva ed Esegui.

Monitorare e risolvere i problemi della pipeline

Azure Pipelines viene monitorato e gestito dal portale di Azure DevOps. Si esaminerà l'output dell'esecuzione della pipeline creata.

Screenshot che mostra lo stato di una pipeline di Azure.

La pagina di riepilogo mostra tutte le fasi della tua pipeline in esecuzione. È possibile selezionare una fase per visualizzare i passaggi in modo più dettagliato. Tra un momento si noterà che la pipeline è fallita. Selezionare la fase di compilazione .

Screenshot della fase di compilazione in una pipeline non riuscita.

Nella fase di compilazione è possibile osservare che la compilazione non è riuscita. Selezionare il passaggio Compila ed esegui il push di un'immagine nel Registro Azure Container . 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. Stai per modificare la pipeline creata per correggere l'errore.

  1. In alto a destra selezionare il menu Altre azioni e quindi selezionare Modifica pipeline.

  2. 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'
    
  3. Seleziona Salva.

  4. Nel riquadro Salva selezionare Salva.

  5. Selezionare Esegui e quindi nel riquadro Esegui pipeline selezionare Esegui.

    Osserva il completamento della fase di compilazione. La fase Distribuisci viene sospesa finché non viene selezionata e ne viene consentita l'esecuzione.

    Screenshot che mostra la pipeline completata.

    La pipeline viene completata correttamente. Selezionare la fase Distribuisci per visualizzare i passaggi.

    Screenshot che mostra la fase Distribuisci e i passaggi completati correttamente.