Gyakorlat – Tesztfeladat hozzáadása a munkafolyamathoz

Befejeződött

A toy cég biztonsági csapata azt szeretné, hogy ellenőrizze, hogy webhelye csak HTTPS-kapcsolaton keresztül érhető-e el. Ebben a gyakorlatban úgy konfigurálja a munkafolyamatot, hogy futtasson egy füsttesztet, amely ellenőrzi a biztonsági csapat követelményeit.

A folyamat során a következő feladatokat fogja elvégezni:

  • Adjon hozzá egy tesztszkriptet az adattárhoz.
  • Frissítse a munkafolyamat-definíciót tesztfeladat hozzáadásához.
  • Futtassa a munkafolyamatot, és figyelje meg, hogy a teszt sikertelen.
  • Javítsa ki a Bicep-fájlt, és figyelje meg, hogy a munkafolyamat sikeresen fut.

Tesztszkript hozzáadása

Itt egy tesztszkriptet ad hozzá annak ellenőrzéséhez, hogy a webhely elérhető-e HTTPS használata esetén, és nem érhető el a nem biztonságos HTTP protokoll használatakor.

  1. A Visual Studio Code-ban hozzon létre egy új fájlt a Website.Tests.ps1 nevű üzembehelyezési mappában.

    Képernyőkép a Visual Studio Code Explorerről az üzembe helyezési mappával és a tesztfájllal.

  2. Másolja és illessze be a következő tesztkódot a fájlba:

    param(
      [Parameter(Mandatory)]
      [ValidateNotNullOrEmpty()]
      [string] $HostName
    )
    
    Describe 'Toy Website' {
    
        It 'Serves pages over HTTPS' {
          $request = [System.Net.WebRequest]::Create("https://$HostName/")
          $request.AllowAutoRedirect = $false
          $request.GetResponse().StatusCode |
            Should -Be 200 -Because "the website requires HTTPS"
        }
    
        It 'Does not serves pages over HTTP' {
          $request = [System.Net.WebRequest]::Create("http://$HostName/")
          $request.AllowAutoRedirect = $false
          $request.GetResponse().StatusCode | 
            Should -BeGreaterOrEqual 300 -Because "HTTP is not secure"
        }
    
    }
    

    Az eredmény egy Pester tesztfájl. Ehhez egy .$HostName Két tesztet futtat a gazdagépnéven:

    • HTTPS-en keresztül próbál csatlakozni a webhelyhez. A teszt akkor megy át, ha a kiszolgáló egy 200 és 299 közötti HTTP-válasz állapotkóddal válaszol, amely sikeres kapcsolatot jelez.
    • HTTP-en keresztül próbál csatlakozni a webhelyhez. A teszt akkor megy át, ha a kiszolgáló 300-ás vagy újabb HTTP-válaszállapot-kóddal válaszol.

    Ennek a gyakorlatnak a alkalmazásában nem fontos, hogy megértse a tesztfájl részleteit és működését. Az összefoglalásban hivatkozásokat biztosítunk, hogy többet tudjon meg, ha érdekli.

A Bicep-fájl kimenetének közzététele feladatkimenetként

Az előző lépésekben létrehozott tesztszkript teszteléséhez egy gazdagépnév szükséges. A Bicep-fájl már tartalmaz egy kimenetet, de mielőtt használni szeretné a füsttesztekben, közzé kell tennie feladatkimenetként.

  1. A Visual Studio Code-ban nyissa meg a workflow.yml fájlt a .github/workflows mappában.

  2. Az üzembe helyezési feladatban adjon hozzá egy id elemet a Deploy website lépéshez, hogy hivatkozzon a lépésre. Adjon hozzá egy feladatkimenetet is, amely az üzembe helyezési lépésből másolja a appServiceAppHostName kimenetet:

    deploy:
      runs-on: ubuntu-latest
      environment: Website
      needs: preview
      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 website
        with:
          failOnStdErr: false
          deploymentName: ${{ github.run_number }}
          resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
          template: ./deploy/main.bicep
          parameters: environmentType=${{ env.ENVIRONMENT_TYPE }}
    
  3. Mentse a fájlt.

Füsttesztelési feladat hozzáadása a munkafolyamathoz

Most hozzáadhat egy füsttesztelési feladatot, amely futtatja a teszteket.

  1. A fájl alján adja hozzá a következő definíciót a füsttesztelési feladathoz:

    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
    

    Ez a kód határozza meg a feladatot. A feladat tartalmaz egy lépést a kód kivételéhez, és egy lépést a tesztek pesterrel való futtatásához.

    A feladatdefiníció a tulajdonságot használja az needs üzembe helyezési feladat függőségének meghatározásához. Ez a függőség biztosítja, hogy a feladatok a kívánt sorrendben fussanak. Emellett lehetővé teszi az üzembe helyezési feladat kimeneteinek használatát a füsttesztek futtatásakor.

    Feljegyzés

    A PowerShell és a Pester előre telepítve van a GitHub által üzemeltetett futókon. Nem kell semmi különlegeset tennie ahhoz, hogy szkriptlépésben használhassa őket.

  2. Mentse a fájlt.

A munkafolyamat-definíció ellenőrzése és véglegesítése

  1. Ellenőrizze, hogy a workflow.yml fájl a következő kódhoz hasonlóan néz-e ki:

    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
    
      preview:
        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: Run what-if
          with:
            failOnStdErr: false
            resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
            template: deploy/main.bicep
            parameters: >
              environmentType=${{ env.ENVIRONMENT_TYPE }}
            additionalArguments: --what-if
    
      deploy:
        runs-on: ubuntu-latest
        environment: Website
        needs: preview
        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 website
          with:
            failOnStdErr: false
            deploymentName: ${{ github.run_number }}
            resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
            template: ./deploy/main.bicep
            parameters: environmentType=${{ env.ENVIRONMENT_TYPE }}
    
      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
    

    Ha a fájl másként néz ki, frissítse a példának megfelelően, majd mentse.

  2. Véglegesítse és küldje le a módosításokat a Git-adattárba az alábbi parancsok futtatásával a Visual Studio Code terminálon:

    git add .
    git commit -m "Add test job"
    git push
    

Futtassa a munkafolyamatot, és tekintse át a teszt eredményét

  1. Nyissa meg a munkafolyamatot a böngészőben.

  2. Válassza ki a munkafolyamat legutóbbi futtatását.

    Várjon, amíg a munkafolyamat befejezi a lint, az érvényesítési és az előnézeti feladatokat. Bár a GitHub Actions automatikusan frissíti a lapot a legújabb állapottal, érdemes időnként frissíteni a lapot.

  3. Válassza az Üzemelő példányok áttekintése gombot, válassza a Webhelykörnyezetet, majd a Jóváhagyás és üzembe helyezés lehetőséget.

    Várja meg, amíg a munkafolyamat lefut.

  4. Figyelje meg, hogy az üzembe helyezési feladat sikeresen befejeződött. A füsttesztelési feladat egy hibával fejeződik be.

    Képernyőkép a GitHub felületéről, amelyen a munkafolyamat-futtatási feladatok láthatók. A Füstteszt feladat hibát jelez.

  5. Válassza ki a füsttesztelési feladatot a részleteinek megtekintéséhez.

  6. Figyelje meg, hogy a füstteszt kimenete azt mutatja, hogy két teszt futott. Egy átment, egy pedig sikertelen volt. A sikertelen teszt a Toy-webhelyként van felsorolva. Nem szolgál ki oldalakat HTTP-en keresztül.

    Képernyőkép a GitHub-felületről, amely a munkafolyamat-futtatás teszteredményeit jeleníti meg, kiemelve a sikertelen tesztet.

    Ez a szöveg azt jelzi, hogy a webhely nincs megfelelően konfigurálva, hogy megfeleljen a biztonsági csapat követelményeinek.

A Bicep-fájl frissítése

Most, hogy megállapította, hogy a Bicep-definíció nem felel meg a biztonsági csapat követelményeinek, kijavíthatja azt.

  1. A Visual Studio Code-ban nyissa meg a main.bicep fájlt a központi telepítési mappában.

  2. Keresse meg a Azure-alkalmazás Service-alkalmazás definícióját, és frissítse a tulajdonságot a httpsOnly területéreproperties:

    resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
      name: appServiceAppName
      location: location
      properties: {
        serverFarmId: appServicePlan.id
        httpsOnly: true
        siteConfig: {
          appSettings: [
            {
              name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
              value: applicationInsights.properties.InstrumentationKey
            }
            {
              name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
              value: applicationInsights.properties.ConnectionString
            }
          ]
        }
      }
    }
    
  3. Mentse a fájlt.

  4. Véglegesítse és küldje le a módosításokat a Git-adattárba az alábbi parancsok futtatásával a Visual Studio Code terminálon:

    git add .
    git commit -m "Configure HTTPS on website"
    git push
    

Futtassa újra a munkafolyamatot

  1. A böngészőben nyissa meg a munkafolyamat-futtatásokat.

  2. Válassza ki a legutóbbi futtatás lehetőséget.

    Várjon, amíg a munkafolyamat befejezi a lint, az érvényesítési és az előnézeti feladatokat. Bár a GitHub automatikusan frissíti a lapot a legújabb állapottal, érdemes időnként frissíteni a lapot.

  3. Válassza ki az előnézeti feladatot, és tekintse át újra a lehetőségelemzési eredményeket.

    Figyelje meg, hogy a what-if parancs észlelte a httpsOnly tulajdonság értékének változását:

    Resource and property changes are indicated with these symbols:
      - Delete
      + Create
      ~ Modify
      = Nochange
      * Ignore
    
    The deployment will update the following scope:
    
    Scope: /subscriptions/***/resourceGroups/ToyWebsiteTest
    
      ~ Microsoft.OperationalInsights/workspaces/workspace-abcdefghijklm [2022-10-01]
        - properties.retentionInDays: 30
        - properties.sku:
    
            name: "pergb2018"
    
        - properties.workspaceCapping:
    
            dailyQuotaGb: -1.0
    
      ~ Microsoft.Web/sites/toy-website-abcdefghijklm [2022-03-01]
        + properties.siteConfig.localMySqlEnabled:   false
        + properties.siteConfig.netFrameworkVersion: "v4.6"
        ~ properties.httpsOnly:                      false => true
    
      = Microsoft.Insights/components/toywebsite [2020-02-02]
      = Microsoft.Storage/storageAccounts/mystorageabcdefghijklm [2022-09-01]
      = Microsoft.Web/serverfarms/toy-website [2022-03-01]
      * microsoft.alertsmanagement/smartDetectorAlertRules/Failure Anomalies - toywebsite
    
    Resource changes: 2 to modify, 3 no change, 1 to ignore.
    
  4. Térjen vissza a munkafolyamat futtatásához.

  5. Válassza az Üzemelő példányok áttekintése gombot, válassza a Webhelykörnyezetet, majd a Jóváhagyás és üzembe helyezés lehetőséget.

    Várja meg, amíg a munkafolyamat lefut.

  6. Figyelje meg, hogy a teljes munkafolyamat sikeresen befejeződött, beleértve a füsttesztelési feladatot is. Ez a sikeresség azt jelzi, hogy mindkét teszt sikeres volt.

    Képernyőkép a GitHub-felületről, amelyen egy sikeres munkafolyamat-futtatás látható.

Az erőforrások eltávolítása

A gyakorlat elvégzése után eltávolíthatja az erőforrásokat, hogy ne kelljenek fizetnie rájuk.

A Visual Studio Code terminálon futtassa a következő parancsot:

az group delete --resource-group ToyWebsiteTest --yes --no-wait

Az erőforráscsoport a háttérben törlődik.

Remove-AzResourceGroup -Name ToyWebsiteTest -Force