Übung: Hinzufügen von Linting- und Überprüfungsaufträgen zu Ihrem Workflow

Abgeschlossen

Sie haben mit Ihrem Team gesprochen und entschieden, dass Sie Ihre Bereitstellungen mithilfe eines Workflows weiter automatisieren werden. Sie möchten mehr Vertrauen in die Bereitstellung schaffen.

In dieser Übung fügen Sie Ihrem Workflow Überprüfungsaufträge hinzu. Anschließend führen Sie das Linting und die Preflightvalidierung vor jeder Bereitstellung aus.

Während des Vorgangs führen Sie die folgenden Aufgaben aus:

  • Sie aktualisieren Ihren vorhandenen Workflow, um Ihrem Bicep-Code zwei neue Aufträge für das Linting und die Überprüfung hinzuzufügen.
  • Ausführen Ihres Workflows
  • Sie beheben alle Probleme, die Ihr Workflow erkennt.

Hinzufügen von Linting- und Überprüfungsaufträgen zu Ihrem Workflow

  1. Öffnen Sie in Visual Studio Code die Datei workflow.yml im Ordner .github/workflows.

  2. Ändern Sie im Abschnitt env: den Wert der Variable AZURE_RESOURCEGROUP_NAME in ToyWebsiteTest:

    env:
      AZURE_RESOURCEGROUP_NAME: ToyWebsiteTest
      ENVIRONMENT_TYPE: Test
    
  3. Fügen Sie unterhalb der Zeile jobs: und über dem Auftrag deploy einen neuen Lintingauftrag hinzu:

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

    Dieser Auftrag definiert einen Schritt zum Auschecken des Codes und einen Schritt, in dem der Befehl az bicep build zum Linten der Bicep-Datei ausgeführt wird.

    Tipp

    YAML-Dateien berücksichtigen Einzüge. Unabhängig davon, ob Sie diesen Code eingeben oder einfügen, stellen Sie sicher, dass der Einzug korrekt ist. Später in dieser Übung sehen Sie die vollständige YAML-Workflowdefinition, sodass Sie überprüfen können, ob Ihre Datei übereinstimmt.

  4. Fügen Sie unterhalb der soeben hinzugefügten Zeilen und oberhalb des Bereitstellungsauftrags einen Überprüfungsauftrag hinzu:

    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
    

    Dieser Auftrag definiert Schritte zum Auschecken des Codes, zum Anmelden bei Ihrer Azure-Umgebung und zum Verwenden der Aktion azure/arm-deploy im Bereitstellungsmodus Validate.

    Ihre Workflowdefinition verfügt jetzt über drei Aufträge. Der erste führt ein Linting Ihrer Bicep-Datei durch, der zweite eine Preflightvalidierung und der dritte die Bereitstellung in Azure.

  5. Fügen Sie unterhalb der Zeile runs-on und über dem Auftrag deploy eine needs-Anweisung hinzu:

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

    Die needs-Anweisung gibt an, dass die Ausführung des Bereitstellungsauftrags davon abhängt, ob die Linting- und Überprüfungsaufträge erfolgreich abgeschlossen wurden.

    Beachten Sie auch, dass sich sowohl die Überprüfungs- als auch die Bereitstellungsaufträge bei Azure anmelden und alle Aufträge den Code aus dem Repository auschecken. Diese Schritte sind erforderlich, da jeder Auftrag einen neuen GitHub-Runner verwendet.

  6. Speichern Sie die Datei .

Konfigurieren des Linters

Standardmäßig gibt der Bicep-Linter eine Warnung aus, wenn ein Problem mit Ihrer Datei erkannt wird. GitHub Actions behandelt Linterwarnungen nicht als Probleme, die Ihren Workflow beenden sollten. Erstellen Sie eine Datei bicepconfig.json, die den Linter neu konfiguriert, um dieses Verhalten anzupassen.

  1. Fügen Sie im Ordner deploy eine neue Datei hinzu, und nennen Sie sie bicepconfig.json.

    Screenshot: Visual Studio Code-Explorer mit neuer Datei im Ordner „deploy“

  2. Kopieren Sie den folgenden Code, und fügen Sie ihn in die Datei ein:

    {
      "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. Speichern Sie die Datei .

Konfigurieren des Bereitstellungsauftrags für die Verwendung des Linters

Wenn Sie eine benutzerdefinierte Linterkonfiguration verwenden, schreibt Bicep Protokolldaten, die GitHub Actions als Fehler interpretiert. Um dieses Verhalten zu deaktivieren, konfigurieren Sie den Task arm-deploy so, dass der Protokollstream für Standardfehler (stderr) ignoriert wird.

  1. Öffnen Sie die Datei workflow.yml.

  2. Legen Sie im Testschritt Deploy website (Website bereitstellen) des Auftrags deploy die failOnStdErr-Eigenschaft auf false fest:

    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. Speichern Sie die Datei .

Überprüfen und Committen Ihrer Workflowdefinition

  1. Überprüfen Sie, ob die Datei workflow.yml wie im folgenden Code aussieht:

    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 }}
    

    Wenn Ihre Datei anders aussieht, aktualisieren Sie sie entsprechend diesem Beispiel und speichern Sie sie.

  2. Committen und pushen Sie Ihre Änderungen in Ihr Git-Repository, indem Sie die folgenden Befehle im Visual Studio Code-Terminal ausführen:

    git add .
    git commit -m "Add lint and validation jobs"
    git push
    
  3. Dieser Commit ist der erste Push in dieses Repository, daher werden Sie möglicherweise zur Anmeldung aufgefordert.

    Geben Sie unter Windows 1 ein, um sich über einen Webbrowser zu authentifizieren, und drücken Sie die EINGABETASTE.

    Wählen Sie unter macOS Authorize (Autorisieren) aus.

  4. Ein Browserfenster wird geöffnet. Möglicherweise müssen Sie sich erneut bei GitHub anmelden. Wählen Sie Autorisieren.

    Unmittelbar nach dem Pushen startet GitHub Actions eine neue Workflowausführung.

Anzeigen der Workflowausführung

  1. Navigieren Sie in Ihrem Browser zu Actions.

    Für die erste Ausführung Ihres Workflows mit der Bezeichnung Initial commit (Erster Commit) wird ein Fehler angezeigt. GitHub hat den Workflow automatisch ausgeführt, als Sie das Repository erstellt haben. Der Fehler ist aufgetreten, da die Geheimnisse zu diesem Zeitpunkt nicht verfügbar waren. Diesen Fehler können Sie ignorieren.

  2. Wählen Sie die letzte Ausführung Ihres Workflows aus.

    Screenshot von GitHub Actions mit hervorgehobenem Link zur letzten Workflowausführung

    Beachten Sie, dass die Workflowausführung nun die drei Aufträge enthält, die Sie in der YAML-Datei definiert haben. Die Aufträge lint und validate werden parallel vor dem Start des Auftrags deploy ausgeführt.

  3. Wenn der Workflow noch ausgeführt wird, warten Sie, bis er abgeschlossen ist. Obwohl Workflows die Seite automatisch mit dem aktuellen Status aktualisieren, sollten Sie die Seite gelegentlich selbst aktualisieren.

    Wie Sie sehen, sind bei den Aufträgen lint und validate Fehler aufgetreten.

    Screenshot einer Workflowsausführung in GitHub Actions mit Fehlern bei den Linting- und Überprüfungsaufträgen

  4. Wählen Sie den Auftrag lint aus, um die zugehörigen Details anzuzeigen.

  5. Wählen Sie den Schritt Run Bicep linter (Bicep-Linter ausführen) aus, um das Workflowprotokoll anzuzeigen.

    Screenshot des Workflowprotokolls für den Lintingauftrag mit hervorgehobenem Schritt für die Ausführung eines Bicep-Linters

    Der Fehler im Workflowprotokoll enthält eine Linterfehlermeldung:

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

    Diese Fehlermeldung weist darauf hin, dass der Linter einen Regelverstoß in Ihrer Bicep-Datei gefunden hat.

Beheben des Linter-Fehlers

Nachdem Sie das Problem erkannt haben, können Sie es in Ihrer Bicep-Datei beheben.

  1. Öffnen Sie in Visual Studio Code die Datei main.bicep im Ordner Bereitstellen.

  2. Beachten Sie, dass der Bicep-Linter auch erkannt hat, dass der storageAccountNameParam-Parameter nicht verwendet wird. In Visual Studio Code wird unter dem Parameter eine Wellenlinie angezeigt. Normalerweise wäre die Linie für Warnungen gelb. Da Sie die Datei bicepconfig.json jedoch konfiguriert haben, behandelt der Linter den Code als Fehler und erzeugt eine rote Linie.

    param storageAccountNameParam string = uniqueString(resourceGroup().id)
    
  3. Löschen Sie den storageAccountNameParam-Parameter.

  4. Speichern Sie die Datei .

  5. Committen und pushen Sie Ihre Änderungen in Ihr Git-Repository, indem Sie die folgenden Befehle im Visual Studio Code-Terminal ausführen:

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

    Auch hier löst GitHub Actions automatisch eine neue Ausführung Ihres Workflows aus.

Erneutes Anzeigen der Workflowausführung

  1. Navigieren Sie in Ihrem Browser zu Ihrem Workflow.

  2. Wählen Sie die letzte Ausführung aus.

    Warten Sie, bis die Workflowausführung abgeschlossen ist. Obwohl GitHub Actions die Seite automatisch mit dem aktuellen Status aktualisiert, sollten Sie die Seite gelegentlich aktualisieren.

  3. Der Auftrag lint wurde erfolgreich abgeschlossen, doch jetzt ist bei beim Auftrag validate ein Fehler aufgetreten.

    Screenshot der Workflowausführung mit erfolgreichem Lintingauftrag und einem Fehler beim Überprüfungsauftrag

  4. Wählen Sie den Auftrag validate aus, um die zugehörigen Details anzuzeigen.

  5. Wählen Sie den Schritt Run preflight validation (Preflightvalidierung ausführen) aus, um das Workflowprotokoll anzuzeigen.

    Screenshot des Workflowprotokolls für den Überprüfungsauftrag mit hervorgehobenem Schritt für die Ausführung der Preflightvalidierung

    Der im Workflowprotokoll angezeigte Fehler enthält die folgende Meldung:

    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.
    

    Dieser Fehler gibt an, dass der Name des Speicherkontos ungültig ist.

Beheben des Überprüfungsfehlers

Sie haben ein weiteres Problem in der Bicep-Datei gefunden. Hier beheben Sie das Problem.

  1. Öffnen Sie in Visual Studio Code die Datei main.bicep im Ordner deploy.

  2. Sehen Sie sich die Definition der storageAccountName-Variablen an:

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

    Es scheint einen Tippfehler zu geben, und die Zeichenfolgeninterpolation wurde nicht ordnungsgemäß konfiguriert.

  3. Aktualisieren Sie die storageAccountName-Variable, um die Zeichenfolgeninterpolation ordnungsgemäß zu verwenden:

    var storageAccountName = 'mystorage${resourceNameSuffix}'
    
  4. Speichern Sie die Datei .

  5. Committen und pushen Sie Ihre Änderungen in Ihr Git-Repository, indem Sie die folgenden Befehle im Visual Studio Code-Terminal ausführen:

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

Anzeigen der erfolgreichen Workflowausführung

  1. Navigieren Sie in Ihrem Browser zu Ihrem Workflow.

  2. Wählen Sie die letzte Ausführung aus.

    Warten Sie, bis die Workflowausführung abgeschlossen ist. Obwohl GitHub Actions die Seite automatisch mit dem aktuellen Status aktualisiert, sollten Sie die Seite gelegentlich aktualisieren.

  3. Beachten Sie, dass alle drei Aufträge im Workflow erfolgreich abgeschlossen wurden:

    Screenshot der Workflowausführung in GitHub Actions, bei der alle drei Aufträge erfolgreich ausgeführt wurden

    Im Bereich Annotations (Anmerkungen) werden einige Warnungen aufgeführt. Diese Warnungen sind darauf zurückzuführen, wie Bicep Informationsmeldungen in das Workflowprotokoll schreibt. Sie können diese Warnungen ignorieren.

Sie verfügen nun über einen Workflow, der Fehler in Ihrem Bicep-Code frühzeitig im Bereitstellungsprozess erkennt und die Bereitstellung in Azure ausführt, wenn keine Fehler auftreten.