Exercice : Ajouter des travaux lint et validate à votre workflow

Effectué

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

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

Au cours du processus, vous effectuez les tâches suivantes :

  • Mettre à jour votre workflow existant en ajoutant deux nouveaux travaux pour le linting et la validation de votre code Bicep.
  • Exécutez votre workflow.
  • Corriger tous les problèmes détectés par votre workflow.

Ajouter des travaux de linting et de validation à votre workflow

  1. Dans Visual Studio Code, ouvrez le fichier workflow.yml situé dans le dossier .github/workflows.

  2. Dans la section env:, remplacez la valeur de la variable AZURE_RESOURCEGROUP_NAME par ToyWebsiteTest :

    env:
      AZURE_RESOURCEGROUP_NAME: ToyWebsiteTest
      ENVIRONMENT_TYPE: Test
    
  3. Sous la ligne jobs:, au-dessus du travail deploy, ajoutez un nouveau travail lint :

    jobs:
      lint:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - name: Run Bicep linter
          run: az bicep build --file deploy/main.bicep
    

    Ce travail définit une étape qui extrait le code et une étape qui exécute la commande az bicep build pour effectuer le linting du fichier Bicep.

    Conseil

    Les fichiers YAML sont sensibles à l’indentation. Si vous tapez ou que vous collez ce code, veillez à ce que l’indentation soit correcte. Plus loin dans cet exercice, vous examinerez la définition complète du workflow YAML pour vérifier que votre fichier y correspond.

  4. En dessous des lignes que vous venez d’ajouter, et au-dessus du travail deploy, ajoutez un travail validate :

    validate:
      runs-on: ubuntu-latest
      steps:
      - uses: actions/checkout@v3
      - uses: azure/login@v1
        name: Sign in to Azure
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      - uses: azure/arm-deploy@v1
        name: Run preflight validation
        with:
          deploymentName: ${{ github.run_number }}
          resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
          template: ./deploy/main.bicep
          parameters: environmentType=${{ env.ENVIRONMENT_TYPE }}
          deploymentMode: Validate
    

    Ce travail définit les étapes qui permettent l’extraction du code, la connexion à votre environnement Azure et l’utilisation de l’action azure/arm-deploy avec le mode de déploiement Validate.

    La définition de votre workflow comporte maintenant trois travaux. Ces travaux effectuent respectivement un linting de votre fichier Bicep, une validation préalable et le déploiement sur Azure.

  5. En dessous de la ligne runs-on du travail deploy, ajoutez une instruction needs :

    deploy:
      runs-on: ubuntu-latest
      needs: [lint, validate]
      steps:
      - uses: actions/checkout@v3
      - uses: azure/login@v1
        name: Sign in to Azure
    

    Les instructions needs indiquent que le travail « deploy » dépend des travaux « lint » et « validate », et qu’il s’exécute si l’exécution de ces deux travaux précédents a réussi.

    Notez également que les travaux validate et deploy se connectent à Azure, et que tous les travaux extraient le code du dépôt. Ces étapes sont nécessaires, car chaque travail utilise un nouvel exécuteur GitHub.

  6. 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. GitHub Actions ne traite pas les avertissements du linter comme des problèmes devant entraîner l’arrêt du workflow. 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 et collez 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.

Configurer le travail deploy pour qu’il fonctionne avec le linter

Quand vous utilisez une configuration de linter personnalisée, Bicep écrit des données de journal que GitHub Actions interprète comme une erreur. Pour désactiver ce comportement, vous configurez la tâche arm-deploy afin qu’elle ignore le flux des journaux d’erreurs standard (stderr).

  1. Ouvrez le fichier workflow.yml.

  2. Pour le travail deploy, à l’étape de test Deploy website (Déployer le site web), définissez la propriété failOnStdErr sur false :

    deploy:
      runs-on: ubuntu-latest
      needs: [lint, validate]
      steps:
      - uses: actions/checkout@v3
      - uses: azure/login@v1
        name: Sign in to Azure
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      - uses: azure/arm-deploy@v1
        name: Deploy website
        with:
          failOnStdErr: false
          deploymentName: ${{ github.run_number }}
          resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
          template: ./deploy/main.bicep
          parameters: environmentType=${{ env.ENVIRONMENT_TYPE }}
    
  3. Enregistrez le fichier .

Vérifier et commiter votre définition de workflow

  1. Vérifiez que votre fichier workflow.yml est similaire au code ci-dessous :

    name: deploy-toy-website-test
    concurrency: toy-company
    
    on:
      push:
        branches:
          - main
    
    permissions:
      id-token: write
      contents: read
    
    env:
      AZURE_RESOURCEGROUP_NAME: ToyWebsiteTest
      ENVIRONMENT_TYPE: Test
    
    jobs:
      lint:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - name: Run Bicep linter
          run: az bicep build --file deploy/main.bicep
    
      validate:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - uses: azure/login@v1
          name: Sign in to Azure
          with:
            client-id: ${{ secrets.AZURE_CLIENT_ID }}
            tenant-id: ${{ secrets.AZURE_TENANT_ID }}
            subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
        - uses: azure/arm-deploy@v1
          name: Run preflight validation
          with:
            deploymentName: ${{ github.run_number }}
            resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
            template: ./deploy/main.bicep
            parameters: environmentType=${{ env.ENVIRONMENT_TYPE }}
            deploymentMode: Validate
    
      deploy:
        runs-on: ubuntu-latest
        needs: [lint, validate]
        steps:
        - uses: actions/checkout@v3
        - uses: azure/login@v1
          name: Sign in to Azure
          with:
            client-id: ${{ secrets.AZURE_CLIENT_ID }}
            tenant-id: ${{ secrets.AZURE_TENANT_ID }}
            subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
        - uses: azure/arm-deploy@v1
          name: Deploy website
          with:
            failOnStdErr: false
            deploymentName: ${{ github.run_number }}
            resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
            template: ./deploy/main.bicep
            parameters: environmentType=${{ env.ENVIRONMENT_TYPE }}
    

    Si vos fichiers semblent différents, 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 jobs"
    git push
    
  3. Cette validation correspond à la première fois que vous poussez des données vers ce dépôt, donc vous pourriez être invité à vous connecter.

    Sur Windows, tapez 1 pour vous authentifier à l’aide d’un navigateur web, puis sélectionnez Entrée.

    Sur macOS, sélectionnez Autoriser.

  4. Une fenêtre de navigateur s’affiche. Vous devrez peut-être vous reconnecter à GitHub. Sélectionnez Autoriser.

    Immédiatement après le push, GitHub Actions démarre une nouvelle exécution du workflow.

Regarder l’exécution du workflow

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

    La première exécution de votre workflow, appelée commit initial, est signalée comme ayant échoué. GitHub a automatiquement exécuté le workflow quand vous avez créé le dépôt. L’exécution a échoué en raison des secrets qui n’étaient pas prêts à ce moment-là. Vous pouvez ignorer cet échec.

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

    Capture d’écran de GitHub Actions où le lien vers l’exécution la plus récente du workflow est mis en évidence.

    Notez que l’exécution du workflow montre maintenant les trois travaux que vous avez définis dans le fichier YAML. Les travaux lint et validate sont exécutés en parallèle avant le démarrage du travail deploy.

  3. Si le workflow est toujours en cours d’exécution, attendez qu’il soit terminé. Les workflows mettent automatiquement à jour la page avec l’état le plus récent, mais il est judicieux d’actualiser régulièrement cette page.

    Comme vous le voyez, les travaux lint et validate ont échoué.

    Capture d’écran d’une exécution du workflow dans GitHub Actions, avec les messages d’échec des travaux lint et validate.

  4. Sélectionnez le travail lint pour voir ses détails.

  5. Sélectionnez l’étape Run Bicep linter (Exécuter le linter Bicep) pour voir le journal du workflow.

    Capture d’écran du journal du workflow pour le travail lint, avec l’étape d’exécution d’un linter Bicep mise en évidence.

    L’erreur dans le journal de workflow inclut un message d’erreur linter :

    Error no-unused-params: Parameter "storageAccountNameParam" is declared but never used.
    

    Ce message d’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é. Dans Visual Studio Code, une ligne ondulée s’affiche sous le paramètre. 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, GitHub Actions déclenche automatiquement une nouvelle exécution de votre workflow.

Regarder une nouvelle exécution du workflow

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

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

    Attendez la fin de l’exécution du workflow. GitHub Actions 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 le travail lint s’est terminé correctement, mais que le travail validate a encore échoué.

    Capture d’écran de l’exécution du workflow, avec le message de réussite du travail lint et le message d’échec du travail validate.

  4. Sélectionnez le travail validate pour voir ses détails.

  5. Sélectionnez l’étape Run preflight validation (Exécuter la validation préalable) pour voir le journal du workflow.

    Capture d’écran du journal du workflow pour le travail validate, avec l’étape d’exécution d’une validation préalable mise en évidence.

    L’erreur affichée dans le journal de workflow contient le message suivant :

    mystorageresourceNameSuffix is not a valid storage account name. Storage account name must be between 3 and 24 characters in length and use numbers and lower-case letters only.
    

    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 corrigez 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 logAnalyticsWorkspaceName = 'workspace-${resourceNameSuffix}'
    var applicationInsightsName = 'toywebsite'
    var storageAccountName = 'mystorageresourceNameSuffix'
    

    Il semble y avoir une faute de frappe et l’interpolation de chaîne n’est pas 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
    

Regarder l’exécution réussie du workflow

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

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

    Attendez la fin de l’exécution du workflow. GitHub Actions 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 travaux du workflow se sont terminés avec succès :

    Capture d’écran d’une exécution du workflow dans GitHub Actions, qui montre les messages de réussite des trois travaux.

    Certains avertissements sont listés dans le panneau Annotations. Ces avertissements apparaissent à cause de la façon dont Bicep écrit des messages d’information dans le journal du workflow. Vous pouvez ignorer ces avertissements.

Vous avez maintenant un workflow 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.