Cvičení – přidání více prostředí do kanálu

Dokončeno

Teď jste připraveni aktualizovat kanál tak, aby se nasadil do testovacího i produkčního prostředí. V této lekci aktualizujete kanál tak, aby používal šablony, abyste mohli opakovaně používat fáze napříč prostředími.

Během tohoto procesu:

  • Přidejte šablonu kanálu pro fázi lintu.
  • Přidejte šablonu kanálu, která definuje fáze potřebné k nasazení do libovolného prostředí.
  • Aktualizujte kanál tak, aby používal šablony.
  • Spusťte kanál a prohlédněte si výsledky.

Přidání šablony kanálu pro fázi lintu

Fáze lint probíhá pouze jednou během spuštění kanálu bez ohledu na to, do jakého počtu prostředí se kanál nasadí. Takže ve skutečnosti nemusíte používat šablony pro fázi lint. Pokud ale chcete, aby byl hlavní definiční soubor kanálu jednoduchý a snadno čitelný, rozhodnete se definovat fázi lint v šabloně.

  1. V editoru Visual Studio Code vytvořte novou složku s názvem pipeline-templates uvnitř složky deploy .

  2. Ve složce šablon kanálů vytvořte nový soubor s názvem lint.yml.

    Snímek obrazovky Průzkumníka editoru Visual Studio Code se složkou pipeline-templates a souborem lint dot Y M L

  3. Do souboru vložte následující definici šablony kanálu:

    jobs:
    - job: LintCode
      displayName: Lint code
      steps:
        - script: |
            az bicep build --file deploy/main.bicep
          name: LintBicepCode
          displayName: Run Bicep linter
    

    Fáze lint je stejná jako fáze lintu, která už v kanálu je, ale teď je v samostatném souboru šablony kanálu.

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

Přidání šablony kanálu pro nasazení

Vytvořte šablonu kanálu, která definuje všechny fáze potřebné k nasazení jednotlivých prostředí. Pomocí parametrů šablony můžete určit nastavení, která se mohou mezi prostředími lišit.

  1. Ve složce šablon kanálů vytvořte nový soubor s názvem deploy.yml.

    Snímek obrazovky Průzkumníka editoru Visual Studio Code se složkou pipeline-templates 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í parametry šablony kanálu:

    parameters:
    - name: environmentType
      type: string
    - name: resourceGroupName
      type: string
    - name: serviceConnectionName
      type: string
    - name: deploymentDefaultLocation
      type: string
      default: westus3
    

    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 parametry vložte definici fáze ověření:

    stages:
    
    - ${{ if ne(parameters.environmentType, 'Production') }}:
      - stage: Validate_${{parameters.environmentType}}
        displayName: Validate (${{parameters.environmentType}} Environment)
        jobs:
        - job: ValidateBicepCode
          displayName: Validate Bicep code
          steps:
            - task: AzureResourceManagerTemplateDeployment@3
              name: RunPreflightValidation
              displayName: Run preflight validation
              inputs:
                connectedServiceName: ${{parameters.serviceConnectionName}}
                location: ${{parameters.deploymentDefaultLocation}}
                deploymentMode: Validation
                resourceGroupName: ${{parameters.resourceGroupName}}
                csmFile: deploy/main.bicep
                overrideParameters: >
                  -environmentType ${{parameters.environmentType}}
    

    Všimněte si, že v této fázi je použita podmínka. Běží pouze pro neprodukční prostředí.

    Všimněte si také, že identifikátor fáze obsahuje hodnotu parametru environmentType . Tento parametr zajišťuje, že každá fáze kanálu má jedinečný identifikátor. Fáze má displayName také vlastnost, která vytvoří dobře formátovaný název, který si můžete přečíst.

  4. Pod fázi ověření vložte definici fáze náhledu:

    - ${{ if eq(parameters.environmentType, 'Production') }}:
      - stage: Preview_${{parameters.environmentType}}
        displayName: Preview (${{parameters.environmentType}} Environment)
        jobs:
        - job: PreviewAzureChanges
          displayName: Preview Azure changes
          steps:
            - task: AzureCLI@2
              name: RunWhatIf
              displayName: Run what-if
              inputs:
                azureSubscription: ${{parameters.serviceConnectionName}}
                scriptType: 'bash'
                scriptLocation: 'inlineScript'
                inlineScript: |
                  az deployment group what-if \
                    --resource-group ${{parameters.resourceGroupName}} \
                    --template-file deploy/main.bicep \
                    --parameters environmentType=${{parameters.environmentType}}
    

    Všimněte si, že tato fáze má také použitou podmínku, ale je to opak podmínky ověřovací fáze. Fáze Preview se spouští pouze pro produkční prostředí.

  5. Pod fázi preview vložte definici fáze nasazení:

    - stage: Deploy_${{parameters.environmentType}}
      displayName: Deploy (${{parameters.environmentType}} Environment)
      jobs:
      - deployment: DeployWebsite
        displayName: Deploy website
        environment: ${{parameters.environmentType}}
        strategy:
          runOnce:
            deploy:
              steps:
                - checkout: self
    
                - task: AzureResourceManagerTemplateDeployment@3
                  name: DeployBicepFile
                  displayName: Deploy Bicep file
                  inputs:
                    connectedServiceName: ${{parameters.serviceConnectionName}}
                    deploymentName: $(Build.BuildNumber)
                    location: ${{parameters.deploymentDefaultLocation}}
                    resourceGroupName: ${{parameters.resourceGroupName}}
                    csmFile: deploy/main.bicep
                    overrideParameters: >
                      -environmentType ${{parameters.environmentType}}
                    deploymentOutputs: deploymentOutputs
    
                - bash: |
                    echo "##vso[task.setvariable variable=appServiceAppHostName;isOutput=true]$(echo $DEPLOYMENT_OUTPUTS | jq -r '.appServiceAppHostName.value')"
                  name: SaveDeploymentOutputs
                  displayName: Save deployment outputs into variables
                  env:
                    DEPLOYMENT_OUTPUTS: $(deploymentOutputs)
    
  6. Pod fázi nasazení vložte definici fáze orientačního testu:

    - stage: SmokeTest_${{parameters.environmentType}}
      displayName: Smoke Test (${{parameters.environmentType}} Environment)
      jobs:
      - job: SmokeTest
        displayName: Smoke test
        variables:
          appServiceAppHostName: $[ stageDependencies.Deploy_${{parameters.environmentType}}.DeployWebsite.outputs['DeployWebsite.SaveDeploymentOutputs.appServiceAppHostName'] ]
        steps:
          - task: PowerShell@2
            name: RunSmokeTests
            displayName: Run smoke tests
            inputs:
              targetType: inline
              script: |
                $container = New-PesterContainer `
                  -Path 'deploy/Website.Tests.ps1' `
                  -Data @{ HostName = '$(appServiceAppHostName)' }
                Invoke-Pester `
                  -Container $container `
                  -CI
    
          - task: PublishTestResults@2
            name: PublishTestResults
            displayName: Publish test results
            condition: always()
            inputs:
              testResultsFormat: NUnit
              testResultsFiles: 'testResults.xml'
    

    Všimněte si, že appServiceAppHostName definice proměnné zahrnuje environmentType parametr, když odkazuje na fázi, která publikovala název hostitele. Tento parametr zajišťuje, aby každá fáze orientačního testu běžela ve správném prostředí.

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

    parameters:
    - name: environmentType
      type: string
    - name: resourceGroupName
      type: string
    - name: serviceConnectionName
      type: string
    - name: deploymentDefaultLocation
      type: string
      default: westus3
    
    stages:
    
    - ${{ if ne(parameters.environmentType, 'Production') }}:
      - stage: Validate_${{parameters.environmentType}}
        displayName: Validate (${{parameters.environmentType}} Environment)
        jobs:
        - job: ValidateBicepCode
          displayName: Validate Bicep code
          steps:
            - task: AzureResourceManagerTemplateDeployment@3
              name: RunPreflightValidation
              displayName: Run preflight validation
              inputs:
                connectedServiceName: ${{parameters.serviceConnectionName}}
                location: ${{parameters.deploymentDefaultLocation}}
                deploymentMode: Validation
                resourceGroupName: ${{parameters.resourceGroupName}}
                csmFile: deploy/main.bicep
                overrideParameters: >
                  -environmentType ${{parameters.environmentType}}
    
    - ${{ if eq(parameters.environmentType, 'Production') }}:
      - stage: Preview_${{parameters.environmentType}}
        displayName: Preview (${{parameters.environmentType}} Environment)
        jobs:
        - job: PreviewAzureChanges
          displayName: Preview Azure changes
          steps:
            - task: AzureCLI@2
              name: RunWhatIf
              displayName: Run what-if
              inputs:
                azureSubscription: ${{parameters.serviceConnectionName}}
                scriptType: 'bash'
                scriptLocation: 'inlineScript'
                inlineScript: |
                  az deployment group what-if \
                    --resource-group ${{parameters.resourceGroupName}} \
                    --template-file deploy/main.bicep \
                    --parameters environmentType=${{parameters.environmentType}}
    
    - stage: Deploy_${{parameters.environmentType}}
      displayName: Deploy (${{parameters.environmentType}} Environment)
      jobs:
      - deployment: DeployWebsite
        displayName: Deploy website
        environment: ${{parameters.environmentType}}
        strategy:
          runOnce:
            deploy:
              steps:
                - checkout: self
    
                - task: AzureResourceManagerTemplateDeployment@3
                  name: DeployBicepFile
                  displayName: Deploy Bicep file
                  inputs:
                    connectedServiceName: ${{parameters.serviceConnectionName}}
                    deploymentName: $(Build.BuildNumber)
                    location: ${{parameters.deploymentDefaultLocation}}
                    resourceGroupName: ${{parameters.resourceGroupName}}
                    csmFile: deploy/main.bicep
                    overrideParameters: >
                      -environmentType ${{parameters.environmentType}}
                    deploymentOutputs: deploymentOutputs
    
                - bash: |
                    echo "##vso[task.setvariable variable=appServiceAppHostName;isOutput=true]$(echo $DEPLOYMENT_OUTPUTS | jq -r '.appServiceAppHostName.value')"
                  name: SaveDeploymentOutputs
                  displayName: Save deployment outputs into variables
                  env:
                    DEPLOYMENT_OUTPUTS: $(deploymentOutputs)
    
    - stage: SmokeTest_${{parameters.environmentType}}
      displayName: Smoke Test (${{parameters.environmentType}} Environment)
      jobs:
      - job: SmokeTest
        displayName: Smoke test
        variables:
          appServiceAppHostName: $[ stageDependencies.Deploy_${{parameters.environmentType}}.DeployWebsite.outputs['DeployWebsite.SaveDeploymentOutputs.appServiceAppHostName'] ]
        steps:
          - task: PowerShell@2
            name: RunSmokeTests
            displayName: Run smoke tests
            inputs:
              targetType: inline
              script: |
                $container = New-PesterContainer `
                  -Path 'deploy/Website.Tests.ps1' `
                  -Data @{ HostName = '$(appServiceAppHostName)' }
                Invoke-Pester `
                  -Container $container `
                  -CI
    
          - task: PublishTestResults@2
            name: PublishTestResults
            displayName: Publish test results
            condition: always()
            inputs:
              testResultsFormat: NUnit
              testResultsFiles: 'testResults.xml'
    
  8. Uložte změny souboru.

Aktualizace definice kanálu tak, aby používala šablony

  1. Otevřete soubor azure-pipelines.yml.

  2. Aktualizujte soubor tak, aby používal nové šablony nahrazením obsahu následujícím kódem:

    trigger:
      batch: true
      branches:
        include:
        - main
    
    pool:
      vmImage: ubuntu-latest
    
    stages:
    
    # Lint the Bicep file.
    - stage: Lint
      jobs: 
      - template: pipeline-templates/lint.yml
    
    # Deploy to the test environment.
    - template: pipeline-templates/deploy.yml
      parameters:
        environmentType: Test
        resourceGroupName: ToyWebsiteTest
        serviceConnectionName: ToyWebsiteTest
    
    # Deploy to the production environment.
    - template: pipeline-templates/deploy.yml
      parameters:
        environmentType: Production
        resourceGroupName: ToyWebsiteProduction
        serviceConnectionName: ToyWebsiteProduction
    

    Tento kanál spustí fázi lintu jednou. Pak použije soubor šablony deploy.yml dvakrát: jednou pro každé prostředí. Díky tomu je definice kanálu jasná a snadno pochopitelná. Komentáře také pomáhají vysvětlit, co se děje.

  3. Uložte provedené změny.

  4. 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 pipeline templates"
    git push
    

Zobrazení spuštění kanálu

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

  2. Vyberte poslední spuštění kanálu.

    Všimněte si, že spuštění kanálu teď zobrazuje všechny fáze, které jste definovali v souboru YAML. Možná se budete muset posunout vodorovně, abyste je viděli všechny.

    Snímek obrazovky se službou Azure Pipelines, která zobrazuje fáze spuštění kanálu

  3. Počkejte, než se kanál pozastaví před fází Nasazení (produkční prostředí). Než se kanál dostane k tomuto bodu, může to trvat několik minut.

    Snímek obrazovky se službou Azure Pipelines, která zobrazuje pozastavené spuštění kanálu ke schválení

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

  5. Vyberte tlačítko Schválit.

    Snímek obrazovky s rozhraním Azure DevOps, které zobrazuje stránku schválení kanálu a tlačítko Schválit

    Počkejte, až se kanál dokončí.

  6. Výběrem karty Testy zobrazíte výsledky testů z tohoto spuštění kanálu.

    Všimněte si, že teď existují čtyři výsledky testů. Orientační test běží v testovacím i produkčním prostředí, takže uvidíte výsledky pro obě sady testů.

    Snímek obrazovky se službou Azure Pipelines, která zobrazuje stránku pro testy spuštění kanálu se čtyřmi výsledky testů

  7. Vyberte prostředí Kanálů>.

  8. Vyberte produkční prostředí.

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

    Snímek obrazovky se službou Azure Pipelines zobrazující produkční prostředí s historií nasazení zobrazující jedno nasazení

  10. Vyberte nasazení a vyberte kartu Změny .

    Všimněte si, že na kartě Změny se zobrazuje seznam potvrzení zahrnutých v nasazení. Tyto informace vám pomůžou přesně zjistit, co se v prostředí v průběhu času změnilo.

    Snímek obrazovky se službou Azure Pipelines zobrazící podrobnosti 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 App Service a podrobnosti o skladové posílce 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.