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.

    Screenshot of Visual Studio Code Explorer, with the new file shown in the deploy folder.

  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.

    Screenshot of Azure DevOps with the link to the latest pipeline run highlighted.

    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é.

    Screenshot of a pipeline run in Azure DevOps, with the Lint stage reporting failure.

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

    Screenshot of a pipeline run in Azure DevOps, with the name of the Lint stage highlighted.

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

    Screenshot of the pipeline log for the Lint stage, with the step for running a Bicep linter highlighted.

    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é.

    Screenshot of the pipeline run, with the Lint stage reporting success and the Validate stage reporting failure.

  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.

    Screenshot of the pipeline log for the Validate stage, with the step for running preflight validation highlighted.

    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 :

    Screenshot of the pipeline run in Azure DevOps, with all three stages reporting success.

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.