Øvelse – Føj flere miljøer til din arbejdsproces

Fuldført

Nu er du klar til at opdatere din arbejdsproces, så den udrulles i både dine test- og produktionsmiljøer. I dette undermodul skal du opdatere din arbejdsproces til at bruge kaldte arbejdsprocesser, så du kan genbruge job på tværs af miljøer.

Under processen skal du:

  • Tilføj en arbejdsproces, der kan genbruges, for lintjobbet.
  • Tilføj en arbejdsproces, der kan genbruges, og som definerer de job, der kræves for at udrulle til et hvilket som helst miljø.
  • Opdater arbejdsprocessen for at bruge de kaldte arbejdsprocesser.
  • Kør din arbejdsproces, og få vist resultaterne.

Tilføj en arbejdsproces, der kan genbruges, for lintjobbet

Lint-jobbet udføres kun én gang under kørslen af arbejdsprocessen, uanset hvor mange miljøer arbejdsprocessen udruller til. Så du behøver ikke at bruge en kaldet arbejdsproces til lintjobbet. Men hvis du vil gøre din primære arbejdsprocesdefinitionsfil enkel og nem at læse, beslutter du dig for at definere lintjobbet i en separat arbejdsprocesfil.

  1. I Visual Studio Code skal du oprette en ny fil i mappen .github/arbejdsprocesser mappe med navnet lint.yml.

    Skærmbillede af Visual Studio Code Explorer med mapperne dot github og arbejdsprocesser og lint dot YML-filen.

  2. Indsæt følgende arbejdsprocesdefinition i filen:

    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
    

    Lintjobbet er det samme som det lintjob, der allerede findes i arbejdsprocessen, men nu er det i en separat arbejdsprocesfil.

  3. Gem ændringerne, og luk filen.

Tilføj en arbejdsproces, der kan genbruges, til installation

Opret en arbejdsproces, der kan genbruges, og som definerer alle de job, der kræves for at udrulle hvert af dine miljøer. Du skal bruge input og hemmeligheder til at angive de indstillinger, der kan variere mellem miljøer.

  1. Opret en ny fil i mappen .github/arbejdsprocesser mappe med navnet deploy.yml.

    Skærmbillede af Visual Studio Code Explorer med mapperne dot github og arbejdsprocesser og filen installér punktum YML.

    Denne fil repræsenterer alle de installationsaktiviteter, der kører for hvert af dine miljøer.

  2. Indsæt følgende arbejdsprocesnavn, udløser, input og hemmeligheder i filen:

    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
    

    Seddel

    Når du begynder at arbejde med din YAML-fil i Visual Studio Code, kan du se nogle røde bølgestreger, der fortæller dig, at der er et problem. Det skyldes, at Visual Studio Code-filtypenavnet for YAML-filer nogle gange gætter filens skema forkert.

    Du kan ignorere de problemer, som udvidelsen rapporterer. Eller hvis du foretrækker det, kan du tilføje følgende kode øverst i filen for at undertrykke udvidelsens gæt:

    # yaml-language-server: $schema=./deploy.yml
    
  3. Under hemmelighederne skal du indsætte definitionen af valideringsjobbet:

    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
    

    Bemærk, at der anvendes en betingelse på jobbene. Forhåndskontrollen kører kun for ikke-produktionsmiljøer. What if-handlingen kører kun for produktionsmiljøet. I det forrige modul i læringsforløbet brugte du separate job til disse handlinger, men her kombinerer du dem for at forenkle arbejdsprocessen.

    Drikkepenge

    YAML-filer er følsomme for indrykning. Uanset om du skriver eller indsætter denne kode, skal du sørge for, at indrykningen er korrekt. Senere i denne øvelse får du vist den komplette YAML-arbejdsprocesdefinition, så du kan kontrollere, at filen stemmer overens.

  4. Indsæt definitionen af installationsjobbet under valideringsjobbet:

    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. Under udrulningsjobbet skal du indsætte definitionen af røgtestjobbet:

    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. Kontrollér, at din deploy.yml-fil nu ser ud som i følgende eksempel:

    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. Gem ændringerne i filen.

Opdater arbejdsprocesdefinitionen for at bruge skabelonerne

  1. Åbn workflow.yml-filen i mappen .github/arbejdsprocesser.

  2. Fjern indholdet af afsnittet env:, herunder de to miljøvariabler. Du skal snart erstatte disse med miljøspecifikke variabler.

  3. Fjern indholdet af lint: jobdefinitionen, og erstat den med følgende kode for at bruge den lint.yml fil, du oprettede tidligere:

    # Lint the Bicep file.
    lint:
      uses: ./.github/workflows/lint.yml
    
  4. Slet alt i filen under det lintjob, du har opdateret.

  5. Nederst i filen skal du tilføje følgende kode for at installere den i testmiljøet:

    # 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. Under den kode, du lige har tilføjet, skal du tilføje følgende kode for at udrulle den i produktionsmiljøet:

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

    Den opdaterede arbejdsproces kører lintjobbet én gang. Derefter bruges deploy.yml kaldet arbejdsproces to gange: én gang pr. miljø. Dette holder definitionen af arbejdsprocessen klar og let at forstå. Kommentarerne i YAML-filen identificerer hvert jobs destinationsmiljø.

  7. Kontrollér, at din workflow.yml-fil ser ud som i følgende eksempel:

    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. Gem dine ændringer.

  9. Bekræft og send dine ændringer til Git-lageret ved at køre følgende kommandoer i Visual Studio Code-terminalen:

    git add .
    git commit -m "Add reusable workflows"
    git push
    
  10. Da det er første gang, du pusher til lageret, bliver du muligvis bedt om at logge på.

    Skriv 1 i Windows for at godkende vha. en webbrowser, og vælg Angiv.

    På macOS skal du vælge Godkend.

  11. Der vises et browservindue. Du skal muligvis logge på GitHub igen. Vælg Godkend.

Få vist kørslen af arbejdsprocessen

  1. Gå til Handlingeri browseren.

    Den første kørsel af arbejdsprocessen, der er mærket Initial commit, vises som en fejl. GitHub kørte automatisk arbejdsprocessen, da du oprettede lageret. Det mislykkedes, fordi hemmelighederne ikke var klar på det tidspunkt. Du kan ignorere denne fejl.

  2. Vælg installér-toy-website-environments arbejdsproces.

  3. Vælg den seneste kørsel af arbejdsprocessen.

    Bemærk, at arbejdsprocessen nu viser alle de job, du har defineret i YAML-filerne.

    Nogle advarsler vises i panelet Anmærkninger. Alle disse advarsler skyldes den måde, Bicep skriver oplysningsmeddelelser på i arbejdsprocesloggen. Du kan ignorere disse advarsler.

  4. Vent på, at arbejdsprocessen afbrydes midlertidigt, før udruller/udruller job. Det kan tage et par minutter, før arbejdsprocessen når dette punkt.

    Skærmbillede af GitHub, der viser, at kørslen af arbejdsprocessen er midlertidigt afbrudt til godkendelse.

  5. Godkend udrulningen i produktionsmiljøet ved at vælge knappen Gennemse udrulninger.

  6. Vælg miljøet Produktion, og vælg derefter knappen Godkend og udrul.

    Skærmbillede af GitHub-grænsefladen, der viser siden til godkendelse af arbejdsprocessen og knappen Godkend og udrul.

    Vent, indtil arbejdsprocessen er færdig med at køre. Arbejdsprocessen er fuldført.

  7. Vælg Kode.

  8. Vælg udrulningen af Production.

    Skærmbillede af GitHub, der viser kodesidemiljøet, hvor produktionsmiljøet er fremhævet.

  9. Bemærk, at du på installationsskærmen får vist en oversigt over produktionsmiljøets installationshistorik.

    Skærmbillede af GitHub, der viser produktionsmiljøet, hvor udrulningshistorikken viser en enkelt udrulning.

  10. Vælg bekræftelses-id'et.

    Bemærk, at GitHub viser dig listen over bekræftelser, der er inkluderet i installationen. Dette hjælper dig med at se ændringerne i dit miljø over tid.

    Skærmbillede af GitHub, der viser oplysninger om udrulningen af produktionsmiljøet med en liste over bekræftelser.

  11. I din browser skal du gå til Azure Portal.

  12. Gå til ressourcegruppen ToyWebsiteProduction.

  13. Åbn Azure App Service-appen på listen over ressourcer.

    Skærmbillede af Azure Portal, der viser produktionsappen til App Services-webstedet og SKU-detaljerne for App Service-planen.

    Bemærk, at typen af App Service-abonnement er S1.

  14. Gå til App Service-appen i ressourcegruppen ToyWebsiteTest.

    Bemærk, at typen af App Service-abonnement er F1. De to miljøer bruger forskellige indstillinger, som du har defineret i din Bicep-fil.