Meilleures pratiques de déploiementDeployment Best Practices

Chaque équipe de développement a des exigences uniques qui peuvent compliquer l’implémentation d’un pipeline de déploiement efficace sur un service cloud.Every development team has unique requirements that can make implementing an efficient deployment pipeline difficult on any cloud service. Cet article présente les trois principaux composants du déploiement sur App Service : les sources de déploiement, les pipelines de génération et les mécanismes de déploiement.This article introduces the three main components of deploying to App Service: deployment sources, build pipelines, and deployment mechanisms. Cet article présente également quelques-unes des meilleures pratiques et des conseils pour des piles de langage spécifiques.This article also covers some best practices and tips for specific language stacks.

Composants de déploiementDeployment Components

Source de déploiementDeployment Source

Une source de déploiement correspond à l’emplacement de votre code d’application.A deployment source is the location of your application code. Pour les applications de production, la source de déploiement est généralement un référentiel hébergé par un logiciel de gestion de version, comme GitHub, BitBucket ou Azure Repos.For production apps, the deployment source is usually a repository hosted by version control software such as GitHub, BitBucket, or Azure Repos. Pour les scénarios de développement et de test, la source de déploiement peut être un projet sur votre ordinateur local.For development and test scenarios, the deployment source may be a project on your local machine. App Service prend également en charge les dossiers OneDrive et Dropbox comme sources de déploiement.App Service also supports OneDrive and Dropbox folders as deployment sources. Bien que les dossiers cloud puissent faciliter la prise en main d’App Service, il n’est généralement pas recommandé d’utiliser cette source pour les applications de production au niveau de l’entreprise.While cloud folders can make it easy to get started with App Service, it is not typically recommended to use this source for enterprise-level production applications.

Pipeline de buildBuild Pipeline

Une fois que vous avez choisi une source de déploiement, l’étape suivante consiste à choisir un pipeline de build.Once you decide on a deployment source, your next step is to choose a build pipeline. Un pipeline de build lit votre code source à partir de la source de déploiement et exécute une série d’étapes (telles que la compilation de code, la minimisation du HTML et du JavaScript, l’exécution de tests et l’empaquetage de composants) pour rendre l’application exécutable.A build pipeline reads your source code from the deployment source and executes a series of steps (such as compiling code, minifying HTML and JavaScript, running tests, and packaging components) to get the application in a runnable state. Les commandes spécifiques exécutées par le pipeline de build dépendent de votre pile de langage.The specific commands executed by the build pipeline depend on your language stack. Ces opérations peuvent être exécutées sur un serveur de builds, comme Azure Pipelines, ou exécutées localement.These operations can be executed on a build server such as Azure Pipelines, or executed locally.

Mécanisme de déploiementDeployment Mechanism

Le mécanisme de déploiement est l’action utilisée pour placer votre application intégrée dans le répertoire /home/site/wwwroot de votre application web.The deployment mechanism is the action used to put your built application into the /home/site/wwwroot directory of your web app. Le répertoire /wwwroot est un emplacement de stockage monté partagé par toutes les instances de votre application web.The /wwwroot directory is a mounted storage location shared by all instances of your web app. Lorsque le mécanisme de déploiement place votre application dans ce répertoire, vos instances reçoivent une notification pour synchroniser les nouveaux fichiers.When the deployment mechanism puts your application in this directory, your instances receive a notification to sync the new files. App Service prend en charge les mécanismes de déploiement suivants :App Service supports the following deployment mechanisms:

  • Points de terminaison Kudu : Kudu est l’outil de productivité de développement open source qui s’exécute en tant que processus distinct dans App Service Windows, et en tant que deuxième conteneur dans App Service Linux.Kudu endpoints: Kudu is the open-source developer productivity tool that runs as a separate process in Windows App Service, and as a second container in Linux App Service. Kudu gère les déploiements continus et fournit des points de terminaison HTTP pour le déploiement, comme zipdeploy.Kudu handles continuous deployments and provides HTTP endpoints for deployment, such as zipdeploy.
  • FTP et WebDeploy : À l' aide des informations d’identification de votre site ou de votre utilisateur, vous pouvez télécharger des fichiers via FTP ou WebDeploy.FTP and WebDeploy: Using your site or user credentials, you can upload files via FTP or WebDeploy. Ces mécanismes ne passent pas par Kudu.These mechanisms do not go through Kudu.

Les outils de déploiement, tels qu’Azure Pipelines, Jenkins et les plug-ins d’éditeur utilisent un de ces mécanismes de déploiement.Deployment tools such as Azure Pipelines, Jenkins, and editor plugins use one of these deployment mechanisms.

Utiliser des emplacements de déploiementUse deployment slots

Dans la mesure du possible, utilisez des emplacements de déploiement lors du déploiement d’un nouveau build de production.Whenever possible, use deployment slots when deploying a new production build. Lorsque vous utilisez un plan App Service Standard ou mieux, vous pouvez déployer votre application dans un environnement intermédiaire, valider vos modifications et effectuer des tests de vérification de build.When using a Standard App Service Plan tier or better, you can deploy your app to a staging environment, validate your changes, and do smoke tests. Lorsque vous êtes prêt, vous pouvez échanger vos emplacements intermédiaires et de production.When you are ready, you can swap your staging and production slots. L’opération d’échange préchauffe les instances de worker nécessaires pour correspondre à votre échelle de production, ce qui élimine les temps d’arrêt.The swap operation warms up the necessary worker instances to match your production scale, thus eliminating downtime.

Déployer du code en continuContinuously deploy code

Si votre projet a désigné des branches pour le test, l’assurance qualité et la mise en lots, chacune de ces branches doit être déployée en continu vers un emplacement de préproduction.If your project has designated branches for testing, QA, and staging, then each of those branches should be continuously deployed to a staging slot. (C’est ce que l’on appelle la conception Gitflow.) Cela permet à vos parties prenantes d’évaluer et de tester facilement la branche déployée.(This is known as the Gitflow design.) This allows your stakeholders to easily assess and test the deployed the branch.

Le déploiement continu ne doit jamais être activé pour votre emplacement de production.Continuous deployment should never be enabled for your production slot. Au lieu de cela, votre branche de production (souvent principal) doit être déployée sur un emplacement de non-production.Instead, your production branch (often main) should be deployed onto a non-production slot. Lorsque vous êtes prêt à mettre en production la branche de base, échangez-la dans l’emplacement de production.When you are ready to release the base branch, swap it into the production slot. Un échange en production, au lieu d’un déploiement en production, vous permet d’éviter les temps d’arrêt et de restaurer les modifications en les échangeant à nouveau.Swapping into production—instead of deploying to production—prevents downtime and allows you to roll back the changes by swapping again.

Diagramme montrant le flux entre les branches Dev, Staging et proncipale, ainsi que les emplacements dans lesquels elles sont déployées.

Déployer des conteneurs en continuContinuously deploy containers

Pour les conteneurs personnalisés de Docker ou d’autres registres de conteneurs, déployez l’image dans un emplacement de préproduction et échangez en production pour éviter les temps d’arrêt.For custom containers from Docker or other container registries, deploy the image into a staging slot and swap into production to prevent downtime. L’automatisation est plus complexe que le déploiement du code, car vous devez envoyer (push) l’image vers un registre de conteneurs et mettre à jour la balise d’image sur l’application web.The automation is more complex than code deployment because you must push the image to a container registry and update the image tag on the webapp.

Pour chaque branche que vous souhaitez déployer sur un emplacement, configurez l’automatisation pour effectuer les opérations suivantes à chaque validation de la branche.For each branch you want to deploy to a slot, set up automation to do the following on each commit to the branch.

  1. Générez et balisez l’image.Build and tag the image. Dans le cadre du pipeline de build, balisez l’image avec l’ID de validation git, l’horodateur ou d’autres informations identifiables.As part of the build pipeline, tag the image with the git commit ID, timestamp, or other identifiable information. Il est préférable de ne pas utiliser la balise « latest » par défaut.It’s best not to use the default “latest” tag. Sinon, il est difficile de retracer le code actuellement déployé, ce qui rend le débogage beaucoup plus compliqué.Otherwise, it’s difficult to trace back what code is currently deployed, which makes debugging far more difficult.
  2. Envoyez (push) l’image balisée.Push the tagged image. Une fois l’image générée et balisée, le pipeline envoie (push) l’image à notre registre de conteneurs.Once the image is built and tagged, the pipeline pushes the image to our container registry. À l’étape suivante, l’emplacement de déploiement extraira l’image balisée du registre de conteneurs.In the next step, the deployment slot will pull the tagged image from the container registry.
  3. Mettez à jour l’emplacement de déploiement avec la nouvelle balise d’image.Update the deployment slot with the new image tag. Lorsque cette propriété est mise à jour, le site redémarre automatiquement et extrait la nouvelle image conteneur.When this property is updated, the site will automatically restart and pull the new container image.

Contrôle de l’utilisation de l’emplacement

Vous trouverez ci-dessous des exemples d’infrastructures d’automatisation courantes.There are examples below for common automation frameworks.

Utiliser Azure DevOpsUse Azure DevOps

App Service est doté de la livraison continue intégrée pour les conteneurs via le centre de déploiement.App Service has built-in continuous delivery for containers through the Deployment Center. Accédez à votre application dans le Portail Azure et sélectionnez Centre de déploiement sous Déploiement.Navigate to your app in the Azure portal and select Deployment Center under Deployment. Suivez les instructions pour sélectionner votre référentiel et votre branche.Follow the instructions to select your repository and branch. Cela permet de configurer un pipeline de build et de mise en production DevOps pour générer, baliser et déployer automatiquement votre conteneur lorsque de nouvelles validations sont envoyées (push) à la branche que vous avez sélectionnée.This will configure a DevOps build and release pipeline to automatically build, tag, and deploy your container when new commits are pushed to your selected branch.

Utiliser GitHub ActionsUse GitHub Actions

Vous pouvez également automatiser le déploiement de vos conteneurs à l’aide de GitHub Actions.You can also automate your container deployment with GitHub Actions. Le fichier de workflow ci-dessous génère et balise le conteneur avec l’ID de validation, l’envoie (push) à un registre de conteneurs et met à jour l’emplacement de site spécifié avec la nouvelle balise d’image.The workflow file below will build and tag the container with the commit ID, push it to a container registry, and update the specified site slot with the new image tag.

name: Build and deploy a container image to Azure Web Apps

on:
  push:
    branches:
    - <your-branch-name>

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@main

    -name: Authenticate using a Service Principal
      uses: azure/actions/login@v1
      with:
        creds: ${{ secrets.AZURE_SP }}

    - uses: azure/container-actions/docker-login@v1
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

    - name: Build and push the image tagged with the git commit hash
      run: |
        docker build . -t contoso/demo:${{ github.sha }}
        docker push contoso/demo:${{ github.sha }}

    - name: Update image tag on the Azure Web App
      uses: azure/webapps-container-deploy@v1
      with:
        app-name: '<your-webapp-name>'
        slot-name: '<your-slot-name>'
        images: 'contoso/demo:${{ github.sha }}'

Utiliser d’autres fournisseurs d’automatisationUse other automation providers

Les étapes répertoriées ci-dessus s’appliquent à d’autres utilitaires d’automatisation tels que CircleCI ou Travis CI.The steps listed earlier apply to other automation utilities such as CircleCI or Travis CI. Toutefois, vous devez utiliser Azure CLI pour mettre à jour les emplacements de déploiement avec de nouvelles balises d’image lors de la dernière étape.However, you need to use the Azure CLI to update the deployment slots with new image tags in the final step. Pour utiliser Azure CLI dans votre script d’automatisation, générez un principal de service à l’aide de la commande suivante.To use the Azure CLI in your automation script, generate a Service Principal using the following command.

az ad sp create-for-rbac --name "myServicePrincipal" --role contributor \
   --scopes /subscriptions/{subscription}/resourceGroups/{resource-group} \
   --sdk-auth

Dans votre script, connectez-vous en utilisant az login --service-principal et en fournissant les informations du principal.In your script, log in using az login --service-principal, providing the principal’s information. Vous pouvez ensuite utiliser az webapp config container set pour définir le nom du conteneur, la balise, l’URL du registre et le mot de passe du registre.You can then use az webapp config container set to set the container name, tag, registry URL, and registry password. Vous trouverez ci-dessous quelques liens utiles pour créer votre processus CI de conteneur.Below are some helpful links for you to construct your container CI process.

Considérations spécifiques au langageLanguage-Specific Considerations

JavaJava

Utilisez l’API zipdeploy/ de Kudu pour déployer des applications JAR, et wardeploy/ pour des applications WAR.Use the Kudu zipdeploy/ API for deploying JAR applications, and wardeploy/ for WAR apps. Si vous utilisez Jenkins, vous pouvez utiliser ces API directement lors de votre phase de déploiement.If you are using Jenkins, you can use those APIs directly in your deployment phase. Pour plus d’informations, consultez cet article.For more information, see this article.

NœudNode

Par défaut, Kudu exécute les étapes de génération de votre application Node (npm install).By default, Kudu executes the build steps for your Node application (npm install). Si vous utilisez un service de build tel qu’Azure DevOps, la build Kudu n’est pas nécessaire.If you are using a build service such as Azure DevOps, then the Kudu build is unnecessary. Pour désactiver la build Kudu, créez un paramètre d’application SCM_DO_BUILD_DURING_DEPLOYMENT, avec une valeur de false.To disable the Kudu build, create an app setting, SCM_DO_BUILD_DURING_DEPLOYMENT, with a value of false.

.NET.NET

Par défaut, Kudu exécute les étapes de génération de votre application .NET (dotnet build).By default, Kudu executes the build steps for your .NET application (dotnet build). Si vous utilisez un service de build tel qu’Azure DevOps, la build Kudu n’est pas nécessaire.If you are using a build service such as Azure DevOps, then the Kudu build is unnecessary. Pour désactiver la build Kudu, créez un paramètre d’application SCM_DO_BUILD_DURING_DEPLOYMENT, avec une valeur de false.To disable the Kudu build, create an app setting, SCM_DO_BUILD_DURING_DEPLOYMENT, with a value of false.

Autres points à prendre en considération pour le déploiementOther Deployment Considerations

cache localLocal Cache

Le contenu Azure App Service est stocké sur Stockage Azure est exposé de manière durable en tant que partage de contenu.Azure App Service content is stored on Azure Storage and is surfaced up in a durable manner as a content share. Toutefois, certaines applications ont uniquement besoin d’un magasin de contenu en lecture seule très performant à partir duquel elles peuvent s’exécuter avec une haute disponibilité.However, some apps just need a high-performance, read-only content store that they can run with high availability. Ces applications peuvent tirer parti de l’utilisation du cache local.These apps can benefit from using local cache. Le cache local n’est pas recommandé pour les sites de gestion de contenu tels que WordPress.Local cache is not recommended for content management sites such as WordPress.

Utilisez toujours le cache local conjointement avec les emplacements de déploiement pour éviter les temps d’arrêt.Always use local cache in conjunction with deployment slots to prevent downtime. Consultez cette section pour plus d’informations sur l’utilisation conjointe de ces fonctionnalités.See this section for information on using these features together.

Utilisation de l’UC ou de mémoire élevéeHigh CPU or Memory

Si votre plan App Service utilise plus de 90 % de l’UC ou de la mémoire disponible, la machine virtuelle sous-jacente risque de rencontrer des problèmes lors du traitement de votre déploiement.If your App Service Plan is using over 90% of available CPU or memory, the underlying virtual machine may have trouble processing your deployment. Dans ce cas, mettez temporairement à l’échelle le nombre d’instances pour effectuer le déploiement.When this happens, temporarily scale up your instance count to perform the deployment. Une fois le déploiement terminé, vous pouvez remettre le nombre d’instances à sa valeur précédente.Once the deployment has finished, you can return the instance count to its previous value.

Pour plus d’informations sur les bonnes pratiques, consultez Diagnostics App Service pour connaître les bonnes pratiques applicables spécifiques à votre ressource.For more information on best practices, visit App Service Diagnostics to find out actionable best practices specific to your resource.

  • Accédez à votre application web dans le portail Azure.Navigate to your Web App in the Azure portal.
  • Dans le volet de navigation de gauche, cliquez sur Diagnostiquer et résoudre les problèmes pour ouvrir Diagnostics App Service.Click on Diagnose and solve problems in the left navigation, which opens App Service Diagnostics.
  • Choisissez la vignette de page d’accueil Bonnes pratiques.Choose Best Practices homepage tile.
  • Cliquez sur Bonnes pratiques pour la disponibilité et les performances ou Bonnes pratiques pour une configuration optimale afin d’afficher l’état actuel de votre application en ce qui concerne ces bonnes pratiques.Click Best Practices for Availability & Performance or Best Practices for Optimal Configuration to view the current state of your app in regards to these best practices.

Vous pouvez également utiliser ce lien pour ouvrir directement Diagnostics App Service pour votre ressource : https://ms.portal.azure.com/?websitesextension_ext=asd.featurePath%3Ddetectors%2FParentAvailabilityAndPerformance#@microsoft.onmicrosoft.com/resource/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Web/sites/{siteName}/troubleshoot.You can also use this link to directly open App Service Diagnostics for your resource: https://ms.portal.azure.com/?websitesextension_ext=asd.featurePath%3Ddetectors%2FParentAvailabilityAndPerformance#@microsoft.onmicrosoft.com/resource/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Web/sites/{siteName}/troubleshoot.