DevOps

Création de pipelines CI/CD avec Azure DevOps

10 janvier 2026
Sabhat Qureshi
15 min de lecture

Qu'est-ce que CI/CD ?

L'Intégration Continue (CI) et le Déploiement Continu (CD) sont des pratiques qui automatisent la construction, les tests et le déploiement des applications. Azure Pipelines fournit une plateforme puissante et flexible pour mettre en œuvre CI/CD pour toute stack technologique, y compris les solutions Dynamics 365 et Power Platform. Azure Pipelines.

Avantages du CI/CD

  • Livraison plus rapide : Automatiser les tâches répétitives
  • Meilleure qualité : Détecter les problèmes tôt avec les tests automatisés
  • Risque réduit : Changements plus petits et incrémentaux
  • Cohérence : Même processus à chaque déploiement
  • Traçabilité : Lier les déploiements aux changements de code

Vue d'ensemble d'Azure pipelines

Types de pipeline

  • Pipelines YAML : Pipeline-as-code, versionné, approche recommandée
  • Pipelines classiques : Concepteur visuel, configuration basée sur l'UI

Concepts clés

  • Trigger : Ce qui démarre le pipeline (commit, planning, manuel)
  • Stage : Division logique (Build, Test, Deploy)
  • Job : Unité de travail s'exécutant sur un agent
  • Step : Tâche ou script individuel
  • Agent : Machine qui exécute le pipeline

Bases des Pipelines YAML

Pipeline de build simple

# azure-pipelines.yml
trigger:
  branches:
    include:
      - main
      - develop

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

stages:
- stage: Build
  displayName: 'Build Stage'
  jobs:
  - job: BuildJob
    displayName: 'Build Solution'
    steps:
    - task: NuGetToolInstaller@1
      displayName: 'Install NuGet'

    - task: NuGetCommand@2
      displayName: 'Restore NuGet Packages'
      inputs:
        restoreSolution: '$(solution)'

    - task: VSBuild@1
      displayName: 'Build Solution'
      inputs:
        solution: '$(solution)'
        platform: '$(buildPlatform)'
        configuration: '$(buildConfiguration)'

    - task: VSTest@2
      displayName: 'Run Unit Tests'
      inputs:
        platform: '$(buildPlatform)'
        configuration: '$(buildConfiguration)'

    - task: PublishBuildArtifacts@1
      displayName: 'Publish Artifacts'
      inputs:
        pathtoPublish: '$(Build.ArtifactStagingDirectory)'
        artifactName: 'drop'

Pipeline CI/CD Dynamics 365

Power Platform Build Tools

Microsoft fournit les Power Platform Build Tools pour Azure DevOps pour automatiser la gestion des solutions :

# Dynamics 365 Solution Pipeline
trigger:
  branches:
    include:
      - main

pool:
  vmImage: 'windows-latest'

variables:
  SolutionName: 'MySolution'
  ServiceConnection: 'PowerPlatform-Dev'

stages:
- stage: Export
  displayName: 'Export from Dev'
  jobs:
  - job: ExportSolution
    steps:
    - task: PowerPlatformToolInstaller@2
      displayName: 'Install Power Platform Tools'

    - task: PowerPlatformExportSolution@2
      displayName: 'Export Unmanaged Solution'
      inputs:
        authenticationType: 'PowerPlatformSPN'
        PowerPlatformSPN: '$(ServiceConnection)'
        SolutionName: '$(SolutionName)'
        SolutionOutputFile: '$(Build.ArtifactStagingDirectory)/$(SolutionName).zip'
        Managed: false

    - task: PowerPlatformUnpackSolution@2
      displayName: 'Unpack Solution'
      inputs:
        SolutionInputFile: '$(Build.ArtifactStagingDirectory)/$(SolutionName).zip'
        SolutionTargetFolder: '$(Build.SourcesDirectory)/solutions/$(SolutionName)'
        SolutionType: 'Both'

    - task: PublishBuildArtifacts@1
      displayName: 'Publish Solution Artifact'
      inputs:
        pathtoPublish: '$(Build.ArtifactStagingDirectory)'
        artifactName: 'solution'

- stage: Build
  displayName: 'Build Managed Solution'
  dependsOn: Export
  jobs:
  - job: PackSolution
    steps:
    - task: PowerPlatformToolInstaller@2

    - task: DownloadBuildArtifacts@1
      inputs:
        buildType: 'current'
        downloadType: 'single'
        artifactName: 'solution'

    - task: PowerPlatformPackSolution@2
      displayName: 'Pack as Managed'
      inputs:
        SolutionSourceFolder: '$(Build.SourcesDirectory)/solutions/$(SolutionName)'
        SolutionOutputFile: '$(Build.ArtifactStagingDirectory)/$(SolutionName)_managed.zip'
        SolutionType: 'Managed'

    - task: PublishBuildArtifacts@1
      inputs:
        pathtoPublish: '$(Build.ArtifactStagingDirectory)'
        artifactName: 'managed-solution'

Pipeline de déploiement

- stage: DeployTest
  displayName: 'Deploy to Test'
  dependsOn: Build
  condition: succeeded()
  jobs:
  - deployment: DeployToTest
    displayName: 'Deploy to Test Environment'
    environment: 'Test'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: PowerPlatformToolInstaller@2

          - task: PowerPlatformImportSolution@2
            displayName: 'Import Solution'
            inputs:
              authenticationType: 'PowerPlatformSPN'
              PowerPlatformSPN: 'PowerPlatform-Test'
              SolutionInputFile: '$(Pipeline.Workspace)/managed-solution/$(SolutionName)_managed.zip'
              AsyncOperation: true
              MaxAsyncWaitTime: '60'

          - task: PowerPlatformPublishCustomizations@2
            displayName: 'Publish Customizations'
            inputs:
              authenticationType: 'PowerPlatformSPN'
              PowerPlatformSPN: 'PowerPlatform-Test'

- stage: DeployProd
  displayName: 'Deploy to Production'
  dependsOn: DeployTest
  condition: succeeded()
  jobs:
  - deployment: DeployToProd
    displayName: 'Deploy to Production'
    environment: 'Production'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: PowerPlatformToolInstaller@2

          - task: PowerPlatformImportSolution@2
            inputs:
              authenticationType: 'PowerPlatformSPN'
              PowerPlatformSPN: 'PowerPlatform-Prod'
              SolutionInputFile: '$(Pipeline.Workspace)/managed-solution/$(SolutionName)_managed.zip'
              AsyncOperation: true
              MaxAsyncWaitTime: '120'

Connexions de service

Principal de Service Power Platform

Configurer les connexions de service pour les déploiements automatisés :

  1. Créer l'enregistrement d'application Microsoft Entra ID
  2. Accorder les permissions API Dataverse
  3. Créer l'utilisateur d'application dans le Centre d'administration Power Platform
  4. Assigner les rôles de sécurité appropriés
  5. Créer la connexion de service dans les paramètres du projet Azure DevOps

Approbations et portes d'environnement

Approbations manuelles

Configurer les portes d'approbation pour les déploiements en production :

  • Définir les approbateurs pour chaque environnement
  • Définir le timeout et les politiques d'approbation
  • Exiger plusieurs approbateurs pour les environnements critiques
  • Notifications par e-mail pour les approbations en attente

Portes automatisées

  • Alertes Azure Monitor : Vérifier les incidents actifs
  • Requêtes d'éléments de travail : S'assurer que tous les bugs sont résolus
  • Appels API REST : Points de terminaison de validation personnalisés
  • Conformité Azure Policy : Vérifications de sécurité

Variables et secrets

Groupes de variables

Organiser les variables par environnement :

variables:
- group: 'PowerPlatform-Dev-Variables'
- group: 'Common-Variables'
- name: localVariable
  value: 'someValue'

Intégration Azure Key Vault

Lier les groupes de variables à Azure Key Vault pour une gestion sécurisée des secrets :

  • Stocker les chaînes de connexion et clés API dans Key Vault
  • Créer un groupe de variables lié à Key Vault
  • Secrets automatiquement récupérés à l'exécution
  • Auditer l'accès via les logs Key Vault

Tests dans les pipelines

Tests unitaires

- task: VSTest@2
  displayName: 'Run Unit Tests'
  inputs:
    testSelector: 'testAssemblies'
    testAssemblyVer2: |
      **/*Tests.dll
      !**/obj/**
    searchFolder: '$(System.DefaultWorkingDirectory)'
    codeCoverageEnabled: true
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

Solution Checker

Exécuter l'analyse statique sur les solutions Power Platform :

- task: PowerPlatformChecker@2
  displayName: 'Run Solution Checker'
  inputs:
    authenticationType: 'PowerPlatformSPN'
    PowerPlatformSPN: '$(ServiceConnection)'
    FilesToAnalyze: '$(Build.ArtifactStagingDirectory)/*.zip'
    RuleSet: 'Solution Checker'

Bonnes pratiques

Conception du pipeline

  • Utiliser les pipelines YAML pour le contrôle de version
  • Garder les pipelines DRY avec des templates
  • Mettre en œuvre des noms de stage/job significatifs
  • Ajouter des valeurs de timeout appropriées
  • Utiliser des conditions pour contrôler le flux d'exécution

Sécurité

  • Ne jamais stocker de secrets dans les fichiers YAML
  • Utiliser des principaux de service avec permissions minimales
  • Activer les politiques de branche pour les changements de pipeline
  • Examiner les exécutions de pipeline pour un comportement inattendu
  • Faire tourner les identifiants régulièrement

Performance

  • Mettre en cache les dépendances entre les exécutions
  • Paralléliser les jobs indépendants
  • Utiliser des tailles d'agent appropriées
  • Sauter les étapes inutiles avec des conditions
  • Archiver les artefacts sélectivement

Conclusion

Azure Pipelines fournit une plateforme robuste pour mettre en œuvre CI/CD pour les solutions Dynamics 365 et Power Platform. En automatisant le processus de build, test et déploiement, les équipes peuvent livrer des changements plus rapidement avec plus de confiance. Commencez avec un pipeline simple et ajoutez progressivement des stages, tests et approbations à mesure que votre processus mûrit.

Besoin d'aide pour votre projet Dynamics 365 ?

Nous pouvons vous aider à mettre en place des pipelines CI/CD pour vos solutions Power Platform et Dynamics 365.