Cvičení – přidání více prostředí do pracovního postupu

Dokončeno

Teď jste připraveni aktualizovat pracovní postup tak, aby se nasadil do testovacího i produkčního prostředí. V této lekci aktualizujete pracovní postup tak, aby používal označované pracovní postupy, abyste mohli opakovaně používat úlohy v různých prostředích.

Během tohoto procesu:

  • Přidejte opakovaně použitelný pracovní postup pro úlohu lint.
  • Přidejte opakovaně použitelný pracovní postup, který definuje úlohy potřebné k nasazení do libovolného prostředí.
  • Aktualizujte pracovní postup tak, aby používal volané pracovní postupy.
  • Spusťte pracovní postup a prohlédněte si výsledky.

Přidání opakovaně použitelného pracovního postupu pro úlohu lint

Úloha lint probíhá pouze jednou během spuštění pracovního postupu bez ohledu na to, do jakého počtu prostředí se pracovní postup nasadí. Takže pro úlohu lint nemusíte ve skutečnosti používat volaný pracovní postup. Pokud ale chcete hlavní definiční soubor pracovního postupu zachovat jednoduchý a snadno čitelný, rozhodnete se definovat úlohu lint v samostatném souboru pracovního postupu.

  1. V editoru Visual Studio Code vytvořte nový soubor ve složce .github/workflows s názvem lint.yml.

    Snímek obrazovky Průzkumníka editoru Visual Studio Code se složkami githubu a pracovními postupy a souborem lint dot YML

  2. Do souboru vložte následující definici pracovního postupu:

    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
    

    Úloha lint je stejná jako úloha lint již v pracovním postupu, ale teď je v samostatném souboru pracovního postupu.

  3. Uložte změny a zavřete soubor.

Přidání opakovaně použitelného pracovního postupu pro nasazení

Vytvořte opakovaně použitelný pracovní postup, který definuje všechny úlohy potřebné k nasazení jednotlivých prostředí. K určení nastavení, která se můžou lišit mezi prostředími, použijete vstupy a tajné kódy.

  1. Ve složce .github/workflows vytvořte nový soubor s názvem deploy.yml.

    Snímek obrazovky s Průzkumníkem editoru Visual Studio Code se složkami githubu a pracovními postupy a souborem deploy dot YML

    Tento soubor představuje všechny aktivity nasazení, které se spouští pro každé z vašich prostředí.

  2. Do souboru vložte následující název pracovního postupu, trigger, vstupy a tajné kódy:

    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
    

    Poznámka:

    Když začnete pracovat se souborem YAML v editoru Visual Studio Code, může se zobrazit několik červených vlnovek s informací, že došlo k problému. Důvodem je to, že přípona editoru Visual Studio Code pro soubory YAML někdy nesprávně odhadne schéma souboru.

    Problémy, které rozšíření hlásí, můžete ignorovat. Nebo pokud chcete, můžete do horní části souboru přidat následující kód, který potlačí odhad přípony:

    # yaml-language-server: $schema=./deploy.yml
    
  3. Pod tajné kódy vložte definici ověřovací úlohy:

    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
    

    Všimněte si, že se na úlohy použije podmínka. Předběžné ověření se spouští jenom pro neprodukční prostředí. Operace citlivostní operace se spouští pouze pro produkční prostředí. V předchozím modulu studijního programu jste pro tyto operace použili samostatné úlohy, ale tady je zkombinujete, abyste zjednodušili pracovní postup.

    Tip

    Soubory YAML jsou citlivé na odsazení. Bez ohledu na to, jestli tento kód napíšete nebo vložíte, zkontrolujte správnost odsazení. Později v tomto cvičení uvidíte úplnou definici pracovního postupu YAML, abyste mohli ověřit, že se váš soubor shoduje.

  4. Pod úlohu ověření vložte definici úlohy nasazení:

    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. Pod úlohu nasazení vložte definici testovací úlohy orientačního testu:

    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. Ověřte, že váš soubor deploy.yml teď vypadá jako v následujícím příkladu:

    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. Uložte změny souboru.

Aktualizace definice pracovního postupu tak, aby používala šablony

  1. Otevřete soubor workflow.yml ve složce .github/workflows.

  2. Odeberte obsah oddílu env: , včetně dvou proměnných prostředí. Brzy je nahradíte proměnnými specifickými pro prostředí.

  3. Odeberte obsah lint: definice úlohy a nahraďte ho následujícím kódem, aby se použil soubor lint.yml , který jste vytvořili dříve:

    # Lint the Bicep file.
    lint:
      uses: ./.github/workflows/lint.yml
    
  4. Odstraňte všechno v souboru pod úlohou lint, kterou jste aktualizovali.

  5. Do dolní části souboru přidejte následující kód, který se nasadí do testovacího prostředí:

    # 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. Pod kód, který jste právě přidali, přidejte následující kód pro nasazení do produkčního prostředí:

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

    Aktualizovaný pracovní postup spustí úlohu lint jednou. Potom používá deploy.yml volaný pracovní postup dvakrát: jednou pro každé prostředí. Díky tomu je definice pracovního postupu jasná a snadno pochopitelná. Komentáře v souboru YAML identifikují cílové prostředí jednotlivých úloh.

  7. Ověřte, že váš soubor workflow.yml vypadá jako v následujícím příkladu:

    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. Uložte provedené změny.

  9. Potvrďte a nasdílejte změny do úložiště Git spuštěním následujících příkazů v terminálu editoru Visual Studio Code:

    git add .
    git commit -m "Add reusable workflows"
    git push
    
  10. Vzhledem k tomu, že se do úložiště nasdílíte poprvé, může se zobrazit výzva k přihlášení.

    Ve Windows zadejte 1 pro ověření pomocí webového prohlížeče a vyberte Enter.

    V systému macOS vyberte Autorizovat.

  11. Zobrazí se okno prohlížeče. Možná se budete muset znovu přihlásit k GitHubu. Vyberte Autorizovat.

Zobrazení spuštění pracovního postupu

  1. V prohlížeči přejděte na Akce.

    První spuštění pracovního postupu s popiskem Počáteční potvrzení se zobrazí jako selhání. GitHub automaticky spustil pracovní postup při vytváření úložiště. Selhalo, protože tajné kódy nebyly v té době připravené. Toto selhání můžete ignorovat.

  2. Vyberte pracovní postup nasazení-toy-website-environment.

  3. Vyberte poslední spuštění pracovního postupu.

    Všimněte si, že spuštění pracovního postupu teď zobrazuje všechny úlohy, které jste definovali v souborech YAML.

    Některá upozornění jsou uvedena na panelu Poznámky . Všechna tato upozornění jsou způsobená způsobem, jakým Bicep zapisuje informační zprávy do protokolu pracovního postupu. Tato upozornění můžete ignorovat.

  4. Počkejte, než se pracovní postup pozastaví před úlohou deploy-production / deploy . Dosažení tohoto bodu může trvat několik minut.

    Snímek obrazovky GitHubu s pozastaveným spuštěním pracovního postupu ke schválení

  5. Výběrem tlačítka Zkontrolovat nasazení schvalte nasazení do produkčního prostředí.

  6. Vyberte produkční prostředí a pak vyberte tlačítko Schválit a nasadit.

    Snímek obrazovky s rozhraním GitHubu, které zobrazuje stránku schválení pracovního postupu a tlačítko Schválit a nasadit

    Počkejte, až se pracovní postup dokončí. Pracovní postup se úspěšně dokončí.

  7. Vyberte Kód.

  8. Vyberte produkční nasazení.

    Snímek obrazovky GitHubu, který zobrazuje prostředí znakové stránky se zvýrazněným produkčním prostředím

  9. Všimněte si, že na obrazovce nasazení se zobrazí přehled historie nasazení produkčního prostředí.

    Snímek obrazovky GitHubu s produkčním prostředím s historií nasazení zobrazující jedno nasazení

  10. Vyberte identifikátor potvrzení.

    Všimněte si, že GitHub zobrazuje seznam potvrzení zahrnutých v nasazení. To vám pomůže zobrazit změny ve vašem prostředí v průběhu času.

    Snímek obrazovky GitHubu s podrobnostmi o nasazení produkčního prostředí se seznamem potvrzení

  11. V prohlížeči přejděte na web Azure Portal.

  12. Přejděte do skupiny prostředků ToyWebsiteProduction .

  13. V seznamu prostředků otevřete aplikaci Aplikace Azure Service.

    Snímek obrazovky webu Azure Portal znázorňující produkční aplikaci webu App Services a podrobnosti o skladové po straně plánu služby App Service

    Všimněte si, že typ plánu služby App Service je S1.

  14. Přejděte do aplikace App Service ve skupině prostředků ToyWebsiteTest .

    Všimněte si, že typ plánu služby App Service je F1. Obě prostředí používají různá nastavení, jak jste definovali v souboru Bicep.