Exercice - Déployer un conteneur Docker sur Azure

Effectué

À l’origine, votre projet intègre un pipeline de mise en production qui génère les projets de la solution et déploie l’application web dans son instance App Service. À présent, il est temps de mettre à jour cette build de pipeline et de déployer le projet comme conteneur à la place.

Dans cette unité, vous allez :

  • Définir des variables de pipeline pour simplifier la gestion du pipeline de build
  • Remplacer les tâches de génération existantes par une tâche unifiée pour générer et pousser (push) un conteneur Docker
  • Remplacer la tâche de déploiement existante par une tâche qui met à jour l’application web App Service avec la nouvelle image conteneur
  • Enregistrez le pipeline pour déclencher une génération et une mise en production.

Définir les variables à partager dans le pipeline

Ici, vous allez ajouter une nouvelle variable de pipeline à votre pipeline YAML existant défini dans azure-pipelines.yml.

  1. Dans Azure DevOps, accédez à Pipelines.

  2. Sélectionnez le pipeline.

  3. Sélectionnez Modifier. Vérifiez que la branche est définie sur principal en la sélectionnant dans le menu déroulant. Cela génère votre fichier azure-pipelines.yml.

  4. Ajoutez la ligne en surbrillance ci-dessous pour ajouter les variables de pipeline nommées webRepository et tag. Elles seront utilisées dans plusieurs tâches pour identifier de manière unique la version spécifique du conteneur référencé. Vous pouvez également supprimer la variable buildConfiguration ; vous n’en aurez plus besoin.

    trigger:
    - '*'
    
    variables:
      buildConfiguration: 'Release'
      webRepository: 'web'
      tag: '$(Build.BuildId)'
    

Remplacer les tâches de la phase de génération

Andy : Je ne pense pas que nous ayons encore besoin de ces tâches de génération, car le Dockerfile dans le dossier du projet définit déjà le build que nous souhaitons. Toutefois, je n’ai pas encore eu l’occasion de réfléchir à ce que nous pouvons utiliser pour générer l’image avec un Dockerfile. Des idées ?

Mara : J’étais justement en train d’examiner cela. Il semble qu’il soit possible de générer le conteneur et même de le pousser vers le dépôt avec une seule tâche. Ajoutons-la maintenant.

Tâche Docker

Vous pouvez utiliser la tâche Docker pour générer et déployer des images Docker. Remplacez la phase de Génération entière par l’extrait de code YAML ci-dessous.

  • command : Spécifie la commande Docker à exécuter.
  • buildContext : Spécifie le chemin du contexte de build.
  • repository : Spécifie le nom du dépôt.
  • dockerfile : Spécifie le chemin du fichier Dockerfile.
  • containerRegistry : Spécifie le nom de la connexion au service de registre Docker.
  • tags : spécifie une liste d’étiquettes sur des lignes distinctes. Ces étiquettes sont utilisées dans les commandes build, push, et buildAndPush.
- stage: 'Build'
  displayName: 'Build and push'
  jobs:  
  - job: 'Build'
    displayName: 'Build job'
    pool:
      vmImage: 'ubuntu-20.04'
    steps:
    - task: Docker@2
      displayName: 'Build and push the image to container registry'
      inputs:
        command: buildAndPush
        buildContext: $(Build.Repository.LocalPath)
        repository: $(webRepository)
        dockerfile: '$(Build.SourcesDirectory)/Tailspin.SpaceGame.Web/Dockerfile'
        containerRegistry: 'Container Registry Connection'
        tags: |
          $(tag)

Remplacer la tâche de la phase de déploiement

Andy : Cela semble assez simple. À présent, il nous suffit de trouver une tâche qui indique à App Service d’utiliser la dernière version poussée de l’image conteneur.

Mara : J’y travaille déjà. C’est un peu différent du déploiement d’une build locale sur Azure Pipelines, mais suffisamment direct pour que le travail puisse être effectué à l’aide d’une seule tâche. Ajoutons-la maintenant.

Tâche Azure Web App pour conteneur

La tâche Azure Web App pour conteneurs est conçue pour déployer des conteneurs Docker sur Azure App Service. Remplacez la phase de déploiement entière par l’extrait de code YAML ci-dessous.

  • appName : Spécifie le nom d’une instance Azure App Service existante.
  • azureSubscription : Spécifie le nom de l’abonnement Azure Resource Manager pour le déploiement.
  • imageName : Spécifie le nom complet de l’image conteneur, par exemple, myregistry.azurecr.io/nginx:latest ou python:3.7.2-alpine/.
- stage: 'Deploy'
  displayName: 'Deploy the container'
  dependsOn: Build
  jobs:
  - job: 'Deploy'
    displayName: 'Deploy job'
    pool:
      vmImage: 'ubuntu-20.04'
    variables:
    - group: Release
    steps:
    - task: AzureWebAppContainer@1
      inputs:
       appName: $(WebAppName)
       azureSubscription: 'Resource Manager - Tailspin - Space Game'
       imageName: $(RegistryName)/$(webRepository):$(build.buildId)

Enregistrer le pipeline pour déclencher une build et une version

  1. Sélectionnez Enregistrer en haut à droite de la page. Tapez votre message de commit, puis sélectionnez Enregistrer pour confirmer.

  2. Sélectionnez Exécuter et vérifiez que votre branche est définie sur main. Sélectionnez Exécuter quand vous avez terminé.

  3. Sélectionnez votre pipeline pour voir les journaux. Après la génération, sélectionnez la tâche AzureWebAppContainer, puis l’URL de l’application App Service pour voir votre application web déployée.

    Screenshot of Azure Pipelines showing the location of the website URL.

  4. Vous devez voir votre application web exécutée sur App Service.

    Screenshot of the Space Game website.

Andy : C’est parfait ! Je pense que l’adoption des conteneurs peut s’avérer des plus avantageuses pour notre équipe.