Exercice - Ajouter des phases de linting et de validation à votre pipeline

Effectué

Vous avez parlé avec votre équipe et vous avez décidé d’automatiser davantage vos déploiements en utilisant un pipeline. Vous voulez renforcer la confiance dans ce que vous déployez.

Dans cet exercice, vous allez ajouter des phases de validation à votre pipeline. Vous exécuterez ensuite le linter et la validation préalable avant chaque déploiement.

Pendant ce processus, vous allez :

  • Mettre à jour votre pipeline existant en ajoutant deux nouvelles phases pour effectuer une vérification lint et valider votre code Bicep.
  • Exécuter votre pipeline.
  • Corrigez tous les problèmes détectés par votre pipeline.

Mettre à jour votre pipeline pour le préparer aux phases

Tout d’abord, vous devez mettre à jour votre fichier de pipeline pour définir une phase. Azure Pipelines crée automatiquement une phase pour vous, mais comme que vous allez bientôt ajouter des phases supplémentaires, vous devez mettre à jour votre pipeline pour définir explicitement des phases.

  1. Dans Visual Studio Code, ouvrez le fichier azure-pipelines.yml dans le dossier deploy.

  2. Supprimez tout ce qui se trouve dans le fichier depuis la ligne 14 jusqu’au bas du fichier. Veillez également à supprimer la ligne jobs:.

  3. En bas du fichier, ajoutez le code suivant :

    stages:
    
    - stage: Deploy
      jobs:
      - job: Deploy
        steps:
          - task: AzureResourceManagerTemplateDeployment@3
            name: Deploy
            displayName: Deploy to Azure
            inputs:
              connectedServiceName: $(ServiceConnectionName)
              deploymentName: $(Build.BuildNumber)
              location: $(DeploymentDefaultLocation)
              resourceGroupName: $(ResourceGroupName)
              csmFile: deploy/main.bicep
              overrideParameters: >
                -environmentType $(EnvironmentType)
    

    Conseil

    Les fichiers YAML sont sensibles à l’indentation. Si vous tapez ou que vous collez ce code, veillez à ce que l’indentation soit correcte. Dans la section suivante, vous examinerez la définition complète du pipeline YAML pour vérifier que votre fichier y correspond.

Ajouter les phases de vérification lint et de validation à votre pipeline

  1. En dessous de la ligne stages:, ajoutez une phase lint :

    - stage: Lint
      jobs:
      - job: LintCode
        displayName: Lint code
        steps:
          - script: |
              az bicep build --file deploy/main.bicep
            name: LintBicepCode
            displayName: Run Bicep linter
    

    Cette phase définit une seule étape, qui exécute la commande az bicep build pour effectuer le linting du fichier Bicep.

  2. En dessous des lignes que vous venez d’ajouter, ajoutez une phase de validation :

    - stage: Validate
      jobs:
      - job: ValidateBicepCode
        displayName: Validate Bicep code
        steps:
          - task: AzureResourceManagerTemplateDeployment@3
            name: RunPreflightValidation
            displayName: Run preflight validation
            inputs:
              connectedServiceName: $(ServiceConnectionName)
              location: $(deploymentDefaultLocation)
              deploymentMode: Validation
              resourceGroupName: $(ResourceGroupName)
              csmFile: deploy/main.bicep
              overrideParameters: >
                -environmentType $(EnvironmentType)
    

    Cette phase définit une seule étape, qui exécute la validation préalable. Notez que cette étape inclut une référence à votre connexion de service, car le processus de validation préalable nécessite une communication avec Azure.

    La définition de votre pipeline comporte maintenant trois phases. La première exécute le linter sur votre fichier Bicep, la deuxième effectue une validation préliminaire et la troisième effectue le déploiement sur Azure.

  3. Enregistrez le fichier .

Configurer le linter

Par défaut, le linter Bicep émet un avertissement quand il détecte un problème dans votre fichier. Azure Pipelines ne traite pas les avertissements du linter comme des problèmes devant entraîner l’arrêt de votre pipeline. Pour personnaliser ce comportement, vous créez un fichier bicepconfig.json qui reconfigure le linter.

  1. Ajoutez le nouveau fichier dans le dossier deploy et nommez-le bicepconfig.json.

    Capture d’écran de l’Explorateur Visual Studio Code qui montre le nouveau fichier dans le dossier deploy.

  2. Copiez le code suivant dans le fichier :

    {
      "analyzers": {
        "core": {
          "enabled": true,
          "verbose": true,
          "rules": {
            "adminusername-should-not-be-literal": {
              "level": "error"
            },
            "max-outputs": {
              "level": "error"
            },
            "max-params": {
              "level": "error"
            },
            "max-resources": {
              "level": "error"
            },
            "max-variables": {
              "level": "error"
            },
            "no-hardcoded-env-urls": {
              "level": "error"
            },
            "no-unnecessary-dependson": {
              "level": "error"
            },
            "no-unused-params": {
              "level": "error"
            },
            "no-unused-vars": {
              "level": "error"
            },
            "outputs-should-not-contain-secrets": {
              "level": "error"
            },
            "prefer-interpolation": {
              "level": "error"
            },
            "secure-parameter-default": {
              "level": "error"
            },
            "simplify-interpolation": {
              "level": "error"
            },
            "protect-commandtoexecute-secrets": {
              "level": "error"
            },
            "use-stable-vm-image": {
              "level": "error"
            }
          }
        }
      }
    }
    
  3. Enregistrez le fichier .

Vérifier et commiter votre définition de pipeline

  1. Vérifiez que votre fichier azure-pipelines.yml se présente comme le fichier suivant :

    trigger:
      batch: true
      branches:
        include:
        - main
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
      - name: deploymentDefaultLocation
        value: westus3
    
    stages:
    
    - stage: Lint
      jobs:
      - job: LintCode
        displayName: Lint code
        steps:
          - script: |
              az bicep build --file deploy/main.bicep
            name: LintBicepCode
            displayName: Run Bicep linter
    
    - stage: Validate
      jobs:
      - job: ValidateBicepCode
        displayName: Validate Bicep code
        steps:
          - task: AzureResourceManagerTemplateDeployment@3
            name: RunPreflightValidation
            displayName: Run preflight validation
            inputs:
              connectedServiceName: $(ServiceConnectionName)
              location: $(deploymentDefaultLocation)
              deploymentMode: Validation
              resourceGroupName: $(ResourceGroupName)
              csmFile: deploy/main.bicep
              overrideParameters: >
                -environmentType $(EnvironmentType)
    
    - stage: Deploy
      jobs:
      - job: Deploy
        steps:
          - task: AzureResourceManagerTemplateDeployment@3
            name: Deploy
            displayName: Deploy to Azure
            inputs:
              connectedServiceName: $(ServiceConnectionName)
              deploymentName: $(Build.BuildNumber)
              location: $(DeploymentDefaultLocation)
              resourceGroupName: $(ResourceGroupName)
              csmFile: deploy/main.bicep
              overrideParameters: >
                -environmentType $(EnvironmentType)
    

    Si ce n’est pas le cas, modifiez-le d’après cet exemple, puis enregistrez-le.

  2. Commitez et poussez (push) vos modifications à votre dépôt Git en exécutant les commandes suivantes dans le terminal Visual Studio Code :

    git add .
    git commit -m "Add lint and validation stages"
    git push
    

    Immédiatement après votre envoi, Azure Pipelines démarre une nouvelle exécution du pipeline.

Visualiser l’exécution du pipeline

  1. Dans votre navigateur, accédez à Pipelines.

  2. Sélectionnez l’exécution la plus récente de votre pipeline.

    Capture d’écran de l’interface Azure DevOps, avec le lien vers l’exécution la plus récente du pipeline mis en évidence.

    Si le pipeline est toujours en cours d’exécution, attendez qu’il soit terminé. Azure Pipelines met automatiquement à jour la page avec l’état le plus récent, mais il est toutefois conseillé d’actualiser régulièrement cette page.

  3. Notez que l’exécution du pipeline montre maintenant les trois phases que vous avez définies dans le fichier YAML. Notez aussi que la phase Vérification lint a échoué.

    Capture d’écran d’une exécution du pipeline dans Azure DevOps, avec le message d’échec de la phase Lint.

  4. Sélectionnez la phase Vérification lint pour voir ses détails.

    Capture d’écran d’une exécution du pipeline dans Azure DevOps, avec le nom de la phase Lint mis en évidence.

  5. Sélectionnez l’étape Exécuter le linter Bicep pour voir le journal du pipeline.

    Capture d’écran du journal du pipeline pour la phase Lint, avec l’étape d’exécution d’un linter Bicep mise en évidence.

    Notez que le message d’erreur affiché est similaire au suivant :

    Erreur no-unused-params : Le paramètre « storageAccountNameParam » est déclaré mais jamais utilisé.

    Cette erreur indique que le linter a détecté une violation de règle dans votre fichier Bicep.

Corriger l’erreur du linter

Maintenant que vous avez identifié le problème, vous pouvez le résoudre dans votre fichier Bicep.

  1. Dans Visual Studio Code, ouvrez le fichier main.bicep dans le dossier deploy.

  2. Notez que le linter Bicep a également détecté que le paramètre storageAccountNameParam n’est pas utilisé. Visual Studio Code indique le paramètre inutilisé avec une ligne ondulée. Normalement, la ligne devrait être en jaune pour indiquer un avertissement. Comme vous avez personnalisé le fichier bicepconfig.json, le linter traite le code comme une erreur et affiche la ligne en rouge.

    param storageAccountNameParam string = uniqueString(resourceGroup().id)
    
  3. Supprimez le paramètre storageAccountNameParam.

  4. Enregistrez le fichier .

  5. Commitez et poussez (push) vos modifications à votre dépôt Git en exécutant les commandes suivantes dans le terminal Visual Studio Code :

    git add .
    git commit -m "Remove unused parameter"
    git push
    

    Là encore, Azure Pipelines déclenche automatiquement une nouvelle exécution de votre pipeline.

Revisualiser l’exécution du pipeline

  1. Dans votre navigateur, accédez à votre pipeline.

  2. Sélectionnez la dernière exécution.

    Attendez la fin de l’exécution du pipeline. Azure Pipelines met automatiquement à jour la page avec l’état le plus récent, mais il est toutefois conseillé d’actualiser régulièrement cette page.

  3. Notez que la phase Lint s’est terminée correctement, mais que la phase Validate a échoué.

    Capture d’écran de l’exécution du pipeline, avec le message de réussite de la phase Lint et le message d’échec de la phase Validate.

  4. Sélectionnez la phase Validation pour voir ses détails.

  5. Sélectionnez l’étape Exécuter la validation préliminaire pour voir le journal du pipeline.

    Capture d’écran du journal du pipeline pour la phase Validate, avec l’étape d’exécution d’une validation préalable mise en évidence.

    Notez que l’erreur indiquée dans le journal contient le message suivant :

    mystorageresourceNameSuffix n’est pas un nom de compte de stockage valide. Un nom de compte de stockage doit être compris entre 3 et 24 caractères composés uniquement de chiffres et de lettres en minuscules.

    Cette erreur indique que le nom du compte de stockage n’est pas valide.

Corriger l’erreur de validation

Vous avez trouvé un autre problème dans le fichier Bicep. Ici, vous allez corriger le problème.

  1. Dans Visual Studio Code, ouvrez le fichier main.bicep dans le dossier deploy.

  2. Examinez la définition de la variable storageAccountName :

    var appServiceAppName = 'toy-website-${resourceNameSuffix}'
    var appServicePlanName = 'toy-website'
    var applicationInsightsName = 'toywebsite'
    var logAnalyticsWorkspaceName = 'workspace-${resourceNameSuffix}'
    var storageAccountName = 'mystorageresourceNameSuffix'
    

    Il semble y avoir une faute de frappe, et l’interpolation de chaîne n’a pas été configurée correctement.

  3. Mettez à jour la variable storageAccountName de façon à utiliser correctement l’interpolation de chaîne :

    var storageAccountName = 'mystorage${resourceNameSuffix}'
    
  4. Enregistrez le fichier .

  5. Commitez et poussez (push) vos modifications à votre dépôt Git en exécutant les commandes suivantes dans le terminal Visual Studio Code :

    git add .
    git commit -m "Fix string interpolation"
    git push
    

Visualiser l’exécution réussie du pipeline

  1. Dans votre navigateur, accédez à votre pipeline.

  2. Sélectionnez la dernière exécution.

    Attendez la fin de l’exécution du pipeline. Azure Pipelines met automatiquement à jour la page avec l’état le plus récent, mais il est toutefois conseillé d’actualiser régulièrement cette page.

  3. Notez que les trois phases du pipeline se sont terminées avec succès :

    Capture d’écran d’une exécution du pipeline dans Azure DevOps, qui montre les messages de réussite des trois phases.

Vous avez maintenant un pipeline qui détecte correctement les erreurs dans votre code Bicep tôt dans votre processus de déploiement, puis qui déploie sur Azure s’il n’y a pas d’erreurs.