Exercice – Créer un pipeline Azure DevOps pour déployer votre application native cloud

Effectué

Votre manager souhaite que vous modifiiez l’intégration continue et la livraison continue (CI/CD) pour que l’application eShop de l’entreprise puisse utiliser Azure Pipelines. Vous allez à présent créer un pipeline Azure DevOps pour générer et déployer votre service de produits.

Créer un pipeline Azure DevOps

Important

Avant de commencer, vous devez disposer d’un compte Azure DevOps. Si vous n’en avez pas, vous pouvez en créer un gratuitement sur dev.azure.com.

  1. Connectez-vous à dev.azure.com.
  2. Sélectionnez + Nouveau projet.
  3. Pour le nom du projet, entrez Déploiement eShop.
  4. Laissez la visibilité définie sur Privée, puis sélectionnez Créer.
  5. À gauche, sélectionnez Pipelines, puis Créer un pipeline.
  6. Sur la page de connexion, pour l’option Où se trouve votre code ?, sélectionnez GitHub.
  7. Si vous y êtes invité, connectez-vous à GitHub et autorisez Azure Pipelines à accéder à votre compte GitHub.
  8. Pour l’option Sélectionner un dépôt, sélectionnez votre référentiel dupliqué.
  9. Sur la page Configurer, sélectionnez l’option Déployer sur Azure Kubernetes Service.
  10. Dans le volet Déployer sur Azure Kubernetes Service, sélectionnez votre abonnement Azure, puis sélectionnez Continuer.
  11. Si vous y êtes invité, connectez-vous à votre abonnement Azure.
  12. Pour le cluster, sélectionnez le cluster AKS que vous avez créé dans l’unité précédente aks-eshop.
  13. Pour l’espace de noms, laissez l’option Existant sélectionnée, puis sélectionnez Par défaut.
  14. Pour le registre de conteneurs, sélectionnez l’instance Azure Container Registry que vous avez créée dans l’unité précédente. Par exemple, acseshop186748394.
  15. Pour le nom de l’image, entrez productservice.
  16. Pour le port de service, entrez 8080.
  17. Sélectionnez Valider et configurer.

Passer en revue le fichier YAML du pipeline

Azure Pipelines utilise des fichiers YAML pour définir les étapes de génération et de déploiement de votre application. Le fichier YAML est stocké dans votre référentiel GitHub et a été créé automatiquement en fonction des informations que vous avez fournies.

Examinons le fichier 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)

Les sections trigger et resources définissent le moment d’exécution du pipeline. Dans ce cas, le pipeline s’exécute quand une modification est validée dans la branche principale de votre référentiel.

La section variables définit les variables utilisées dans le pipeline. Les variables servent à définir l’instance Azure Container Registry et le fichier Docker à utiliser.

Le fichier YaML définit ensuite un travail de génération qui utilise l’agent ubuntu-latest. Le travail utilise la tâche Docker pour générer et envoyer (push) l’image à Azure Container Registry.

La dernière étape consiste à déployer le service de produit mis à jour sur AKS. Le travail utilise la tâche KubernetesManifest pour déployer l’image sur AKS.

Exécuter le pipeline

Dans le coin supérieur droit de la page Passer en revue le fichier YAML de pipeline, sélectionnez Enregistrer et exécuter. Dans le volet Enregistrer et exécuter :

  1. Sélectionnez Créer une branche pour cette validation.
  2. Conservez la valeur par défaut de toutes les autres options.
  3. Sélectionnez Enregistrer et exécuter.

Surveiller et dépanner le pipeline

Azure Pipelines est surveillé et géré à partir du portail Azure DevOps. Examinons la sortie de l’exécution du pipeline que vous avez créé.

A screenshot showing the status of an Azure Pipeline.

La page de résumé affiche toutes les phases de votre pipeline en cours d’exécution. Vous pouvez sélectionner une phase pour afficher les détails des étapes. Dans un instant, vous constaterez que le pipeline a échoué. Sélectionnez la phase de génération.

A screenshot of the build stage in a pipeline that has failed.

Dans la phase de génération, vous pouvez constater que la génération a échoué. Sélectionnez l’étape Générer et envoyer (push) une image sur Azure Container Registry. L’erreur dans le fichier journal indique :

##[error]Unhandled: No Dockerfile matching  /home/vsts/work/1/s/**/Dockerfile  was found.

Corriger l’erreur

Dans DevOps, revenez à la page de résumé du pipeline. Vous allez modifier le pipeline créé pour corriger l’erreur.

  1. Dans le coin supérieur droit, sélectionnez le menu Autres actions, puis sélectionnez Modifier le pipeline.

  2. La ligne 17 du fichier YAML définit le fichier Docker à utiliser et, par défaut, le pipeline s’attend à ce qu’il y ait un fichier nommé Dockerfile à la racine du référentiel.

    L’eShop utilise un autre fichier Docker pour le service de produit nommé DockerfileProducts. Modifiez la ligne 17 comme suit :

      dockerfilePath: '**/DockerfileProducts'
    
  3. Sélectionnez Enregistrer.

  4. Dans le volet Enregistrer, sélectionnez Enregistrer.

  5. Sélectionnez Exécuter, puis, dans le volet Exécuter le pipeline, sélectionnez Exécuter.

    Observez la finalisation de la phase de génération. La phase de déploiement s’interrompt jusqu’à ce que vous la sélectionniez et autorisiez son exécution.

    A screenshot showing the completed pipeline.

    Le pipeline se termine correctement. Sélectionnez la phase de déploiement pour afficher les étapes correspondantes.

    A screenshot showing the Deploy stage and the successfully completed steps.