Övning – Använda Bicep-parametrar med flera miljöer
Nu när din pipeline distribueras till båda dina miljöer är du redo att integrera med API:et från tredje part för produktgranskningar.
Ditt webbplatsteam har gett dig de API-nycklar och URL:er som din webbplats ska använda för att få åtkomst till tjänsten. Det finns olika värden för dina test- och produktionsmiljöer att använda. I den här lektionen uppdaterar du din pipeline för att konfigurera var och en av dina miljöer med rätt inställningar för API:et för produktgranskning.
Under processen gör du följande:
- Skapa variabelgrupper för var och en av dina miljöer.
- Uppdatera pipelinen så att den väljer rätt variabelgrupp för varje miljö i stället för att använda mallparametrar.
- Uppdatera Bicep-filen för att sprida de inställningar som du behöver för API:et för produktgranskning.
- Uppdatera variabelgruppen och pipelinen för att ange värdena för inställningarna för produktgransknings-API:et.
- Granska pipelineresultaten och ändringarna i Din Azure-miljö.
Lägga till variabelgrupper
Eftersom du lägger till fler parametrar som varierar mellan varje miljö bestämmer du dig för att flytta från att lägga till dina pipelineparametrar direkt i dina YAML-pipelinefiler. I stället använder du en variabelgrupp för att hålla ihop värdena för varje miljö.
Gå till Pipelines-biblioteket> i webbläsaren.
Välj knappen + Variabelgrupp.
Ange ToyWebsiteTest som variabelgruppnamn.
Välj knappen + Lägg till för att lägga till variabler i variabelgruppen. Skapa två variabler med följande inställningar:
Name Värde EnvironmentType Test ResourceGroupName ToyWebsiteTest Observera att du inte definierar namnet på tjänstanslutningen i variabelgruppen. Tjänstanslutningsnamn har särskilda regler för hur de kan anges. I den här modulen använder du parametrar för pipelinemallar.
Välj Spara.
Välj knappen Bakåt i webbläsaren för att återgå till listan över variabelgrupper.
Lägg till en annan variabelgrupp med namnet ToyWebsiteProduction. Skapa två variabler med följande inställningar:
Name Värde EnvironmentType Produktion ResourceGroupName ToyWebsiteProduction Observera att variabelnamnen är samma för båda miljöerna, men värdena är olika.
Spara produktionsvariabelgruppen.
Uppdatera mallen för distributionspipeline för att använda variabelgruppen
Öppna filen deploy.yml i Visual Studio Code.
Ta bort parametrarna
resourceGroupName
ochserviceConnectionName
överst i filen. Ta inte bort parametrarnaenvironmentType
ellerdeploymentDefaultLocation
.parameters: - name: environmentType type: string - name: deploymentDefaultLocation type: string default: westus3
ValidateBicepCode
Uppdatera jobbet för att importera variabelgruppen:- ${{ if ne(parameters.environmentType, 'Production') }}: - stage: Validate_${{parameters.environmentType}} displayName: Validate (${{parameters.environmentType}} Environment) jobs: - job: ValidateBicepCode displayName: Validate Bicep code variables: - group: ToyWebsite${{parameters.environmentType}} steps:
ValidateBicepCode
Uppdatera jobbet för att automatiskt härleda tjänstanslutningsnamnet baserat påenvironmentType
parametervärdet:- ${{ if ne(parameters.environmentType, 'Production') }}: - stage: Validate_${{parameters.environmentType}} displayName: Validate (${{parameters.environmentType}} Environment) jobs: - job: ValidateBicepCode displayName: Validate Bicep code variables: - group: ToyWebsite${{parameters.environmentType}} steps: - task: AzureResourceManagerTemplateDeployment@3 name: RunPreflightValidation displayName: Run preflight validation inputs: connectedServiceName: ToyWebsite${{parameters.environmentType}} location: ${{parameters.deploymentDefaultLocation}} deploymentMode: Validation resourceGroupName: $(ResourceGroupName) csmFile: deploy/main.bicep overrideParameters: > -environmentType $(EnvironmentType)
ValidateBicepCode
Uppdatera jobbet så att den importerade variabelgruppen används för att ange resursgruppens namn och miljötypargument för distributionsaktiviteten:- ${{ if ne(parameters.environmentType, 'Production') }}: - stage: Validate_${{parameters.environmentType}} displayName: Validate (${{parameters.environmentType}} Environment) jobs: - job: ValidateBicepCode displayName: Validate Bicep code variables: - group: ToyWebsite${{parameters.environmentType}} steps: - task: AzureResourceManagerTemplateDeployment@3 name: RunPreflightValidation displayName: Run preflight validation inputs: connectedServiceName: ToyWebsite${{parameters.environmentType}} location: ${{parameters.deploymentDefaultLocation}} deploymentMode: Validation resourceGroupName: $(ResourceGroupName) csmFile: deploy/main.bicep overrideParameters: > -environmentType $(EnvironmentType)
Gör ändringarna i
PreviewAzureChanges
jobbet:- ${{ if eq(parameters.environmentType, 'Production') }}: - stage: Preview_${{parameters.environmentType}} displayName: Preview (${{parameters.environmentType}} Environment) jobs: - job: PreviewAzureChanges displayName: Preview Azure changes variables: - group: ToyWebsite${{parameters.environmentType}} steps: - task: AzureCLI@2 name: RunWhatIf displayName: Run what-if inputs: azureSubscription: ToyWebsite${{parameters.environmentType}} scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: | az deployment group what-if \ --resource-group $(ResourceGroupName) \ --template-file deploy/main.bicep \ --parameters environmentType=$(EnvironmentType)
Gör samma ändringar i distributionsjobbet
Deploy
:- stage: Deploy_${{parameters.environmentType}} displayName: Deploy (${{parameters.environmentType}} Environment) jobs: - deployment: DeployWebsite displayName: Deploy website variables: - group: ToyWebsite${{parameters.environmentType}} environment: ${{parameters.environmentType}} strategy: runOnce: deploy: steps: - checkout: self - task: AzureResourceManagerTemplateDeployment@3 name: DeployBicepFile displayName: Deploy Bicep file inputs: connectedServiceName: ToyWebsite${{parameters.environmentType}} deploymentName: $(Build.BuildNumber) location: ${{parameters.deploymentDefaultLocation}} resourceGroupName: $(ResourceGroupName) csmFile: deploy/main.bicep overrideParameters: > -environmentType $(EnvironmentType) deploymentOutputs: deploymentOutputs
Kontrollera att din deploy.yml fil nu ser ut som följande kod:
parameters: - name: environmentType 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 variables: - group: ToyWebsite${{parameters.environmentType}} steps: - task: AzureResourceManagerTemplateDeployment@3 name: RunPreflightValidation displayName: Run preflight validation inputs: connectedServiceName: ToyWebsite${{parameters.environmentType}} location: ${{parameters.deploymentDefaultLocation}} deploymentMode: Validation resourceGroupName: $(ResourceGroupName) csmFile: deploy/main.bicep overrideParameters: > -environmentType $(EnvironmentType) - ${{ if eq(parameters.environmentType, 'Production') }}: - stage: Preview_${{parameters.environmentType}} displayName: Preview (${{parameters.environmentType}} Environment) jobs: - job: PreviewAzureChanges displayName: Preview Azure changes variables: - group: ToyWebsite${{parameters.environmentType}} steps: - task: AzureCLI@2 name: RunWhatIf displayName: Run what-if inputs: azureSubscription: ToyWebsite${{parameters.environmentType}} scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: | az deployment group what-if \ --resource-group $(ResourceGroupName) \ --template-file deploy/main.bicep \ --parameters environmentType=$(EnvironmentType) - stage: Deploy_${{parameters.environmentType}} displayName: Deploy (${{parameters.environmentType}} Environment) jobs: - deployment: DeployWebsite displayName: Deploy website variables: - group: ToyWebsite${{parameters.environmentType}} environment: ${{parameters.environmentType}} strategy: runOnce: deploy: steps: - checkout: self - task: AzureResourceManagerTemplateDeployment@3 name: DeployBicepFile displayName: Deploy Bicep file inputs: connectedServiceName: ToyWebsite${{parameters.environmentType}} deploymentName: $(Build.BuildNumber) location: ${{parameters.deploymentDefaultLocation}} resourceGroupName: $(ResourceGroupName) csmFile: deploy/main.bicep overrideParameters: > -environmentType $(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'
Spara ändringarna i filen.
Uppdatera pipelinedefinitionen för att förenkla parameterlistan
Öppna filen azure-pipelines.yml.
Uppdatera de steg som använder mallar för att ta bort parametrarna
resourceGroupName
ochserviceConnectionName
. Lämna bara parameternenvironmentType
.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 # Deploy to the production environment. - template: pipeline-templates/deploy.yml parameters: environmentType: Production
Spara ändringarna i filen.
Genomför dina ändringar på Git-lagringsplatsen utan att skicka dem med hjälp av följande kommandon:
git add . git commit -m "Use variable groups"
Uppdatera Bicep-filen
Öppna filen main.bicep.
Under parametrarna som redan finns i filen lägger du till följande parametrar för det nya gransknings-API:et:
@description('The URL to the product review API.') param reviewApiUrl string @secure() @description('The API key to use when accessing the product review API.') param reviewApiKey string
Uppdatera resursdefinitionen
appServiceApp
för att ange url:en och nyckeln för gransknings-API:et till programmet, så att webbplatsens kod kan använda dem: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 } { name: 'ReviewApiUrl' value: reviewApiUrl } { name: 'ReviewApiKey' value: reviewApiKey } ] } } }
Spara ändringarna i filen.
Uppdatera variabelgrupperna
I webbläsaren går du till Pipelines-biblioteket> och öppnar variabelgrupperna ToyWebsiteTest.
Lägg till följande variabler:
Name Värde ReviewApiKey sandboxsecretkey ReviewApiUrl https://sandbox.contoso.com/reviews
Välj hänglåsikonen bredvid variabeln ReviewApiKey . Det här steget instruerar Azure Pipelines att hantera variabelns värde på ett säkert sätt.
Spara variabelgruppen.
Uppdatera variabelgruppen ToyWebsiteProduction för att lägga till en liknande uppsättning variabler:
Name Värde ReviewApiKey productionsecretkey ReviewApiUrl https://api.contoso.com/reviews
Kom ihåg att välja hänglåsikonen bredvid variabeln ReviewApiKey .
Spara variabelgruppen.
Lägg till gransknings-API-variablerna i variabelgrupperna
Öppna filen deploy.yml i Visual Studio Code.
ValidateBicepCode
I jobbet lägger du till parametervärdena för gransknings-API i distributionsuppgiften:- ${{ if ne(parameters.environmentType, 'Production') }}: - stage: Validate_${{parameters.environmentType}} displayName: Validate (${{parameters.environmentType}} Environment) jobs: - job: ValidateBicepCode displayName: Validate Bicep code variables: - group: ToyWebsite${{parameters.environmentType}} steps: - task: AzureResourceManagerTemplateDeployment@3 name: RunPreflightValidation displayName: Run preflight validation inputs: connectedServiceName: ToyWebsite${{parameters.environmentType}} location: ${{parameters.deploymentDefaultLocation}} deploymentMode: Validation resourceGroupName: $(ResourceGroupName) csmFile: deploy/main.bicep overrideParameters: > -environmentType $(EnvironmentType) -reviewApiUrl $(ReviewApiUrl) -reviewApiKey $(ReviewApiKey)
Gör samma ändring i
PreviewAzureChanges
jobbet:- ${{ if eq(parameters.environmentType, 'Production') }}: - stage: Preview_${{parameters.environmentType}} displayName: Preview (${{parameters.environmentType}} Environment) jobs: - job: PreviewAzureChanges displayName: Preview Azure changes variables: - group: ToyWebsite${{parameters.environmentType}} steps: - task: AzureCLI@2 name: RunWhatIf displayName: Run what-if inputs: azureSubscription: ToyWebsite${{parameters.environmentType}} scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: | az deployment group what-if \ --resource-group $(ResourceGroupName) \ --template-file deploy/main.bicep \ --parameters environmentType=$(EnvironmentType) \ reviewApiUrl=$(ReviewApiUrl) \ reviewApiKey=$(ReviewApiKey)
Viktigt!
Se till att lägga till omvänt snedstreck (
\
) i slutet av raden som angerenvironmentType
parametervärdet och på den efterföljande raden. Tecknet\
anger att ytterligare rader ingår i samma Azure CLI-kommando.Gör samma ändring i
Deploy
jobbet:- stage: Deploy_${{parameters.environmentType}} displayName: Deploy (${{parameters.environmentType}} Environment) jobs: - deployment: DeployWebsite displayName: Deploy website variables: - group: ToyWebsite${{parameters.environmentType}} environment: ${{parameters.environmentType}} strategy: runOnce: deploy: steps: - checkout: self - task: AzureResourceManagerTemplateDeployment@3 name: DeployBicepFile displayName: Deploy Bicep file inputs: connectedServiceName: ToyWebsite${{parameters.environmentType}} deploymentName: $(Build.BuildNumber) location: ${{parameters.deploymentDefaultLocation}} resourceGroupName: $(ResourceGroupName) csmFile: deploy/main.bicep overrideParameters: > -environmentType $(EnvironmentType) -reviewApiUrl $(ReviewApiUrl) -reviewApiKey $(ReviewApiKey) deploymentOutputs: deploymentOutputs
Kontrollera att din deploy.yml fil nu ser ut som följande kod:
parameters: - name: environmentType 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 variables: - group: ToyWebsite${{parameters.environmentType}} steps: - task: AzureResourceManagerTemplateDeployment@3 name: RunPreflightValidation displayName: Run preflight validation inputs: connectedServiceName: ToyWebsite${{parameters.environmentType}} location: ${{parameters.deploymentDefaultLocation}} deploymentMode: Validation resourceGroupName: $(ResourceGroupName) csmFile: deploy/main.bicep overrideParameters: > -environmentType $(EnvironmentType) -reviewApiUrl $(ReviewApiUrl) -reviewApiKey $(ReviewApiKey) - ${{ if eq(parameters.environmentType, 'Production') }}: - stage: Preview_${{parameters.environmentType}} displayName: Preview (${{parameters.environmentType}} Environment) jobs: - job: PreviewAzureChanges displayName: Preview Azure changes variables: - group: ToyWebsite${{parameters.environmentType}} steps: - task: AzureCLI@2 name: RunWhatIf displayName: Run what-if inputs: azureSubscription: ToyWebsite${{parameters.environmentType}} scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: | az deployment group what-if \ --resource-group $(ResourceGroupName) \ --template-file deploy/main.bicep \ --parameters environmentType=$(EnvironmentType) \ reviewApiUrl=$(ReviewApiUrl) \ reviewApiKey=$(ReviewApiKey) - stage: Deploy_${{parameters.environmentType}} displayName: Deploy (${{parameters.environmentType}} Environment) jobs: - deployment: DeployWebsite displayName: Deploy website variables: - group: ToyWebsite${{parameters.environmentType}} environment: ${{parameters.environmentType}} strategy: runOnce: deploy: steps: - checkout: self - task: AzureResourceManagerTemplateDeployment@3 name: DeployBicepFile displayName: Deploy Bicep file inputs: connectedServiceName: ToyWebsite${{parameters.environmentType}} deploymentName: $(Build.BuildNumber) location: ${{parameters.deploymentDefaultLocation}} resourceGroupName: $(ResourceGroupName) csmFile: deploy/main.bicep overrideParameters: > -environmentType $(EnvironmentType) -reviewApiUrl $(ReviewApiUrl) -reviewApiKey $(ReviewApiKey) 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'
Checka in och skicka ändringarna till Git-lagringsplatsen med hjälp av följande kommandon:
git add . git commit -m "Add new review API settings to Bicep file and pipeline" git push
Granska distributionsresultaten
Gå till Pipelines i webbläsaren.
Välj den senaste körningen av din pipeline.
Vänta tills pipelinen pausas innan fasen Distribuera (produktionsmiljö). Det kan ta några minuter innan pipelinen når den här punkten.
Om du uppmanas att bevilja behörighet att komma åt en resurs väljer du Visa och sedan Tillåt.
Godkänn distributionen till produktionsmiljön genom att välja Granska>godkänn.
Vänta tills pipelinen har körts.
Välj Pipelines-miljöer>.
Välj produktionsmiljön.
Observera att du nu ser flera distributioner i miljöns historik.
I en webbläsare går du till Azure-portalen.
Gå till resursgruppen ToyWebsiteProduction .
Öppna Azure App Service-appen i listan över resurser.
Välj Konfiguration.
Välj Visa värden.
Observera att produktionsplatsens värden för inställningarna ReviewApiKey och ReviewApiUrl är inställda på de värden som du konfigurerade i produktionsvariabelgruppen.
Jämför de aktuella värdena med konfigurationsinställningarna för App Service-appen i resursgruppen ToyWebsiteTest . Observera att värdena skiljer sig.
Rensa resurserna
Nu när du har slutfört övningen kan du ta bort resurserna så att du inte debiteras för dem.
Kör följande kommandon i Visual Studio Code-terminalen:
az group delete --resource-group ToyWebsiteTest --yes --no-wait
az group delete --resource-group ToyWebsiteProduction --yes --no-wait
Resursgruppen tas bort i bakgrunden.
Remove-AzResourceGroup -Name ToyWebsiteTest -Force
Remove-AzResourceGroup -Name ToyWebsiteProduction -Force