Oefening: meerdere omgevingen toevoegen aan uw pijplijn
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.
Maak in Visual Studio Code een nieuwe map met de naam pijplijnsjablonen in de implementatiemap .
Maak een nieuw bestand in de map pijplijnsjablonen met de naam lint.yml.
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.
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.
Maak een nieuw bestand in de map pijplijnsjablonen met de naam deploy.yml.
Dit bestand vertegenwoordigt alle implementatieactiviteiten die worden uitgevoerd voor elk van uw omgevingen.
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
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 eendisplayName
eigenschap om een goed opgemaakte naam te maken die u kunt lezen.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.
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)
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 deenvironmentType
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.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'
Sla de wijzigingen in het bestand op.
De pijplijndefinitie bijwerken om de sjablonen te gebruiken
Open bestand azure-pipelines.yml.
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.
Sla uw wijzigingen op.
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
Ga in uw browser naar Pijplijnen.
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.
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.
Keur de implementatie goed in de productieomgeving door de knop Controleren te selecteren.
Selecteer de knop Goedkeuren .
Wacht totdat de pijplijn is uitgevoerd.
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.
Selecteer Pijplijnomgevingen>.
Selecteer de productieomgeving .
U ziet in het scherm met omgevingsgegevens een overzicht van de implementatiegeschiedenis van de productieomgeving.
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.
Ga in een browser naar de Azure-portal.
Ga naar de resourcegroep ToyWebsiteProduction .
Open de Azure-app Service-app in de lijst met resources.
U ziet dat het type App Service-plan S1 is.
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.