Oefening: meerdere omgevingen toevoegen aan uw werkstroom

Voltooid

U bent nu klaar om uw werkstroom bij te werken om te implementeren in zowel uw test- als productieomgevingen. In deze eenheid werkt u uw werkstroom bij om gebruik te maken van aangeroepen werkstromen, zodat u de taken in de omgevingen kunt hergebruiken.

Tijdens het proces gaat u het volgende doen:

  • Voeg een herbruikbare workflow toe voor de lint-job.
  • Voeg een herbruikbare werkstroom toe waarmee de taken worden gedefinieerd die nodig zijn om te implementeren in elke omgeving.
  • Werk uw werkstroom bij om de aangeroepen werkstromen te benutten.
  • Voer uw werkstroom uit en bekijk de resultaten.

Een herbruikbare werkstroom toevoegen voor de linttaak

De linttaak vindt slechts eenmaal plaats tijdens de uitvoering van de workflow, ongeacht het aantal omgevingen waarin de workflow wordt ingezet. Je hoeft dus niet echt een aangeroepen workflow te gebruiken voor de linttaak. Maar om uw hoofdwerkstroomdefinitiebestand eenvoudig en gemakkelijk leesbaar te houden, besluit u om de linttaak in een afzonderlijk werkstroombestand te definiëren.

  1. Maak in Visual Studio Code een nieuw bestand in de map .github/workflows map met de naam lint.yml.

    Schermopname van Visual Studio Code Explorer, met de mappen dot github en werkstromen en het lint dot YML-bestand.

  2. Plak de volgende werkstroomdefinitie in het bestand:

    name: lint
    
    on:
      workflow_call:
    
    jobs:
      lint:
        name: Lint code
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
    
        - name: Lint code
          run: |
            az bicep build --file deploy/main.bicep
    

    De linttaak is hetzelfde als de linttaak die zich al in de werkstroom bevindt, maar nu in een afzonderlijk werkstroombestand.

  3. Sla uw wijzigingen op en sluit het bestand.

Een herbruikbare werkstroom toevoegen voor implementatie

Maak een herbruikbare werkstroom waarmee alle taken worden gedefinieerd die nodig zijn om elk van uw omgevingen te implementeren. U gebruikt invoer en geheimen om de instellingen op te geven die mogelijk verschillen tussen omgevingen.

  1. Maak een nieuw bestand in de map .github/workflows met de naam deploy.yml.

    nl-NL: Schermopname van Visual Studio Code Explorer, met de mappen .github en werkstromen en het bestand 'deploy.yml'.

    Dit bestand vertegenwoordigt alle implementatieactiviteiten die worden uitgevoerd voor elk van uw omgevingen.

  2. Plak de volgende werkstroomnaam, trigger, invoer en geheimen in het bestand:

    name: deploy
    
    on:
      workflow_call:
        inputs:
          environmentType:
            required: true
            type: string
          resourceGroupName:
            required: true
            type: string
        secrets:
          AZURE_CLIENT_ID:
            required: true
          AZURE_TENANT_ID:
            required: true
          AZURE_SUBSCRIPTION_ID:
            required: true
    

    Notitie

    Wanneer u aan de slag gaat met uw YAML-bestand in Visual Studio Code, ziet u mogelijk enkele rode golvende lijnen die u vertellen dat er een probleem is. Dit komt doordat de Visual Studio Code-extensie voor YAML-bestanden soms ten onrechte het schema van het bestand raadt.

    U kunt de problemen negeren die door de extensie worden gerapporteerd. Of als u dat wilt, kunt u de volgende code aan het begin van het bestand toevoegen om te voorkomen dat de extensie gissingen maakt.

    # yaml-language-server: $schema=./deploy.yml
    
  3. Plak onder de geheimen de definitie van de validatietaak:

    jobs:
      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 }}
         - if: inputs.environmentType != 'Production'
           uses: azure/arm-deploy@v1
           name: Run preflight validation
           with:
             deploymentName: ${{ github.run_number }}
             resourceGroupName: ${{ inputs.resourceGroupName }}
             template: ./deploy/main.bicep
             parameters: >
               environmentType=${{ inputs.environmentType }}
             deploymentMode: Validate
         - if: inputs.environmentType == 'Production'
           uses: azure/arm-deploy@v1
           name: Run what-if
           with:
             failOnStdErr: false
             resourceGroupName: ${{ inputs.resourceGroupName }}
             template: ./deploy/main.bicep
             parameters: >
               environmentType=${{ inputs.environmentType }}
             additionalArguments: --what-if
    

    U ziet dat een voorwaarde wordt toegepast op de taken. De preflight-validatie wordt alleen uitgevoerd voor niet-productieomgevingen. De wat-als-bewerking wordt alleen voor de productieomgeving uitgevoerd. In de vorige module in het leertraject hebt u afzonderlijke taken voor deze bewerkingen gebruikt, maar hier combineert u deze om de werkstroom te vereenvoudigen.

    Tip

    YAML-bestanden zijn gevoelig voor inspringing. Controleer of de inspringing juist is, ongeacht of u deze code typt of plakt. Verderop in deze oefening ziet u de volledige YAML-werkstroomdefinitie, zodat u kunt controleren of het bestand overeenkomt.

  4. Plak onder de validatietaak de definitie van de implementatietaak:

    deploy:
      needs: validate
      environment: ${{ inputs.environmentType }}
      runs-on: ubuntu-latest
      outputs:
        appServiceAppHostName: ${{ steps.deploy.outputs.appServiceAppHostName }}
      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
        id: deploy
        name: Deploy Bicep file
        with:
          failOnStdErr: false
          deploymentName: ${{ github.run_number }}
          resourceGroupName: ${{ inputs.resourceGroupName }}
          template: ./deploy/main.bicep
          parameters: >
            environmentType=${{ inputs.environmentType }}
    
  5. Plak onder de implementatietaak de definitie van de smoketesttaak.

    smoke-test:
      runs-on: ubuntu-latest
      needs: deploy
      steps:
      - uses: actions/checkout@v3
      - run: |
          $container = New-PesterContainer `
            -Path 'deploy/Website.Tests.ps1' `
            -Data @{ HostName = '${{needs.deploy.outputs.appServiceAppHostName}}' }
          Invoke-Pester `
            -Container $container `
            -CI
        name: Run smoke tests
        shell: pwsh
    
  6. Controleer of uw deploy.yml bestand er nu uitziet zoals in het volgende voorbeeld:

    name: deploy
    
    on:
      workflow_call:
        inputs:
          environmentType:
            required: true
            type: string
          resourceGroupName:
            required: true
            type: string
        secrets:
          AZURE_CLIENT_ID:
            required: true
          AZURE_TENANT_ID:
            required: true
          AZURE_SUBSCRIPTION_ID:
            required: true
    
    jobs:
      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 }}
         - if: inputs.environmentType != 'Production'
           uses: azure/arm-deploy@v1
           name: Run preflight validation
           with:
             deploymentName: ${{ github.run_number }}
             resourceGroupName: ${{ inputs.resourceGroupName }}
             template: ./deploy/main.bicep
             parameters: >
               environmentType=${{ inputs.environmentType }}
             deploymentMode: Validate
         - if: inputs.environmentType == 'Production'
           uses: azure/arm-deploy@v1
           name: Run what-if
           with:
             failOnStdErr: false
             resourceGroupName: ${{ inputs.resourceGroupName }}
             template: ./deploy/main.bicep
             parameters: >
               environmentType=${{ inputs.environmentType }}
             additionalArguments: --what-if
    
      deploy:
        needs: validate
        environment: ${{ inputs.environmentType }}
        runs-on: ubuntu-latest
        outputs:
          appServiceAppHostName: ${{ steps.deploy.outputs.appServiceAppHostName }}
        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
          id: deploy
          name: Deploy Bicep file
          with:
            failOnStdErr: false
            deploymentName: ${{ github.run_number }}
            resourceGroupName: ${{ inputs.resourceGroupName }}
            template: ./deploy/main.bicep
            parameters: >
              environmentType=${{ inputs.environmentType }}
    
      smoke-test:
        runs-on: ubuntu-latest
        needs: deploy
        steps:
        - uses: actions/checkout@v3
        - run: |
            $container = New-PesterContainer `
              -Path 'deploy/Website.Tests.ps1' `
              -Data @{ HostName = '${{needs.deploy.outputs.appServiceAppHostName}}' }
            Invoke-Pester `
              -Container $container `
              -CI
          name: Run smoke tests
          shell: pwsh
    
  7. Sla de wijzigingen in het bestand op.

De werkstroomdefinitie bijwerken om de sjablonen te gebruiken

  1. Open het bestand workflow.yml in de map .github/workflows.

  2. Verwijder de inhoud van de sectie env:, inclusief de twee omgevingsvariabelen. U vervangt deze binnenkort door omgevingsspecifieke variabelen.

  3. Verwijder de inhoud van de lint: taakdefinitie en vervang deze door de volgende code om het lint.yml bestand te gebruiken dat u eerder hebt gemaakt:

    # Lint the Bicep file.
    lint:
      uses: ./.github/workflows/lint.yml
    
  4. Verwijder alles in het bestand onder de linttaak die u hebt bijgewerkt.

  5. Voeg onder aan het bestand de volgende code toe om te implementeren in de testomgeving:

    # Deploy to the test environment.
    deploy-test:
      uses: ./.github/workflows/deploy.yml
      needs: lint
      with:
        environmentType: Test
        resourceGroupName: ToyWebsiteTest
      secrets:
        AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID_TEST }}
        AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
        AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    
  6. Voeg onder de code die u zojuist hebt toegevoegd de volgende code toe om te implementeren in de productieomgeving:

    # Deploy to the production environment.
    deploy-production:
      uses: ./.github/workflows/deploy.yml
      needs: deploy-test
      with:
        environmentType: Production
        resourceGroupName: ToyWebsiteProduction
      secrets:
        AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID_PRODUCTION }}
        AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
        AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    

    De bijgewerkte werkstroom voert de linttaak eenmaal uit. Daarna gebruikt het de workflow genaamd deploy.yml twee keer: één keer per omgeving. Hierdoor blijft de werkstroomdefinitie duidelijk en gemakkelijk te begrijpen. De opmerkingen in het YAML-bestand identificeren de doelomgeving van elke taak.

  7. Controleer of uw workflow.yml bestand eruitziet zoals in het volgende voorbeeld:

    name: deploy-toy-website-environments
    concurrency: toy-company
    
    on:
      push:
        branches:
          - main
      workflow_dispatch:
    
    permissions:
      id-token: write
      contents: read
    
    jobs:
    
      # Lint the Bicep file.
      lint:
        uses: ./.github/workflows/lint.yml
    
      # Deploy to the test environment.
      deploy-test:
        uses: ./.github/workflows/deploy.yml
        needs: lint
        with:
          environmentType: Test
          resourceGroupName: ToyWebsiteTest
        secrets:
          AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID_TEST }}
          AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
          AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    
      # Deploy to the production environment.
      deploy-production:
        uses: ./.github/workflows/deploy.yml
        needs: deploy-test
        with:
          environmentType: Production
          resourceGroupName: ToyWebsiteProduction
        secrets:
          AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID_PRODUCTION }}
          AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
          AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    
  8. Sla uw wijzigingen op.

  9. Voer uw wijzigingen door en push deze naar uw Git-opslagplaats door de volgende opdrachten uit te voeren in de Visual Studio Code-terminal:

    git add .
    git commit -m "Add reusable workflows"
    git push
    
  10. Omdat dit de eerste keer is dat u naar de opslagplaats pusht, wordt u mogelijk gevraagd u aan te melden.

    Typ in Windows 1 om te verifiëren met een webbrowser en selecteer Enter.

    Selecteer in macOS Autoriseren.

  11. Er wordt een browservenster weergegeven. Mogelijk moet u zich opnieuw aanmelden bij GitHub. Selecteer Autoriseren.

De uitvoering van de workflow weergeven

  1. Ga in uw browser naar Acties.

    De eerste uitvoering van uw werkstroom, met het label initiële commit, wordt als een mislukking weergegeven. GitHub heeft de workflow automatisch uitgevoerd toen u de repository maakte. Het is mislukt omdat de geheimen op dat moment niet gereed waren. U kunt deze fout negeren.

  2. Selecteer de implementatie-toy-website-omgevingen werkstroom.

  3. Kies de meest recente uitvoering van uw workflow.

    U ziet dat in de werkstroom nu alle taken worden weergegeven die u hebt gedefinieerd in de YAML-bestanden.

    Sommige waarschuwingen worden weergegeven in het deelvenster Aantekeningen. Al deze waarschuwingen zijn te maken met de manier waarop Bicep informatieve berichten naar het werkstroomlogboek schrijft. U kunt deze waarschuwingen negeren.

  4. Wacht tot de werkstroom pauzeert voor de implementatie-productie/deploy taak. Het kan enkele minuten duren voordat de werkstroom dit punt bereikt.

    Schermopname van GitHub waarin de werkstroomuitvoering is onderbroken voor goedkeuring.

  5. Keur de implementatie goed in de productieomgeving door de knop Implementaties controleren te selecteren.

  6. Selecteer de Production-omgeving en selecteer vervolgens de knop Goedkeuren en implementeren.

    Schermopname van de GitHub-interface waarop de goedkeuringspagina van de werkstroom en de knop Goedkeuren en implementeren worden weergegeven.

    Wacht tot de werkstroom klaar is met uitvoeren. De werkstroom is succesvol voltooid.

  7. Selecteer Code.

  8. Selecteer de productie--implementatie.

    Schermopname van GitHub waarin de codepaginaomgeving wordt weergegeven, met de productieomgeving gemarkeerd.

  9. U ziet in het implementatiescherm een overzicht van de implementatiegeschiedenis van de productieomgeving.

    Schermopname van GitHub waarin de productieomgeving wordt weergegeven, met de implementatiegeschiedenis met één implementatie.

  10. Selecteer de doorvoer-id.

    Op GitHub ziet u de lijst met commits die zijn opgenomen in de implementatie. Dit helpt u om de wijzigingen in uw omgeving in de loop van de tijd te zien.

    Schermopname van GitHub met de implementatiedetails van de productieomgeving, met een lijst met commits.

  11. Ga in uw browser naar de Azure Portal.

  12. Ga naar de ToyWebsiteProduction resourcegroep.

  13. Open de Azure App Service-app in de lijst met resources.

    Schermopname van Azure Portal waarin de productie-app van de App Services-speelgoedwebsite en de SKU-details van het App Service-plan worden weergegeven.

    U ziet dat het type App Service-plan is S1.

  14. Ga naar de App Service-app in de resourcegroep ToyWebsiteTest.

    Merk op dat het type App Service-plan F1is. De twee omgevingen gebruiken verschillende instellingen, zoals u hebt gedefinieerd in uw Bicep-bestand.