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
Une organisation Azure DevOps. Si vous n’en avez pas, vous pouvez en créer un gratuitement. Si votre équipe en a déjà une, vérifiez que vous êtes bien un administrateur du projet Azure DevOps que vous souhaitez utiliser.
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.
Si vous prévoyez d’utiliser GitHub au lieu d’Azure Repos, vous avez également besoin d’un référentiel GitHub. Si vous ne possédez pas de compte GitHub, vous pouvez créer un compte gratuit.
Application de fonction existante dans Azure dont le code source se trouve dans un référentiel pris en charge. Si vous n’avez pas encore de projet de code Azure Functions, vous pouvez en créer un en suivant l’article spécifique au langage suivant :
N’oubliez pas de télécharger le projet de code local sur votre référentiel GitHub ou Azure Repos après l’avoir publié dans votre application de fonction.
Générer votre application
- Connectez-vous à votre organisation Azure DevOps et accédez à votre projet.
- Dans votre projet, accédez à la page Pipelines. Sélectionnez ensuite Nouveau pipeline.
- 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. Lorsque cette connexion est votre 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.
- Lorsque la liste des dépôts s’affiche, sélectionnez votre dépôt d’exemples d’applications.
- 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.
- Sélectionnez Enregistrer et exécuter, Valider directement sur la branche primaire, puis choisissez à nouveau Enregistrer et exécuter.
- 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 en tant qu’application de fonction conteneurisée après chaque génération réussie. Pour en savoir plus sur les conteneurs, consultez Utilisation des conteneurs et d’Azure Functions.
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.
Pour obtenir un exemple complet de bout en bout de pipeline, notamment la génération du conteneur et la publication dans le registre de conteneurs, consultez cet exemple de déploiement de conteneur Azure Pipelines.
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 commande az 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
- Connectez-vous à votre organisation Azure DevOps et accédez à votre projet.
- Dans votre projet, accédez à la page Pipelines. Choisissez ensuite l’action pour créer un pipeline.
- Suivez les étapes de l’Assistant en sélectionnant d’abord GitHub comme emplacement du code source.
- Vous serez peut-être redirigé vers GitHub pour vous connecter. Si c’est le cas, entrez vos informations d’identification GitHub.
- Lorsque la liste des dépôts s’affiche, sélectionnez votre dépôt d’exemples d’applications.
- 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.
- 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. Vous devez créer une connexion qui utilise la fédération d’identité de charge de travail.
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 des vérifications de prédéploiement réseau. Le déploiement s’arrête en cas d’erreur de prédéploiement.
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 commande az 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
- Consultez la vue d’ensemble d’Azure Functions
- Consultez la vue d’ensemble d’Azure DevOps.