Partager via


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

Azure DevOps Services

Ce tutoriel vous montre comment utiliser Azure Pipelines pour l’intégration continue et la livraison continue (CI/CD) pour générer et déployer une application web Python sur Azure App Service sur Linux. Votre pipeline génère et déploie automatiquement votre application web Python sur App Service chaque fois qu’il existe une validation dans votre référentiel de code d’application.

Dans ce tutoriel, vous allez :

  • Créez une application web Python et chargez-la dans Azure App Service.
  • Connectez votre projet Azure DevOps à Azure.
  • Créez un pipeline de build et de déploiement spécifique à Azure Pipelines Python pour votre application.
  • Exécutez le pipeline pour générer, tester et déployer sur votre application web Azure App Service.
  • Paramétrez un déclencheur pour exécuter le pipeline à chaque fois que vous validez dans votre référentiel.

Pour en savoir plus sur les concepts d’Azure Pipelines, regardez la vidéo suivante :

Prérequis

Produit Exigences
Azure DevOps - Un projet Azure DevOps .
- Possibilité d’exécuter des pipelines sur des agents hébergés par Microsoft. Vous pouvez acheter un travail parallèle ou demander un niveau gratuit.
- Connaissance de base de YAML et d’Azure Pipelines. Pour plus d’informations, consultez Créer votre premier pipeline.
- Autorisations :
     - Pour créer un pipeline : vous devez être dans le groupe Contributeurs et le groupe doit avoir l'autorisation Créer un pipeline de construction définie sur Autoriser. Les membres du groupe Administrateurs de projet peuvent gérer les pipelines.
    - Pour créer des connexions de service : vous devez avoir le rôle Administrateur ou Créateur pour les connexions de service.
Lien avec GitHub - Un compte GitHub .
- Connexion de service GitHub pour autoriser Azure Pipelines.
Microsoft Azure Un abonnement Azure.
Produit Exigences
Azure DevOps - Un projet Azure DevOps .
- Un agent auto-hébergé. Pour en créer un, consultez les agents auto-hébergés.
- Connaissance de base de YAML et d’Azure Pipelines. Pour plus d’informations, consultez Créer votre premier pipeline.
- Autorisations :
    - Pour créer un pipeline : vous devez être dans le groupe Contributeurs et le groupe doit avoir l'autorisation Créer un pipeline de construction définie sur Autoriser. Les membres du groupe Administrateurs de projet peuvent gérer les pipelines.
    - Pour créer des connexions de service : vous devez avoir le rôle Administrateur ou Créateur pour les connexions de service.
Lien avec GitHub - Un compte GitHub .
- Connexion de service GitHub pour autoriser Azure Pipelines.
Microsoft Azure Un abonnement Azure.

Configurez un agent auto-hébergé

Le téléchargement des versions de Python n’est pas pris en charge sur les agents de build auto-hébergés. Pour utiliser votre propre agent auto-hébergé, vous devez configurer l’agent pour exécuter Python.

Pour éviter les problèmes de compatibilité, faites correspondre la version python à la version du runtime dans votre application web Azure App Services, 3.11 dans ce cas. Vous devez préinstaller la version Python. Utilisez l’installateur complet pour obtenir une version de Python compatible avec pip.

La version de Python souhaitée doit être ajoutée au cache d’outils sur l’agent auto-hébergé afin que la tâche de pipeline puisse l’utiliser. Normalement, le cache d’outils se trouve sous le répertoire _work/_tool de l’agent. Vous pouvez également remplacer le chemin 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 de 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, pour utiliser Python 3.11 sur une machine Windows 64 bits, créez la structure de répertoires suivante :

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

Si la machine hébergeant votre agent dispose déjà de la version Python que vous souhaitez utiliser, 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.

Préparer l’application d’exemple

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

  2. Clonez votre fork sur votre machine locale en utilisant git clone <your-forked-repository-url>.git.

  3. Accédez à votre clone local à l’aide cd python-sample-vscode-flask-tutorialde , puis générez et exécutez l’application localement pour vous assurer qu’elle fonctionne.

    python -m venv .env
    source .env/Scripts/activate
    pip install --upgrade pip
    pip install -r ./requirements.txt
    export FLASK_APP=hello_app.webapp
    flask run
    
  4. ** Pour tester l’application, accédez à http://localhost:5000 dans une fenêtre de navigateur et vérifiez que vous voyez le titre Didacticiel Flask de Visual Studio.

  5. Fermez la fenêtre du navigateur et arrêtez le serveur Flask à l’aide de Ctrl+C.

Créer et déployer l’application web App Service

Créez votre application web Azure App Service à l’aide de Cloud Shell dans le portail Azure. Pour utiliser Cloud Shell, connectez-vous au portail Azure et sélectionnez le bouton Cloud Shell dans la barre d’outils.

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

Cloud Shell apparaît en bas du navigateur. Vérifiez que Bash est sélectionné comme environnement dans le menu déroulant. Vous pouvez optimiser la fenêtre Cloud Shell pour vous donner plus de place.

Capture d’écran d’Azure Cloud Shell.

Conseil

Pour coller dans Cloud Shell, utilisez Ctrl+Maj+V ou cliquez avec le bouton droit, puis sélectionnez Coller dans le menu contextuel.

Créer et déployer l’application web

  1. Dans Cloud Shell, clonez votre dépôt forké vers Azure avec la commande suivante, en remplaçant <your-forked-repository-url> par l'URL de votre dépôt forké.

    git clone <your-forked-repository-url>
    
  2. Remplacez le répertoire par le dossier de référentiel cloné.

    cd python-sample-vscode-flask-tutorial
    
  3. Exécutez la commande az webapp up pour provisionner l’application web App Service et effectuer le premier déploiement. Utilisez le --name <your-web-app-name> paramètre pour affecter un nom unique dans Azure, tel qu’un nom personnel ou d’entreprise, ainsi qu’un identificateur d’application, comme --name <your-name>-flaskpipelines. L’exécution az webapp up sans paramètre affecte un nom d’application web généré de manière aléatoire unique dans Azure.

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

La az webapp up commande reconnaît l’application en tant qu’application Python et effectue les actions suivantes :

  1. Crée un groupe de ressources par défaut.
  2. Crée un plan App Service par défaut.
  3. Crée une application web avec le nom attribué. L’application URL est <your-web-app-name>.azurewebsites.net.
  4. Déploie tous les fichiers du répertoire de travail actuel dans une archive ZIP, avec l’automatisation de build activée.
  5. Met en cache les paramètres localement dans le fichier .azure/config . Vous n’avez donc pas besoin de les spécifier à nouveau lors du déploiement à partir du dossier du projet avec az webapp up ou d’autres az webapp commandes. Les commandes utilisent automatiquement les valeurs mises en cache par défaut.

Vous pouvez remplacer les actions par défaut par vos propres valeurs à l’aide des paramètres de commande. Pour plus d’informations, consultez az webapp up.

La az webapp up commande produit la sortie JSON suivante pour l’exemple d’application web :

{
  "URL": <your-web-app-url>,
  "appserviceplan": <your-app-service-plan-name>,
  "location": <your-azure-region>,
  "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>
}

Enregistrez les valeurs de URL, resourcegroup, et runtime_version pour les utiliser plus tard dans ce didacticiel.

Définir la commande de démarrage

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 de l'application web startup-file sur startup.txt en entrant la commande suivante, en utilisant vos noms de groupe de ressources et de web app.

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

Une fois la commande terminée, la sortie JSON affiche tous les paramètres de configuration de votre application web.

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. Vérifiez que vous voyez le titre du didacticiel Visual Studio Flask.

Connecter votre projet Azure DevOps à votre abonnement Azure

Pour utiliser Azure Pipelines pour effectuer un déploiement sur votre application web Azure App Service, vous devez connecter votre projet Azure DevOps à vos ressources Azure.

Créer un principal de service

Un principal de service est une identité créée pour les applications, les services hébergés et les outils automatisés permettant d’accéder aux ressources Azure. Cet accès est limité aux rôles attribués au principal de service, ce qui vous permet de contrôler les ressources auxquelles vous pouvez accéder à quel niveau.

Pour créer un principal de service, exécutez la commande suivante dans Bash Cloud Shell. Remplacez <service-principal-name> par un nom pour votre principal de service, <your-subscription-id> par votre ID d’abonnement Azure 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 retourne l’objet JSON suivant :

{
  "appId": "<client GUID>",
  "displayName": "<service-principal-name">,
  "password": "<password-string>",
  "tenant": "<tenant GUID>"
  ...
}

Notez les valeurs de appId, password, et tenantId à utiliser pour créer une connexion de service dans la section suivante.

Créer une connexion de service

Une connexion de service fournit un accès authentifié à partir d’Azure Pipelines vers des services externes et distants. Pour effectuer un déploiement sur votre application web Azure App Service, créez une connexion de service au groupe de ressources de votre application web.

  1. Dans la page de votre projet Azure DevOps, sélectionnez Paramètres du projet.

  2. Dans Paramètres du projet, sélectionnezConnexions de service>.

  3. Dans la page Connexions de service, sélectionnez Nouvelle connexion de service ou Créer une connexion de service si cette connexion de service est la première dans le projet.

    Capture d’écran de la sélection des connexions de service de pipeline dans les paramètres du projet.

  4. Dans l’écran Nouvelle connexion de service , sélectionnez Azure Resource Manager , puis sélectionnez Suivant.

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

  5. Dans l’écran Nouvelle connexion de service Azure , sélectionnez votre type d’identité. Cet exemple utilise l’inscription d’application (automatique) qui est recommandé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.

  6. Pour les informations d’identification, sélectionnez Fédération des identités de charge de travail (automatique).

  7. Renseignez les champs suivants :

    • Niveau d’étendue : sélectionnez Abonnement.
    • Abonnement: Sélectionnez votre abonnement Azure.
    • Groupe de ressources : sélectionnez le groupe de ressources qui contient votre application web.
    • Nom de la connexion de service : entrez un nom descriptif pour la connexion.
    • Accorder des autorisations d’accès à tous les pipelines : activez cette case à cocher pour accorder l’accès à tous les pipelines du projet.
  8. Cliquez sur Enregistrer.

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

  1. Dans la page de votre projet Azure DevOps, sélectionnez Paramètres du projet.

  2. Dans Paramètres du projet, sélectionnezConnexions de service>.

  3. Dans la page Connexions de service, sélectionnez Nouvelle connexion de service ou Créer une connexion de service si cette connexion de service est la première dans le projet.

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

  4. Dans l’écran Nouvelle connexion de service , sélectionnez Azure Resource Manager , puis sélectionnez Suivant.

    Capture d’écran montrant la sélection d’Azure Resource Manager.

  5. Sélectionnez Principal de service (manuel), puis sélectionnez Suivant.

    Capture d’écran montrant la sélection d’une méthode d’authentification de principal de service (manuel).

  6. Dans l’écran Nouvelle connexion de service Azure , renseignez les champs suivants :

    • Environnement : sélectionnez Azure Cloud.
    • Niveau d’étendue : sélectionnez l’abonnement.
    • ID d’abonnement : entrez votre ID d’abonnement Azure.
    • Nom de l’abonnement : entrez le nom de votre abonnement Azure.
  7. Dans la section Authentification , renseignez les champs suivants :

    • ID du principal de service : entrez la appId valeur retournée par la az ad sp create-for-rbac commande.
    • Informations d’identification : sélectionnez la clé du Service principal.
    • Clé du principal de service : entrez la password valeur retournée par la az ad sp create-for-rbac commande.
    • ID de locataire : entrez la tenant valeur retournée par la az ad sp create-for-rbac commande.
    • Sélectionnez Vérifier pour vérifier la connexion.
  8. Dans la section Détails , sous Nom de connexion de service, entrez un nom pour la connexion de service.

  9. Activez la case à cocher Pour accorder des autorisations d’accès à tous les pipelines.

  10. Sélectionnez Vérifier et enregistrer.

    Capture d’écran de la partie supérieure de l’écran nouvelle connexion de service.

La nouvelle connexion apparaît dans la liste des connexions de service et est prête à être utilisée dans votre pipeline.

Créer une chaîne de traitement

Créez un pipeline pour construire et déployer votre application web Python sur Azure App Service.

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

  2. Dans la page Pipelines , sélectionnez Nouveau pipeline ou Créez un pipeline si ce pipeline est le premier dans le projet.

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

  3. Dans l’écran Où se trouve votre code , sélectionnez GitHub. Vous pourriez être invité à vous connecter à GitHub.

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

  4. Dans l’écran Sélectionner un référentiel, sélectionnez votre référentiel d'exemple bifurqué. GitHub peut vous inviter à entrer à nouveau votre mot de passe GitHub ou à installer l’application GitHub Azure Pipelines . Suivez les instructions à l’écran pour installer l’application. Pour plus d’informations, consultez l’authentification des applications GitHub.

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

  5. Dans la page Configurer votre pipeline , sélectionnez Python sur Linux Web App sur Azure.

  6. Dans l’écran suivant, sélectionnez votre abonnement Azure et sélectionnez Continuer.

  7. Dans l’écran suivant, sélectionnez votre application web Azure, puis sélectionnez Valider et configurer.

Azure Pipelines crée un fichier azure-pipelines.yml et l’affiche dans l’éditeur de pipeline YAML.

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

  2. Dans la page Pipelines , sélectionnez Nouveau pipeline ou Créez un pipeline si ce pipeline est le premier dans le projet.

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

  3. Dans la page 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. Sous l’onglet Sélectionner un référentiel , sélectionnez votre exemple de référentiel forked. GitHub peut vous inviter à entrer à nouveau votre mot de passe GitHub ou à installer l’extension ou l’application GitHub Azure Pipelines . Suivez les instructions à l’écran pour installer l’application. Pour plus d’informations, consultez Accès aux référentiels GitHub.

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

  5. Dans la page Configurer votre pipeline , sélectionnez Pipeline de démarrage.

  6. Dans la page Vérifier votre yaML de pipeline , remplacez le contenu du fichier de démarrage azure-pipelines.yml par le fichier de pipeline YAML suivant. Dans le fichier YAML :

    • Remplacez les espaces réservés <your-service-connection-name> et <your-web-app-name> par vos valeurs.

    • Remplacez <your-pool-name> par le nom du pool d’agents que vous souhaitez utiliser, puis remplacez <your-python-version> par la version de Python exécutée sur votre agent. Cette version doit correspondre à la sortie JSON de la commande az webapp upruntime_version.

Fichier YAML de pipeline

Sur la page Révision de votre YAML de pipeline, examinez le pipeline afin de comprendre son fonctionnement. Assurez-vous que toutes les entrées par défaut sont adaptées à votre code. Pour en savoir plus sur le schéma de fichier YAML du pipeline, consultez la référence de schéma YAML.

L’exemple complet suivant de fichier de pipeline YAML définit votre pipeline CI/CD comme une série d’étapes, de travaux et d’étapes, où chaque étape contient les détails des différentes tâches et scripts. Le code YAML généré remplit automatiquement les espaces réservés avec des valeurs pour votre application et votre connexion.

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 setuptools
        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
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'

Variables

La variables section au début du fichier YAML définit les variables suivantes :

Variable Description
azureServiceConnectionId ID de la connexion de service Azure Resource Manager.
webAppName Nom de l’application web App Service.
vmImageName Le nom du système d’exploitation à utiliser pour l’agent de build.
environmentName Nom de l’environnement à déployer, qui est créé automatiquement lors de l’exécution du travail de déploiement.
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.
Variable Description
azureServiceConnectionId ID de la connexion de service Azure Resource Manager.
webAppName Nom de l’application web App Service.
environmentName Nom de l’environnement à déployer, qui est créé automatiquement lors de l’exécution du travail 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.

Phases de génération et de déploiement

Le pipeline se compose des phases de construction et de déploiement.

Étape de construction

L’étape de génération contient un travail unique qui s’exécute sur le système d’exploitation défini dans la vmImageName variable, dans ce cas ubuntu-latest.

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

L’étape de génération contient une seule tâche qui s’exécute sur un agent dans 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 demands: Agent.Name -equals <agent-name>.

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

Le travail contient plusieurs étapes :

  1. Tout d’abord, la tâche UsePythonVersion sélectionne la version de Python à utiliser, comme défini dans la pythonVersion variable.

       - task: UsePythonVersion@0
          inputs:
            versionSpec: '$(pythonVersion)'
            displayName: 'Use Python $(pythonVersion)'
    
  2. L’étape suivante utilise un script qui crée un environnement Python virtuel et installe les dépendances de l’application à partir de requirements.txt. Le workingDirectory paramètre spécifie l’emplacement du code de l’application.

       - script: |
            python -m venv antenv
            source antenv/bin/activate
            python -m pip install --upgrade pip
            pip install setuptools
            pip install  -r ./requirements.txt
          workingDirectory: $(projectRoot)
          displayName: "Install requirements"
    
  3. La tâche ArchiveFiles crée une archive ZIP qui contient l’application web générée.

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

    Les paramètres sont définis comme suit :

    Paramètre Description
    rootFolderOrFile L’emplacement du code de l’application.
    includeRootFolder Indique s’il faut inclure le dossier racine dans le fichier .zip . Réglez sur false. Si la valeur est définie true, le contenu du fichier .zip est placé dans un dossier nommé s et la tâche 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.
  4. Le fichier .zip est ensuite téléchargé vers le pipeline en tant qu’artefact nommé drop. L’étape de déploiement utilise le fichier .zip pour déployer l’application.

        - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
          displayName: 'Upload package'
          artifact: drop
    
    • Le upload paramètre définit l’emplacement et le nom du fichier .zip à charger.
    • Le artifact paramètre définit le nom de l’artefact créé sur drop.

Phase de déploiement

L’étape de déploiement s’exécute si l’étape de compilation se termine correctement. Les mots clés dependsOn et condition définissent ce comportement.

  dependsOn: Build
  condition: succeeded()

L’étape de déploiement contient un travail de déploiement unique configuré comme suit.

  - deployment: DeploymentJob
    pool:
      vmImage: $(vmImageName)
    environment: $(environmentName)
  • Le deployment mot clé indique que le travail est un travail de déploiement ciblant un environnement sur lequel effectuer le déploiement. Le environment fichier est créé automatiquement dans votre projet lors de l’exécution du travail.

  • Le pool paramètre spécifie le pool d’agents de déploiement et utilise le pool d’agents par défaut s’il name n’est pas spécifié. L’agent s’exécute sur le système d’exploitation défini dans la vmImageName variable, dans ce cas ubuntu-latest.

  - deployment: DeploymentJob
    pool:
      name: <your-pool-name>
    environment: $(environmentName)
  • Le deployment mot clé indique que le travail est un travail de déploiement ciblant un environnement sur lequel effectuer le déploiement. Le environment fichier est créé automatiquement dans votre projet lors de l’exécution du travail.

  • Le pool paramètre spécifie le pool d’agents de déploiement et doit contenir un agent avec la possibilité d’exécuter la version python spécifiée dans le pipeline.

Le strategy mot clé définit la stratégie de déploiement.

  strategy:
    runOnce:
      deploy:
        steps:
  • Le mot-clé runOnce spécifie que le travail de déploiement s’exécute une fois.
  • Le deploy mot clé spécifie l’exécution steps dans le travail de déploiement.

Dans steps cette étape, exécutez les tâches suivantes :

  1. UsePythonVersion@0 sélectionne la version de Python à utiliser, comme dans la phase de génération.
  2. AzureWebApp@1 déploie l’application web et l’artefact drop ZIP.
- task: AzureWebApp@1
    displayName: 'Deploy Azure Web App : <your-web-app-name>'
  inputs:
    azureSubscription: $(azureServiceConnectionId)
    appName: $(webAppName)
    package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
  • Le azureSubscription paramètre contient les azureServiceConnectionId variables de pipeline spécifiées.
  • La appName contient la valeur de la variable webAppName.
  • Spécifie package le nom et l’emplacement du fichier .zip à déployer.

En outre, étant donné que le référentiel python-vscode-flask-tutorial contient la commande de démarrage de l’application dans un fichier nommé startup.txt, vous pouvez spécifier la commande de démarrage de l’application en ajoutant le paramètre : startUpCommand: 'startup.txt'.

Exécuter le pipeline

Vous êtes maintenant prêt à essayer le pipeline.

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

  2. Dans l’écran Enregistrer et exécuter , ajoutez un message de validation si vous le souhaitez, puis sélectionnez Enregistrer et exécuter.

    Vous pouvez surveiller l’exécution du pipeline en sélectionnant les étapes ou les travaux sur la page Résumé du pipeline. Chaque tâche et chaque étape affichent une coche verte au fur et à mesure qu'elles sont terminées avec succès. Si des erreurs se produisent, elles apparaissent dans le résumé ou dans les étapes du travail.

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

    Vous pouvez rapidement revenir à 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.

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

  4. Dans la sortie, sélectionnez l’URL après l’URL de l’application App Service. L’application doit apparaître comme suit :

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

Remarque

Si un déploiement d’application échoue en raison d’une dépendance manquante, le fichier requirements.txt n’a pas été traité pendant le déploiement. Ce problème peut se produire si vous créez l’application web directement dans le portail plutôt que d’utiliser la az webapp up commande.

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

Pour définir cette action :

  1. Dans la page du portail de votre application web, sélectionnez Configuration dans le menu de navigation de gauche.
  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. Les dépendances devraient maintenant s'installer pendant le déploiement.

Déclencher une exécution du pipeline

Ce pipeline est défini pour s’exécuter chaque fois qu’une modification est effectuée dans le référentiel de code. 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 au dépôt GitHub de votre application.
  2. Apportez une modification au code, comme changer le titre de l’application.
  3. Validez la modification.
  4. Accédez à votre pipeline et vérifiez qu’une nouvelle exécution est créée et est en cours d’exécution.
  5. Une fois que l’exécution est terminée, vérifiez que les modifications ont été correctement déployées sur votre application web.
  6. Dans le portail Azure, accédez à votre application web et sélectionnez Centre de déploiement dans le menu de navigation de gauche.
  7. Sélectionnez l’onglet Journaux et vérifiez que le nouveau déploiement est répertorié.

Déployer des applications Django sur App Service

Vous pouvez utiliser Azure Pipelines pour déployer des applications Django sur 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 les bases de données externes.

Comme expliqué dans le processus de démarrage du 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, utilisez le startUpCommand paramètre à l’étape AzureWebApp@1 de votre fichier de pipeline YAML.

Lorsque vous utilisez Django, vous souhaitez généralement migrer les modèles de données à l’aide manage.py migrate d’après le déploiement du code de l’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 de test 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 Exécuter des tests.

Nettoyer les ressources

Si vous avez terminé avec les ressources Azure que vous avez créées dans ce tutoriel, supprimez-les pour éviter les frais supplémentaires.

  • Supprimez le projet Azure DevOps 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 Azure qui gère le système de fichiers Cloud Shell. Fermez Cloud Shell, puis recherchez le groupe de ressources qui commence par cloud-shell-storage-. Sélectionnez Supprimer le groupe de ressources, puis suivez les invites.