Oefening: meerdere omgevingen toevoegen aan uw pijplijn

Voltooid

U bent nu klaar om uw pijplijn bij te werken om te implementeren in zowel uw test- als productieomgevingen. In deze les werkt u uw pijplijn bij om sjablonen te gebruiken, zodat u de fasen in de omgevingen opnieuw kunt gebruiken.

Tijdens het proces gaat u het volgende doen:

  • Voeg een pijplijnsjabloon toe voor de lintfase.
  • Voeg een pijplijnsjabloon toe waarmee de fasen worden gedefinieerd die nodig zijn voor implementatie in elke omgeving.
  • Werk uw pijplijn bij om de sjablonen te gebruiken.
  • Voer uw pijplijn uit en bekijk de resultaten.

Een pijplijnsjabloon toevoegen voor de lintfase

De lintfase vindt slechts één keer plaats tijdens de pijplijnuitvoering, ongeacht het aantal omgevingen waarin de pijplijn wordt geïmplementeerd. U hoeft dus geen sjablonen te gebruiken voor de lintfase. Maar om uw hoofdpijplijndefinitiebestand eenvoudig en gemakkelijk leesbaar te houden, besluit u om de lintfase in een sjabloon te definiëren.

  1. Maak in Visual Studio Code een nieuwe map met de naam pijplijnsjablonen in de implementatiemap .

  2. Maak een nieuw bestand in de map pijplijnsjablonen met de naam lint.yml.

    Schermopname van Visual Studio Code Explorer, met de map pipeline-templates en het lint dot Y M L-bestand.

  3. Plak de volgende definitie van de pijplijnsjabloon in het bestand:

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

    De lintfase is hetzelfde als de lintfase die zich al in de pijplijn bevindt, maar nu in een afzonderlijk pijplijnsjabloonbestand.

  4. Sla de wijzigingen op en sluit het bestand.

Een pijplijnsjabloon voor implementatie toevoegen

Maak een pijplijnsjabloon waarmee alle fasen worden gedefinieerd die nodig zijn om elk van uw omgevingen te implementeren. U gebruikt sjabloonparameters om de instellingen op te geven die mogelijk verschillen tussen omgevingen.

  1. Maak een nieuw bestand in de map pijplijnsjablonen met de naam deploy.yml.

    Schermopname van Visual Studio Code Explorer, met de map pipeline-templates en het dot YML-bestand implementeren.

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

  2. Plak de volgende pijplijnsjabloonparameters in het bestand:

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

    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 wilt, kunt u de volgende code boven aan het bestand toevoegen om de schatting van de extensie te onderdrukken:

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

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

    U ziet dat er een voorwaarde wordt toegepast op deze fase. Deze wordt alleen uitgevoerd voor niet-productieomgevingen.

    U ziet ook dat de fase-id de waarde van de environmentType parameter bevat. Deze parameter zorgt ervoor dat elke fase in uw pijplijn een unieke id heeft. De fase heeft ook een displayName eigenschap om een goed opgemaakte naam te maken die u kunt lezen.

  4. Plak onder de validatiefase de definitie van de preview-fase:

    - ${{ 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}}
    

    U ziet dat voor deze fase ook een voorwaarde is toegepast, maar dit is het tegenovergestelde van de voorwaarde van de validatiefase. De preview-fase wordt alleen uitgevoerd voor de productieomgeving.

  5. Plak onder de preview-fase de definitie van de implementatiefase:

    - 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. Plak onder de implementatiefase de definitie van de betrouwbaarheidstestfase:

    - 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'
    

    U ziet dat de appServiceAppHostName variabeledefinitie de environmentType parameter bevat wanneer deze verwijst naar de fase waarin de hostnaam is gepubliceerd. Deze parameter zorgt ervoor dat elke betrouwbaarheidstestfase wordt uitgevoerd tegen de juiste omgeving.

  7. Controleer of uw deploy.yml bestand er nu uitziet zoals in het volgende voorbeeld:

    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. Sla de wijzigingen in het bestand op.

De pijplijndefinitie bijwerken om de sjablonen te gebruiken

  1. Open bestand azure-pipelines.yml.

  2. Werk het bestand bij om de nieuwe sjablonen te gebruiken door de inhoud te vervangen door de volgende code:

    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
    

    Met deze pijplijn wordt de lintfase eenmaal uitgevoerd. Vervolgens wordt het sjabloonbestand deploy.yml tweemaal gebruikt: eenmaal per omgeving. Hierdoor blijft de pijplijndefinitie duidelijk en gemakkelijk te begrijpen. De opmerkingen helpen ook uit te leggen wat er gebeurt.

  3. Sla uw wijzigingen op.

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

De pijplijnuitvoering weergeven

  1. Ga in uw browser naar Pijplijnen.

  2. Selecteer de meest recente uitvoering van uw pijplijn.

    U ziet dat de pijplijnuitvoering nu alle fasen toont die u hebt gedefinieerd in het YAML-bestand. Mogelijk moet u horizontaal schuiven om ze allemaal weer te geven.

    Schermopname van Azure Pipelines met de fasen van de pijplijnuitvoering.

  3. Wacht tot de pijplijn is onderbroken voordat de fase Deploy (Production Environment) wordt uitgevoerd. Het kan enkele minuten duren voordat de pijplijn dit punt bereikt.

    Schermopname van Azure Pipelines waarin de pijplijnuitvoering is onderbroken voor goedkeuring.

  4. Keur de implementatie goed in de productieomgeving door de knop Controleren te selecteren.

  5. Selecteer de knop Goedkeuren .

    Schermopname van de Azure DevOps-interface met de goedkeuringspagina van de pijplijn en de knop Goedkeuren.

    Wacht totdat de pijplijn is uitgevoerd.

  6. Selecteer het tabblad Tests om de testresultaten van deze pijplijnuitvoering weer te geven.

    U ziet dat er nu vier testresultaten zijn. De betrouwbaarheidstest wordt uitgevoerd op zowel de test- als de productieomgeving, zodat u de resultaten voor beide sets tests ziet.

    Schermopname van Azure Pipelines met de pagina voor pijplijnuitvoeringstests, met vier testresultaten.

  7. Selecteer Pijplijnomgevingen>.

  8. Selecteer de productieomgeving .

  9. U ziet in het scherm met omgevingsgegevens een overzicht van de implementatiegeschiedenis van de productieomgeving.

    Schermopname van Azure Pipelines met de productieomgeving, met de implementatiegeschiedenis met één implementatie.

  10. Selecteer de implementatie en selecteer het tabblad Wijzigingen .

    U ziet dat op het tabblad Wijzigingen de lijst met doorvoeringen wordt weergegeven die zijn opgenomen in de implementatie. Deze informatie helpt u precies te zien wat er in de loop van de tijd in uw omgeving is gewijzigd.

    Schermopname van Azure Pipelines met de implementatiedetails van de productieomgeving, met een lijst met doorvoeringen.

  11. Ga in een browser naar de Azure-portal.

  12. Ga naar de resourcegroep ToyWebsiteProduction .

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

    Schermopname van Azure Portal met de app App Service-productie en de SKU-details van het App Service-plan.

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

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

    U ziet dat het type App Service-plan F1 is. De twee omgevingen gebruiken verschillende instellingen, zoals u hebt gedefinieerd in uw Bicep-bestand.