Livraison continue avec Azure Pipelines

Azure Pipelines permet de déployer automatiquement sur Azure Functions. Azure Pipelines vous permet de créer, tester et déployer avec l’intégration continue (CI) et la livraison continue (CD) à l’aide d’Azure DevOps.

Les pipelines YAML sont définis à l’aide d’un fichier YAML dans votre référentiel. Une étape est le plus petit bloc de construction d’un pipeline, et peut être un script ou une tâche (script prédéfini). En savoir plus sur les principaux concepts et composants qui composent un pipeline.

Vous allez utiliser la tâche AzureFunctionApp pour déployer sur Azure Functions. Il existe maintenant deux versions de la tâche AzureFunctionApp (AzureFunctionApp@1, AzureFunctionApp@2). AzureFunctionApp@2 inclut une prise en charge améliorée de la validation qui rend les pipelines moins susceptibles d’échouer en raison d’erreurs.

Choisissez la version de votre tâche en haut de l’article. Les pipelines YAML ne sont pas disponibles pour Azure DevOps 2019 et versions antérieures.

Prérequis

Générer votre application

  1. Connectez-vous à votre organisation Azure DevOps et accédez à votre projet.
  2. Dans votre projet, accédez à la page Pipelines. Sélectionnez ensuite Nouveau pipeline.
  3. Sélectionnez l’une de ces options pour Où se trouve votre code ? :
    • GitHub : Vous allez éventuellement être redirigé vers GitHub pour vous connecter. Si c’est le cas, entrez vos informations d’identification GitHub. Lors de la première connexion à GitHub, l’assistant vous guide également dans le processus de connexion de DevOps à vos comptes GitHub.
    • Azure Repos Git : Vous pouvez immédiatement choisir un référentiel dans votre projet DevOps actuel.
  4. Lorsque la liste des dépôts s’affiche, sélectionnez votre dépôt d’exemples d’applications.
  5. Azure Pipelines analyse votre référentiel et fournit une liste de modèles potentiels dans Configurer votre pipeline. Choisissez le modèle d’application de fonction approprié pour votre langue. Si vous ne voyez pas le modèle approprié, sélectionnez Afficher plus.
  6. Sélectionnez Enregistrer et exécuter, Valider directement sur la branche primaire, puis choisissez à nouveau Enregistrer et exécuter.
  7. Une nouvelle exécution est lancée. Attendez la fin de l’exécution.

Exemples de pipelines de build YAML

Les pipelines propres aux langages suivants peuvent être utilisés pour créer des applications.

Vous pouvez utiliser l’exemple suivant pour créer un fichier YAML pour générer votre application .NET.

Si vous voyez des erreurs lors de la génération de votre application, vérifiez que la version de .NET que vous utilisez correspond à votre version Azure Functions. Pour plus d’informations, consultez Vue d’ensemble des versions du runtime Azure Functions.

pool:
  vmImage: 'windows-latest'
steps:
- script: |
    dotnet restore
    dotnet build --configuration Release
- task: DotNetCoreCLI@2
  inputs:
    command: publish
    arguments: '--configuration Release --output publish_output'
    projects: '*.csproj'
    publishWebProjects: false
    modifyOutputPath: false
    zipAfterPublish: false
- task: ArchiveFiles@2
  displayName: "Archive files"
  inputs:
    rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output"
    includeRootFolder: false
    archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
    artifactName: 'drop'

Déployer votre application

Vous déploierez avec la tâche de déploiement d’application de fonction Azure. Cette tâche nécessite une connexion de service Azure comme entrée. Une connexion de service Azure stocke les informations d’identification pour se connecter à Azure à partir d’Azure Pipelines.

Pour effectuer un déploiement sur Azure Functions, ajoutez l’extrait de code suivant à la fin de votre fichier azure-pipelines.yml. Le appType par défaut est Windows. Vous pouvez spécifier Linux en affectant functionAppLinux à la valeur appType.

trigger:
- main

variables:
  # Azure service connection established during pipeline creation
  azureSubscription: <Name of your Azure subscription>
  appName: <Name of the function app>
  # Agent VM image name
  vmImageName: 'ubuntu-latest'

- task: AzureFunctionApp@1 # Add this at the end of your file
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux # default is functionApp
    appName: $(appName)
    package: $(System.ArtifactsDirectory)/**/*.zip
    #Uncomment the next lines to deploy to a deployment slot
    #Note that deployment slots is not supported for Linux Dynamic SKU
    #deployToSlotOrASE: true
    #resourceGroupName: '<Resource Group Name>'
    #slotName: '<Slot name>'

L’extrait de code part du principe que les étapes de génération de votre fichier YAML produisent l’archive zip dans le dossier $(System.ArtifactsDirectory) sur votre agent.

Déploiement d’un conteneur

Vous pouvez déployer automatiquement votre code sur Azure Functions en tant que conteneur personnalisé après chaque génération réussie. Pour en savoir plus sur les conteneurs, consultez Créer une fonction sur Linux en utilisant un conteneur personnalisé.

Déployer avec la tâche Application de fonction Azure pour conteneur

La façon la plus simple de déployer sur un conteneur consiste à utiliser la tâche de déploiement Application de fonction Azure pour conteneur.

Pour déployer, ajoutez l’extrait de code suivant à la fin de votre fichier YAML :

trigger:
- main

variables:
  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: <Docker registry service connection>
  imageRepository: <Name of your image repository>
  containerRegistry: <Name of the Azure container registry>
  dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile'
  tag: '$(Build.BuildId)'

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

- task: AzureFunctionAppContainer@1 # Add this at the end of your file
  inputs:
    azureSubscription: '<Azure service connection>'
    appName: '<Name of the function app>'
    imageName: $(containerRegistry)/$(imageRepository):$(tag)

L’extrait de code envoie l’image Docker à votre Azure Container Registry. La tâche de déploiement Application de fonction Azure pour conteneur extrait l’image Docker appropriée correspondant au BuildId du dépôt spécifié, puis déploie l’image.

Déployer sur un emplacement

Vous pouvez configurer votre application de fonction pour qu’elle ait plusieurs emplacements. Les emplacements vous permettent de déployer votre application de manière sécurisée, et de la tester avant de la mettre à la disposition de vos clients.

L’extrait de code YAML suivant montre comment effectuer un déploiement vers un emplacement de préproduction, puis basculer vers un emplacement de production :

- task: AzureFunctionApp@1
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux
    appName: <Name of the Function app>
    package: $(System.ArtifactsDirectory)/**/*.zip
    deployToSlotOrASE: true
    resourceGroupName: <Name of the resource group>
    slotName: staging

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: <Azure service connection>
    WebAppName: <name of the Function app>
    ResourceGroupName: <name of resource group>
    SourceSlot: staging
    SwapWithProduction: true

Créer un pipeline avec Azure CLI

Pour créer un pipeline de build dans Azure, utilisez la commandeaz functionapp devops-pipeline create. Le pipeline de build est créé pour créer et mettre en production toutes les modifications du code de votre référentiel. Cette commande génère un nouveau fichier YAML qui définit le pipeline de génération et de mise en production et le valide dans votre référentiel. Les conditions préalables de cette commande varient selon l’emplacement de votre code.

  • Si votre code se trouve dans GitHub :

    • Vous devez disposer des autorisations en écriture dans votre abonnement.

    • Vous devez être l’administrateur de projet dans Azure DevOps.

    • Vous devez disposer des autorisations nécessaires pour créer un jeton d’accès personnel GitHub disposant d’autorisations suffisantes. Pour plus d’informations, consultez Autorisations requises du jeton d’accès personnel GitHub.

    • Vous devez disposer des autorisations nécessaires pour valider dans la branche principale de votre référentiel GitHub pour valider le fichier YAML généré automatiquement.

  • Si votre code se trouve dans Azure Repos :

    • Vous devez disposer des autorisations en écriture dans votre abonnement.

    • Vous devez être l’administrateur de projet dans Azure DevOps.

Générer votre application

  1. Connectez-vous à votre organisation Azure DevOps et accédez à votre projet.
  2. Dans votre projet, accédez à la page Pipelines. Choisissez ensuite l’action pour créer un pipeline.
  3. Suivez les étapes de l’Assistant en sélectionnant d’abord GitHub comme emplacement du code source.
  4. Vous serez peut-être redirigé vers GitHub pour vous connecter. Si c’est le cas, entrez vos informations d’identification GitHub.
  5. Lorsque la liste des dépôts s’affiche, sélectionnez votre dépôt d’exemples d’applications.
  6. Azure Pipelines analysera votre dépôt et recommandera un modèle. Sélectionnez Enregistrer et exécuter, Valider directement sur la branche primaire, puis choisissez à nouveau Enregistrer et exécuter.
  7. Une nouvelle exécution est lancée. Attendez la fin de l’exécution.

Exemples de pipelines de build YAML

Les pipelines propres aux langages suivants peuvent être utilisés pour créer des applications.

Vous pouvez utiliser l’exemple suivant pour créer un fichier YAML pour générer votre application .NET :

pool:
  vmImage: 'windows-latest'
steps:
- script: |
    dotnet restore
    dotnet build --configuration Release
- task: DotNetCoreCLI@2
  inputs:
    command: publish
    arguments: '--configuration Release --output publish_output'
    projects: '*.csproj'
    publishWebProjects: false
    modifyOutputPath: false
    zipAfterPublish: false
- task: ArchiveFiles@2
  displayName: "Archive files"
  inputs:
    rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output"
    includeRootFolder: false
    archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
    artifactName: 'drop'

Déployer votre application

Vous déploierez avec la tâche de déploiement d’application de fonction Azure v2. Cette tâche nécessite une connexion de service Azure comme entrée. Une connexion de service Azure stocke les informations d’identification pour se connecter à Azure à partir d’Azure Pipelines.

La version v2 de la tâche inclut la prise en charge des piles d’applications plus récentes pour .NET, Python et Node. La tâche inclut les vérifications préalables au déploiement réseau et le déploiement ne se poursuit pas en cas de problèmes.

Pour effectuer un déploiement sur Azure Functions, ajoutez l’extrait de code suivant à la fin de votre fichier azure-pipelines.yml. Le appType par défaut est Windows. Vous pouvez spécifier Linux en affectant functionAppLinux à la valeur appType.

trigger:
- main

variables:
  # Azure service connection established during pipeline creation
  azureSubscription: <Name of your Azure subscription>
  appName: <Name of the function app>
  # Agent VM image name
  vmImageName: 'ubuntu-latest'

- task: AzureFunctionApp@2 # Add this at the end of your file
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux # default is functionApp
    appName: $(appName)
    package: $(System.ArtifactsDirectory)/**/*.zip
    deploymentMethod: 'auto' # 'auto' | 'zipDeploy' | 'runFromPackage'. Required. Deployment method. Default: auto.
    #Uncomment the next lines to deploy to a deployment slot
    #Note that deployment slots is not supported for Linux Dynamic SKU
    #deployToSlotOrASE: true
    #resourceGroupName: '<Resource Group Name>'
    #slotName: '<Slot name>'

L’extrait de code part du principe que les étapes de génération de votre fichier YAML produisent l’archive zip dans le dossier $(System.ArtifactsDirectory) sur votre agent.

Déploiement d’un conteneur

Vous pouvez déployer automatiquement votre code sur Azure Functions en tant que conteneur personnalisé après chaque génération réussie. Pour en savoir plus sur les conteneurs, consultez Utilisation des conteneurs et d’Azure Functions.

Déployer avec la tâche Application de fonction Azure pour conteneur

La façon la plus simple de déployer sur un conteneur consiste à utiliser la tâche de déploiement Application de fonction Azure pour conteneur.

Pour déployer, ajoutez l’extrait de code suivant à la fin de votre fichier YAML :

trigger:
- main

variables:
  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: <Docker registry service connection>
  imageRepository: <Name of your image repository>
  containerRegistry: <Name of the Azure container registry>
  dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile'
  tag: '$(Build.BuildId)'

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

- task: AzureFunctionAppContainer@1 # Add this at the end of your file
  inputs:
    azureSubscription: '<Azure service connection>'
    appName: '<Name of the function app>'
    imageName: $(containerRegistry)/$(imageRepository):$(tag)

L’extrait de code envoie l’image Docker à votre Azure Container Registry. La tâche de déploiement Application de fonction Azure pour conteneur extrait l’image Docker appropriée correspondant au BuildId du dépôt spécifié, puis déploie l’image.

Déployer sur un emplacement

Vous pouvez configurer votre application de fonction pour qu’elle ait plusieurs emplacements. Les emplacements vous permettent de déployer votre application de manière sécurisée, et de la tester avant de la mettre à la disposition de vos clients.

L’extrait de code YAML suivant montre comment effectuer un déploiement vers un emplacement de préproduction, puis basculer vers un emplacement de production :

- task: AzureFunctionApp@2
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux
    appName: <Name of the Function app>
    package: $(System.ArtifactsDirectory)/**/*.zip
    deploymentMethod: 'auto'
    deployToSlotOrASE: true
    resourceGroupName: <Name of the resource group>
    slotName: staging

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: <Azure service connection>
    WebAppName: <name of the Function app>
    ResourceGroupName: <name of resource group>
    SourceSlot: staging
    SwapWithProduction: true

Créer un pipeline avec Azure CLI

Pour créer un pipeline de build dans Azure, utilisez la commandeaz functionapp devops-pipeline create. Le pipeline de build est créé pour créer et mettre en production toutes les modifications du code de votre référentiel. Cette commande génère un nouveau fichier YAML qui définit le pipeline de génération et de mise en production et le valide dans votre référentiel. Les conditions préalables de cette commande varient selon l’emplacement de votre code.

  • Si votre code se trouve dans GitHub :

    • Vous devez disposer des autorisations en écriture dans votre abonnement.

    • Vous devez être l’administrateur de projet dans Azure DevOps.

    • Vous devez disposer des autorisations nécessaires pour créer un jeton d’accès personnel GitHub disposant d’autorisations suffisantes. Pour plus d’informations, consultez Autorisations requises du jeton d’accès personnel GitHub.

    • Vous devez disposer des autorisations nécessaires pour valider dans la branche principale de votre référentiel GitHub pour valider le fichier YAML généré automatiquement.

  • Si votre code se trouve dans Azure Repos :

    • Vous devez disposer des autorisations en écriture dans votre abonnement.

    • Vous devez être l’administrateur de projet dans Azure DevOps.

Étapes suivantes