Utilisez Azure Pipelines pour construire et déployer une application web Python sur Azure App Service.

Azure DevOps Services

Utilisez Azure Pipelines pour l’intégration et le déploiement continus (CI/CD) afin de construire et de déployer une application web Python sur Azure App Service sur Linux. Votre pipeline construit et déploie automatiquement votre application web Python sur App Service à chaque validation du référentiel.

Dans cet article, vous apprendrez comment :

  • Créer une application web dans Azure App Service
  • Créez un projet dans Azure DevOps.
  • Connectez votre projet DevOps à Azure.
  • Créez un pipeline spécifique à Python.
  • Lancez le pipeline pour construire et déployer votre application sur votre application web dans App Service.

Prérequis

Créer un référentiel pour votre code d’application

Dupliquez (fork) le référentiel d’exemple sur https://github.com/Microsoft/python-sample-vscode-flask-tutorial vers votre compte GitHub.

Sur votre hôte local, clonez votre référentiel GitHub. Utilisez la commande suivante, en remplaçant <repository-url> par l’URL de votre référentiel dupliqué (fork).

git clone <repository-url>

Testez votre application localement.

Construisez et exécutez l’application localement pour vous assurer qu’elle fonctionne.

  1. Changez vers le dossier du référentiel cloné.

    cd python-sample-vscode-flask-tutorial
    
  2. Générer et exécuter l’application

    python -m venv .env
    source .env/bin/activate
    pip install --upgrade pip
    pip install -r ./requirements.txt
    export set FLASK_APP=hello_app.webapp
    python3 -m flask run
    
  3. Pour afficher l’application, ouvrez une fenêtre de navigateur et allez sur http://localhost:5000. Assurez-vous que vous voyez le titre Visual Studio Flask Tutorial.

  4. Lorsque vous avez terminé, fermez la fenêtre du navigateur et arrêtez le serveur Flask avec Ctrl+C.

Ouvrez une instance Cloud Shell

  1. Connectez-vous au portail Azure à l’adressehttps://portal.azure.com.

  2. Ouvrez le CLI Azure en sélectionnant le bouton Cloud Shell sur la barre d’outils du portail.

    Capture d’écran du bouton Azure Cloud Shell dans la barre d’outils du portail Azure.

  3. Cloud Shell apparaît en bas du navigateur. Sélectionnez Bash dans le menu déroulant.

    Capture d’écran d’Azure Cloud Shell.

  4. Pour vous donner plus d’espace pour travailler, sélectionnez le bouton de maximisation.

Créez une application web Azure App Service.

Créez votre application web Azure App Service à partir du Cloud Shell dans le portail Azure.

Conseil

Pour coller dans le Cloud Shell, faites Ctrl+Shift+V ou faites un clic droit et sélectionnez Coller dans le menu contextuel.

  1. Clonez votre référentiel avec la commande suivante, en remplaçant <repository-url> par l’URL de votre référentiel dupliqué (fork).

    git clone <repository-url>
    
  2. Changez de répertoire vers le dossier du référentiel cloné, afin que la commande az webapp up reconnaisse l’application comme une application Python.

    cd python-sample-vscode-flask-tutorial
    
  3. Utilisez la commande az webapp up pour provisionner à la fois App Service et effectuer le premier déploiement de votre application. Remplacez <your-web-app-name> par un nom unique dans Azure. En règle générale, vous utilisez un nom personnel ou d’entreprise ainsi qu’un identificateur d’application, tel que <your-name>-flaskpipelines. L’URL de l’application devient <your-appservice>.azurewebsites.net.

    az webapp up --name <your-web-app-name>
    

    La sortie JSON de la commande az webapp up montre :

    {
      "URL": <your-web-app-url>,
      "appserviceplan": <your-app-service-plan-name>,
      "location": <your-azure-location>,
      "name": <your-web-app-name>,
      "os": "Linux",
      "resourcegroup": <your-resource-group>,
      "runtime_version": "python|3.11",
      "runtime_version_detected": "-",
      "sku": <sku>,
      "src_path": <repository-source-path>
    }
    

    Notez les valeurs URL et runtime_version. Vous utilisez le runtime_version dans le fichier YAML du pipeline. Le URL est l’URL de votre application web. Vous pouvez l’utiliser pour vérifier que l’application fonctionne.

    Remarque

    La commande az webapp up exécute les actions suivantes :

    • Créer un groupe de ressources par défaut.

    • Créer un plan App Service par défaut.

    • Créer une application avec le nom spécifié.

    • Déployez tous les fichiers du répertoire de travail actuel, avec l’automatisation de la construction activée.

    • Mettre en cache les paramètres localement dans le fichier .azure/config afin de ne pas avoir à les spécifier à nouveau lors du déploiement ultérieur avec des commandes az webapp up ou az webapp à partir du dossier de projet. Les valeurs mises en cache sont utilisées automatiquement par défaut.

    Vous pouvez remplacer l’action par défaut par vos propres valeurs en utilisant les paramètres de la commande. Pour plus d’informations, consultez az webapp up.

  4. L’application python-sample-vscode-flask-tutorial dispose d’un fichier startup.txt qui contient la commande de démarrage spécifique pour l’application web. Définissez la propriété de configuration startup-file de l’application web sur startup.txt.

    1. À partir de la sortie de la commande az webapp up, copiez la valeur resourcegroup.

    2. Saisissez la commande suivante, en utilisant le groupe de ressources et le nom de votre application.

    az webapp config set --resource-group <your-resource-group> --name <your-web-app-name> --startup-file startup.txt
    

    Lorsque la commande est terminée, elle affiche la sortie JSON qui contient tous les paramètres de configuration de votre application web.

  5. Pour voir l’application en cours d’exécution, ouvrez un navigateur et allez à l’URL URL indiquée dans la sortie de la commande az webapp up. Si vous voyez une page générique, attendez quelques secondes que le service App démarre, puis actualisez la page. Assurez-vous que vous voyez le titre Visual Studio Flask Tutorial.

créer un projet Azure DevOps ;

Créez un nouveau projet Azure DevOps.

  1. Dans un navigateur, rendez-vous sur dev.azure.com et connectez-vous.
  2. Sélectionnez votre organisation.
  3. Créez un nouveau projet en sélectionnant Nouveau projet ou Créer un projet si c’est le premier projet dans l’organisation.
  4. Entrez un Nom de projet.
  5. Choisissez la Visibilité de votre projet.
  6. Sélectionnez Créer.
  1. Dans un navigateur, rendez-vous sur votre serveur Azure DevOps.
  2. Sélectionnez votre collection.
  3. Créez un nouveau projet en sélectionnant Nouveau projet ou Créer un projet si c’est le premier projet dans la collection.
  4. Entrez un Nom de projet.
  5. Choisissez la Visibilité de votre projet.
  6. Sélectionnez Créer.

Créer un principal du service

Un principal de service est une identité créée pour une utilisation avec des applications, des services hébergés et des outils automatisés pour accéder aux ressources Azure. Cet accès est restreint aux rôles attribués au principal de service, ce qui vous donne le contrôle sur les ressources auxquelles vous pouvez accéder et à quel niveau.

Pour créer un principal de service, accédez à l’interpréteur de commandes Cloud (bash) et exécutez la commande suivante. Remplacez <service-principal-name> par un nom pour votre principal de service, <your-subscription-id> par votre ID d’abonnement, et <your-resource-group> par le groupe de ressources de l’application web.

az ad sp create-for-rbac --display-name <service-principal-name> --role contributor --scopes /subscriptions/<your-subscription-id>/resourceGroups/<your-resource-group>

La commande renvoie un objet JSON similaire à l’exemple suivant :

{
  "clientId": "<client GUID>",
  "clientSecret": "<string-value>",
  "subscriptionId": "<subscription GUID>",
  "tenantId": "<tenant GUID>",
  ...
}

Notez les valeurs clientId, clientSecret, subscriptionId et tenantId. Vous avez besoin de ces valeurs pour créer une connexion de service dans la section suivante.

Créer une connexion de service

Une connexion de service vous permet de créer une connexion pour fournir un accès authentifié depuis Azure Pipelines vers des services externes et distants. Pour déployer sur votre application web Azure App Service, créez une connexion de service vers le groupe de ressources contenant l’application web.

  1. Sur la page du projet, sélectionnez Paramètres du projet.

    Capture d’écran du bouton paramètres du projet dans le tableau de bord du projet.

  2. Sélectionnez Connexions de service dans la section Pipelines du menu.

  3. Sélectionnez Créer une connexion de service.

  4. Sélectionnez Gestionnaire de ressources Azure et sélectionnez Suivant.

    Capture d’écran de la sélection de connexion de service Azure Resource Manager.

  5. Sélectionnez votre méthode d’authentification et sélectionnez Suivant.

  6. Dans la boîte de dialogue Nouvelle connexion de service Azure, saisissez les informations spécifiques à la méthode d’authentification sélectionnée. Pour plus d’informations sur les méthodes d’authentification, veuillez consulter la section Se connecter à Azure en utilisant une connexion de service Gestionnaire de ressources Azure.

    Par exemple, si vous utilisez une méthode d’authentification Fédération de l’identité de la charge de travail (automatique) ou Principal de service (automatique), saisissez les informations requises.

    Capture d’écran de la boîte de dialogue de la nouvelle connexion de service.

    Champ Description
    Niveau de portée Sélectionnez Abonnement.
    Abonnement Le nom de votre abonnement Azure.
    Groupe de ressources Le nom du groupe de ressources contenant votre application web.
    Nom de la connexion de service Un nom descriptif pour la connexion.
    Accorder des autorisations d’accès à tous les pipelines Sélectionnez cette option pour accorder l’accès à tous les pipelines.
  7. Cliquez sur Enregistrer.

La nouvelle connexion apparaît dans la liste Connexions de service, et est prête à être utilisée dans votre Pipeline Azure.

  1. Sur la page du projet, sélectionnez Paramètres du projet.

    Capture d’écran du bouton paramètres du projet dans le tableau de bord du projet.

  2. Sélectionnez Connexions de service dans la section Pipelines du menu.

  3. Sélectionnez Créer une connexion de service.

  4. Sélectionnez Gestionnaire de ressources Azure et sélectionnez Suivant.

    Capture d’écran de la sélection de connexion de service Azure Resource Manager.

  5. Sur Nouvelle connexion de service Azure, sélectionnez Principal de service (manuel) et sélectionnez Suivant

  6. Sur la boîte de dialogue suivante, remplissez les informations requises.

    Capture d’écran de la boîte de dialogue de la nouvelle connexion de service.

    Champ Description
    Environment Sélectionnez Azure Cloud.
    Niveau de portée Sélectionnez Abonnement.
    ID d’abonnement Votre ID d’abonnement.
    Nom d’abonnement Le nom de votre abonnement Azure.
    ID de principal de service La valeur appId de l’objet JSON retourné par la commande az ad sp create-for-rbac.
    Clé du principal de service La valeur password de l’objet JSON retourné par la commande az ad sp create-for-rbac.
    Identifiant du locataire La valeur tenant de l’objet JSON retourné par la commande az ad sp create-for-rbac.
  7. Sélectionnez Vérifier pour vérifier la connexion.

  8. Saisissez un nom de connexion de service.

  9. Vérifiez que l’option Accorder des autorisations d’accès à tous les pipelines est sélectionnée.

  10. Sélectionnez Vérifier et enregistrer.

La nouvelle connexion apparaît dans la liste Connexions de service et est prête pour l’utilisation d’Azure Pipelines à partir du projet.

Configurez un agent auto-hébergé

Si vous utilisez votre propre agent auto-hébergé, vous devez configurer l’agent pour exécuter Python. Le téléchargement de versions Python n’est pas pris en charge sur les agents auto-hébergés. Vous devez préinstaller la version Python. Utilisez l’installateur complet pour obtenir une version de Python compatible avec pip.

Pour éviter les problèmes d’incompatibilité, vous devriez faire correspondre la version Python avec la version d’exécution sur votre application web Azure App Services. La version d’exécution est indiquée dans la sortie JSON de la commande az webapp up.

La version Python souhaitée doit être ajoutée au cache d’outils sur l’agent auto-hébergé afin que la tâche puisse l’utiliser. Normalement, le cache d’outils se trouve sous le répertoire _work/_tool de l’agent; alternativement, le chemin peut être remplacé par la variable d’environnement AGENT_TOOLSDIRECTORY. Sous le répertoire des outils, créez la structure de répertoires suivante en fonction de votre version Python :

$AGENT_TOOLSDIRECTORY/
    Python/
        {version number}/
            {platform}/
                {tool files}
            {platform}.complete

Le numéro de version doit suivre le format 1.2.3. La plate-forme doit être soit x86 ou x64. Les fichiers d’outils doivent être les fichiers de version de Python dézippés. Le {platform}.complete doit être un fichier de 0 octet qui ressemble à x86.complete ou x64.complete et signifie simplement que l’outil est correctement installé dans le cache.

Par exemple, si vous utilisez Python 3.11 sur une machine Windows 64 bits, la structure du répertoire ressemblerait à ceci :

$AGENT_TOOLSDIRECTORY/
    Python/
        3.11.4/
            x64/
                {python files}
            x64.complete

Si vous avez déjà la version Python que vous voulez utiliser sur la machine hébergeant votre agent, vous pouvez copier les fichiers dans le cache d’outils. Si vous n’avez pas la version Python, vous pouvez la télécharger depuis le site web Python.

Créer un pipeline

Créez un pipeline pour construire et déployer votre application web Python sur Azure App Service. Pour comprendre les concepts de pipeline, regardez :

  1. Sur le menu de navigation de gauche, sélectionnez Pipelines.

    Capture d’écran de la sélection pipelines dans le tableau de bord du projet.

  2. Sélectionnez Créer un pipeline.

    Capture d’écran du nouveau bouton de pipeline dans la liste des pipelines.

  3. Dans la boîte de dialogue Où se trouve votre code, sélectionnez GitHub. Vous pourriez être invité à vous connecter à GitHub.

    Capture d’écran de la sélection GitHub comme emplacement de votre code.

  4. Sur l’écran Sélectionner un référentiel, sélectionnez le référentiel d’exemple dupliqué (fork).

    Capture d’écran de votre sélection de référentiel.

  5. Vous serez peut-être invité à entrer à nouveau votre mot de passe GitHub en guise de confirmation.

  6. Si l’extension Azure Pipelines n’est pas installée sur GitHub, GitHub vous invite à installer l’extension Azure Pipelines.

    Installez l’extension Azure Pipelines sur GitHub.

    Sur cette page, faites défiler jusqu’à la section Accès au référentiel, choisissez d’installer l’extension sur tous les référentiels ou uniquement sur certains, puis sélectionnez Approuver et installer.

    Capture d’écran de l’extension Approuver et installer Azure Pipelines sur GitHub.

  7. Dans la boîte de dialogue Configurer votre pipeline, sélectionnez Python vers l’application Web Linux sur Azure.

  8. Sélectionnez votre abonnement Azure et sélectionnez Continuer.

  9. Si vous utilisez votre nom d’utilisateur et votre mot de passe pour vous authentifier, un navigateur s’ouvre pour vous permettre de vous connecter à votre compte Microsoft.

  10. Sélectionnez le nom de votre application web dans la liste déroulante et sélectionnez Valider et configurer.

Azure Pipelines crée un fichier azure-pipelines.yml et l’affiche dans l’éditeur de pipelines YAML. Le fichier de pipeline définit votre pipeline CI/CD comme une série de stades, de Jobs et d’étapes, où chaque étape contient les détails de différentes tâches et scripts. Examinez le pipeline pour voir à quoi il sert. Assurez-vous que toutes les entrées par défaut sont adaptées à votre code.

  1. Dans le menu de navigation, sélectionnez Pipelines.

    Capture d’écran de la sélection pipelines dans le tableau de bord du projet.

  2. Sélectionnez Créer un pipeline.

    Capture d’écran du bouton Nouveau pipeline.

  3. Dans la boîte de dialogue Où se trouve votre code, sélectionnez GitHub Enterprise Server. Vous pourriez être invité à vous connecter à GitHub.

    Capture d’écran de la sélection GitHub comme emplacement de votre code.

  4. Sur l’onglet Sélectionner un référentiel, sélectionnez le référentiel d’exemple dupliqué (fork).

    Capture d’écran de votre sélection de référentiel.

  5. Vous serez peut-être invité à entrer à nouveau votre mot de passe GitHub en guise de confirmation.

  6. Si l’extension Azure Pipelines n’est pas installée sur GitHub, GitHub vous invite à installer l’extension Azure Pipelines.

    Capture d’écran de l’extension Azure Pipelines sur GitHub.

    Sur cette page, faites défiler jusqu’à la section Accès au référentiel, choisissez d’installer l’extension sur tous les référentiels ou uniquement sur certains, puis sélectionnez Approuver et installer.

    Capture d’écran de l’extension Approuver et installer Azure Pipelines sur GitHub.

  7. Dans la boîte de dialogue Configurer votre pipeline, sélectionnez Pipeline de départ.

  8. Remplacez le contenu du fichier azure-pipelines.yml par le code suivant.

    trigger:
    - main
    
    variables:
      # Azure Resource Manager connection created during pipeline creation
      azureServiceConnectionId: '<your-service-connection-name>'
    
      # Web app name
      webAppName: '<your-web-app-name>'
    
      # Environment name
      environmentName: '<your-web-app-name>'
    
      # Project root folder. 
      projectRoot: $(System.DefaultWorkingDirectory)
    
      # Python version: 
      pythonVersion: '<your-python-version>'
    
    stages:
    - stage: Build
      displayName: Build stage
      jobs:
      - job: BuildJob
        pool:
          name: '<your-pool-name>'
          demands: python
        steps:
        - task: UsePythonVersion@0
          inputs:
            versionSpec: '$(pythonVersion)'
          displayName: 'Use Python $(pythonVersion)'
    
        - script: |
            python -m venv antenv
            source antenv/bin/activate
            python -m pip install --upgrade pip
            pip install -r requirements.txt
          workingDirectory: $(projectRoot)
          displayName: "Install requirements"
    
        - task: ArchiveFiles@2
          displayName: 'Archive files'
          inputs:
            rootFolderOrFile: '$(projectRoot)'
            includeRootFolder: false
            archiveType: zip
            archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
            replaceExistingArchive: true
    
        - task: PublishBuildArtifacts@1
          inputs:
            PathtoPublish: '$(Build.ArtifactStagingDirectory)'
            ArtifactName: 'drop'
            publishLocation: 'Container'
    
    - stage: Deploy
      displayName: 'Deploy Web App'
      dependsOn: Build
      condition: succeeded()
      jobs:
      - deployment: DeploymentJob
        pool:
          name: '<your-pool-name'
        environment: $(environmentName)
        strategy:
          runOnce:
            deploy:
              steps:
    
              - task: UsePythonVersion@0
                inputs:
                  versionSpec: '$(pythonVersion)'
                displayName: 'Use Python version'
    
              - task: AzureWebApp@1
                displayName: 'Deploy Azure Web App : <your-web-app-name>'
                inputs:
                  azureSubscription: $(azureServiceConnectionId)
                  appName: $(webAppName)
                  package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
                  startUpCommand: 'startup.txt'
    
    
  9. Remplacez les espaces réservés suivants par vos propres valeurs :

    Espace réservé Description
    <your-service-connection-name> Le nom de la connexion au service que vous avez créée.
    <your-web-app-name> Le nom de votre application web Azure App Service.
    <your-pool-name> Le nom du pool d’agents que vous souhaitez utiliser.
    <your-python-version> La version de Python utilisée sur votre agent. Il est conseillé de faire correspondre cette version avec la version de Python utilisée sur votre application web. La version de l’application web est affichée dans la sortie JSON de la commande az webapp up.

Fichier YAML de pipeline

L’explication suivante décrit le fichier YAML de pipeline. Pour en savoir plus sur le schéma du fichier YAML de pipeline, veuillez consulter la référence du schéma YAML.

L’exemple complet de fichier YAML de pipeline est illustré ci-dessous :

trigger:
- main

variables:
  # Azure Resource Manager connection created during pipeline creation
  azureServiceConnectionId: '<GUID>'

  # Web app name
  webAppName: '<your-webapp-name>'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

  # Environment name
  environmentName: '<your-webapp-name>'

  # Project root folder. Point to the folder containing manage.py file.
  projectRoot: $(System.DefaultWorkingDirectory)

  pythonVersion: '3.11'

stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: BuildJob
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: UsePythonVersion@0
      inputs:
        versionSpec: '$(pythonVersion)'
      displayName: 'Use Python $(pythonVersion)'

    - script: |
        python -m venv antenv
        source antenv/bin/activate
        python -m pip install --upgrade pip
        pip install setup
        pip install -r requirements.txt
      workingDirectory: $(projectRoot)
      displayName: "Install requirements"

    - task: ArchiveFiles@2
      displayName: 'Archive files'
      inputs:
        rootFolderOrFile: '$(projectRoot)'
        includeRootFolder: false
        archiveType: zip
        archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
        replaceExistingArchive: true

    - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
      displayName: 'Upload package'
      artifact: drop

- stage: Deploy
  displayName: 'Deploy Web App'
  dependsOn: Build
  condition: succeeded()
  jobs:
  - deployment: DeploymentJob
    pool:
      vmImage: $(vmImageName)
    environment: $(environmentName)
    strategy:
      runOnce:
        deploy:
          steps:

          - task: UsePythonVersion@0
            inputs:
              versionSpec: '$(pythonVersion)'
            displayName: 'Use Python version'

          - task: AzureWebApp@1
            displayName: 'Deploy Azure Web App : $(webAppName)'
            inputs:
              azureSubscription: $(azureServiceConnectionId)
              appName: $(webAppName)
              package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip

Variables

La section variables contient les variables suivantes :

variables:
# Azure Resource Manager connection created during pipeline creation
azureServiceConnectionId: '<GUID>'

# Web app name
webAppName: '<your-webapp-name>'

# Agent VM image name
vmImageName: 'ubuntu-latest'

# Environment name
environmentName: '<your-webapp-name>'

# Project root folder.
projectRoot: $(System.DefaultWorkingDirectory)

# Python version: 3.11. Change this to match the Python runtime version running on your web app.
pythonVersion: '3.11'

Variable Description
azureServiceConnectionId L’ID ou le nom de la connexion au service Azure Resource Manager.
webAppName Nom de l’application web Azure App Service.
vmImageName Le nom du système d’exploitation à utiliser pour l’agent de build.
environmentName Le nom de l’environnement utilisé dans l’étape de déploiement. L’environnement est automatiquement créé lorsque le travail de l’étape est exécuté.
projectRoot Le dossier racine contenant le code de l’application.
pythonVersion La version de Python à utiliser sur les agents de build et de déploiement.

La section variables contient les variables suivantes :

variables:
# Azure Resource Manager connection created during pipeline creation
azureServiceConnectionId: '<your-service-connection-name>'

# Web app name
webAppName: '<your-webapp-name>'

# Environment name
environmentName: '<your-webapp-name>'

# Project root folder. 
projectRoot: $(System.DefaultWorkingDirectory)

# Python version: 3.11. Change this to the version that is running on your agent and web app.
pythonVersion: '3.11'
Variable Description
azureServiceConnectionId Le nom de la connexion au service Azure Resource Manager.
webAppName Nom de l’application web.
environmentName Le nom de l’environnement utilisé dans l’étape de déploiement.
projectRoot Le dossier contenant le code de l’application. La valeur est une variable système automatique.
pythonVersion La version de Python à utiliser sur les agents de build et de déploiement.

Index de build

L’étape de build contient un seul travail qui s’exécute sur le système d’exploitation défini dans la variable vmImageName.

  - job: BuildJob
    pool:
      vmImage: $(vmImageName)

L’étape de build contient un seul travail qui s’exécute sur un agent dans le pool identifié par le paramètre name. Vous pouvez spécifier les capacités de l’agent avec le mot-clé demands. Par exemple, demands: python spécifie que l’agent doit avoir Python installé. Pour spécifier un agent auto-hébergé par nom, vous pouvez utiliser le mot-clé demands: Agent.Name -equals <agent-name>.

  - job: BuildJob
    pool:
      name: <your-pool-name>
      demands: python

Le travail contient plusieurs étapes :

  1. La tâche UsePythonVersion sélectionne la version de Python à utiliser. La version est définie dans la variable pythonVersion.

       - task: UsePythonVersion@0
          inputs:
            versionSpec: '$(pythonVersion)'
            displayName: 'Use Python $(pythonVersion)'
    
  2. Cette étape utilise un script pour créer un environnement Python virtuel et installer les dépendances de l’application contenues dans le requirements.txt paramètre Spécifie workingDirectory l’emplacement du code de l’application.

      - script: |
           python -m venv antenv
           source antenv/bin/activate
           python -m pip install --upgrade pip
           pip install setup
           pip install  -r ./requirements.txt
         workingDirectory: $(projectRoot)
         displayName: "Install requirements"
    
  3. La tâche ArchiveFiles crée l’archive .zip contenant l’application web. Le fichier .zip est téléchargé dans le pipeline sous forme d’artefact nommé drop. Le fichier .zip est utilisé dans l’étape de déploiement pour déployer l’application sur l’application web.

       - task: ArchiveFiles@2
         displayName: 'Archive files'
         inputs:
           rootFolderOrFile: '$(projectRoot)'
           includeRootFolder: false
           archiveType: zip
           archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
           replaceExistingArchive: true
    
       - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
         displayName: 'Upload package'
         artifact: drop
    
    Paramètre Description
    rootFolderOrFile L’emplacement du code de l’application.
    includeRootFolder Indique si le dossier racine doit être inclus dans le fichier .zip. Définissez ce paramètre sur false sinon, le contenu du fichier .zip est placé dans un dossier nommé s et le conteneur App Service sur Linux ne peut pas trouver le code de l’application.
    archiveType Le type d’archive à créer. Réglez sur zip.
    archiveFile L’emplacement du fichier .zip à créer.
    replaceExistingArchive Indique si une archive existante doit être remplacée si le fichier existe déjà. Réglez sur true.
    upload L’emplacement du fichier .zip à uploader.
    artifact Nom de l’artefact à créer.

Phase de déploiement

L’étape de déploiement est exécutée si l’étape de build se termine avec succès. Les mots-clés suivants définissent ce comportement :

  dependsOn: Build
  condition: succeeded()

L’étape de déploiement contient un seul travail de déploiement configuré avec les mots-clés suivants :

  - deployment: DeploymentJob
    pool:
      vmImage: $(vmImageName)
    environment: $(environmentName)
Mot clé Description
deployment Indique que le travail est un travail de déploiement ciblant un environnement.
pool Spécifie le pool d’agents de déploiement. Le pool d’agents par défaut si le nom n’est pas spécifié. Le mot-clé vmImage identifie le système d’exploitation pour l’image de machine virtuelle de l’agent.
environment Spécifie l’environnement sur lequel déployer. L’environnement est automatiquement créé dans votre projet lorsque le travail est exécuté.
  - deployment: DeploymentJob
    pool:
      name: <your-pool-name>
    environment: $(environmentName)
Mot clé Description
deployment Indique que le travail est un travail de déploiement ciblant un environnement.
pool Spécifie le pool d’agents à utiliser pour le déploiement. Ce pool doit contenir un agent capable d’exécuter la version de Python spécifiée dans le pipeline.
environment Spécifie l’environnement sur lequel déployer. L’environnement est automatiquement créé dans votre projet lorsque le travail est exécuté.

Le mot-clé strategy est utilisé pour définir la stratégie de déploiement. Le mot-clé runOnce spécifie que le travail de déploiement s’exécute une fois. Le mot-clé deploy spécifie les étapes à exécuter dans le travail de déploiement.

  strategy:
    runOnce:
      deploy:
        steps:

Les steps dans le pipeline sont :

  1. Utilisez la tâche UsePythonVersion pour spécifier la version de Python à utiliser sur l’agent. La version est définie dans la variable pythonVersion.

     - task: UsePythonVersion@0
       inputs:
         versionSpec: '$(pythonVersion)'
       displayName: 'Use Python version'
    
  2. Déployez l’application web à l’aide de la tâche AzureWebApp@1. Cette tâche déploie l’artefact de pipeline drop sur votre application web.

    - task: AzureWebApp@1
       displayName: 'Deploy Azure Web App : <your-web-app-name>'
       inputs:
          azureSubscription: $(azureServiceConnectionId)
          appName: $(webAppName)
          package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
    
    Paramètre Description
    azureSubscription L’ID ou le nom de connexion au service Azure Resource Manager à utiliser.
    appName Nom de l’application web.
    package L’emplacement du fichier .zip à déployer.

    De plus, comme le référentiel python-vscode-flask-tutorial contient la même commande de démarrage dans un fichier nommé startup.txt, vous pouvez spécifier ce fichier en ajoutant le paramètre : startUpCommand: 'startup.txt'.

Les steps dans le pipeline sont :

  1. Utilisez la tâche UsePythonVersion pour spécifier la version de Python à utiliser sur l’agent. La version est définie dans la variable pythonVersion.

     - task: UsePythonVersion@0
       inputs:
         versionSpec: '$(pythonVersion)'
       displayName: 'Use Python version'
    
  2. Déployez l’application web à l’aide de la tâche AzureWebApp@1. Cette tâche déploie l’artefact de pipeline drop sur votre application web.

    - task: AzureWebApp@1
       displayName: 'Deploy Azure Web App : <your-web-app-name>'
       inputs:
          azureSubscription: $(azureServiceConnectionId)
          appName: $(webAppName)
          package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
    
    Paramètre Description
    azureSubscription L’ID ou le nom de connexion au service Azure Resource Manager à utiliser.
    appName Nom de l’application web.
    package L’emplacement du fichier .zip à déployer.

    De plus, comme le référentiel python-vscode-flask-tutorial contient la même commande de démarrage dans un fichier nommé startup.txt, vous pouvez spécifier ce fichier en ajoutant le paramètre : startUpCommand: 'startup.txt'.

      - task: AzureWebApp@1
         displayName: 'Deploy Azure Web App : $(webAppName)'
         inputs:
           azureSubscription: $(azureServiceConnectionId)
           appName: $(webAppName)
           package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
           startUpCommand: 'startup.txt'
    
    Paramètre Description
    azureSubscription L’ID ou le nom de connexion au service Azure Resource Manager à utiliser.
    appName Nom de l’application web.
    package L’emplacement du fichier .zip à déployer.
    startUpCommand La commande à exécuter après le déploiement de l’application. L’application d’exemple utilise startup.txt.

Exécuter le pipeline

Vous êtes maintenant prêt à l’essayer !

  1. Dans l’éditeur, sélectionnez Enregistrer et exécuter.

  2. Dans la boîte de dialogue Enregistrer et exécuter, ajoutez un message de commit puis sélectionnez Enregistrer et exécuter.

    Vous pouvez suivre le pipeline pendant son exécution en sélectionnant les étapes ou les travaux dans le résumé de l’exécution du pipeline.

    Capture d’écran de la section des étapes du résumé de l’exécution du pipeline.

    Il y a des coches vertes à côté de chaque étape et travail lorsqu’ils se terminent avec succès. En cas d’erreurs, elles sont affichées dans le résumé ou dans les étapes du travail.

    Capture d’écran des étapes de l’étape du pipeline.

    Vous pouvez rapidement retourner à l’éditeur YAML en sélectionnant les points verticaux en haut à droite de la page Résumé et en sélectionnant Modifier le pipeline :

    Capture d’écran du commentaire de modification de pipeline à partir d’un rapport de build.

  3. À partir du travail de déploiement, sélectionnez la tâche Déployer Azure Web App pour afficher sa sortie. Pour visiter le site déployé, maintenez enfoncée la touche Ctrl et sélectionnez l’URL après App Service Application URL.

    Si vous utilisez l’application d’exemple, l’application devrait apparaître comme suit :

    Capture d’écran de la vue de l’application d’exemple en cours d’exécution sur App Service.

Important

Si votre application échoue en raison d’une dépendance manquante, votre fichier requirements.txt n’a pas été traité pendant le déploiement. Ce comportement se produit si vous avez créé l’application web directement sur le portail plutôt qu’en utilisant la commande az webapp up comme indiqué dans cet article.

La commande az webapp up définit spécifiquement l’action de build SCM_DO_BUILD_DURING_DEPLOYMENT sur true. Si vous avez provisionné le service d’application via le portail, cette action n’est pas automatiquement définie.

Les étapes suivantes définissent l’action :

  1. Ouvrez le Portail Azure, sélectionnez votre App Service, puis sélectionnez Configuration.
  2. Sous l’onglet Paramètres de l’application, sélectionnez Nouveau paramètre d’application.
  3. Dans la fenêtre contextuelle qui s’affiche, définissez Nom sur SCM_DO_BUILD_DURING_DEPLOYMENT et Valeur sur true, puis sélectionnez OK.
  4. Sélectionnez Enregistrer en haut de la page Configuration.
  5. Exécuter de nouveau le pipeline. Vos dépendances doivent être installées pendant le déploiement.

Déclencher une exécution du pipeline

Pour déclencher l’exécution d’un pipeline, apportez une modification au référentiel. Par exemple, vous pouvez ajouter une nouvelle fonctionnalité à l’application ou mettre à jour les dépendances de l’application.

  1. Accédez à votre dépôt GitHub.
  2. Apportez une modification au code, comme changer le titre de l’application.
  3. Validez la modification dans votre référentiel.
  4. Rendez-vous dans votre pipeline et vérifiez qu’une nouvelle exécution est créée.
  5. Lorsque l’exécution est terminée, vérifiez que la nouvelle version est déployée sur votre application web.
    1. Dans le portail Azure, accédez à votre application web.
    2. Sélectionnez Centre de déploiement et sélectionnez l’onglet Journaux.
    3. Vérifiez que le nouveau déploiement est répertorié.

Considérations relatives à Django

Vous pouvez utiliser Azure Pipelines pour déployer des applications Django sur Azure App Service sur Linux si vous utilisez une base de données distincte. Vous ne pouvez pas utiliser une base de données SQLite, car App Service verrouille le fichier db.sqlite3, empêchant les lectures et les écritures. Ce comportement n’affecte pas une base de données externe.

Comme décrit dans Configurer l’application Python sur App Service : Processus de démarrage de conteneur, App Service recherche automatiquement un fichier wsgi.py dans le code de votre application, qui contient généralement l’objet d’application. Si vous souhaitez personnaliser la commande de démarrage de quelque manière que ce soit, utilisez le paramètre startUpCommand à l’étape AzureWebApp@1 de votre fichier de pipeline YAML, comme décrit dans la section précédente.

Lorsque vous utilisez Django, vous souhaitez généralement migrer les modèles de données en utilisant manage.py migrate après le déploiement du code d’application. Vous pouvez ajouter startUpCommand avec un script post-déploiement à cette fin. Par exemple, voici la propriété startUpCommand dans la tâche AzureWebApp@1.

  - task: AzureWebApp@1
      displayName: 'Deploy Azure Web App : $(webAppName)'
      inputs:
        azureSubscription: $(azureServiceConnectionId)
        appName: $(webAppName)
        package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
        startUpCommand: 'python manage.py migrate'

Exécuter des tests sur l’agent de build

Dans le cadre de votre processus de build, vous voudrez peut-être exécuter des tests sur le code de votre application. Les tests s’exécutent sur l’agent de build, vous devez donc installer vos dépendances dans un environnement virtuel sur l’agent de build. Une fois les tests exécutés, supprimez l’environnement virtuel avant de créer le fichier .zip pour le déploiement. Les éléments de script suivants illustrent ce processus. Placez-les avant la tâche ArchiveFiles@2 dans le fichier azure-pipelines.yml. Pour plus d’informations, consultez Exécuter des scripts multiplateformes.

# The | symbol is a continuation character, indicating a multi-line script.
# A single-line script can immediately follow "- script:".
- script: |
    python -m venv .env
    source .env/bin/activate
    pip install setuptools
    pip install -r requirements.txt

  # The displayName shows in the pipeline UI when a build runs
  displayName: 'Install dependencies on build agent'

- script: |
    # Put commands to run tests here
    displayName: 'Run tests'

- script: |
    echo Deleting .env
    deactivate
    rm -rf .env
  displayName: 'Remove .env before zip'

Vous pouvez également utiliser une tâche comme PublishTestResults@2 pour publier les résultats des tests dans votre pipeline. Pour plus d’informations, consultez Générer des applications Python : Exécuter des tests.

Nettoyer les ressources

Pour éviter de payer des frais sur les ressources Azure créées dans ce tutoriel :

  • Supprimez le projet que vous avez créé. La suppression du projet supprime le pipeline et la connexion au service.

  • Supprimez le groupe de ressources Azure contenant le service d’application et le plan du service d’application. Dans le portail Azure, accédez au groupe de ressources, sélectionnez Supprimer le groupe de ressources et suivez les invites.

  • Supprimez le compte de stockage qui maintient le système de fichiers pour Cloud Shell. Fermez Cloud Shell puis accédez au groupe de ressources commençant par cloud-shell-storage-, sélectionnez Supprimer le groupe de ressources et suivez les invites.

Étapes suivantes