Übung: Verwenden von Bicep-Parametern mit mehreren Umgebungen
Nachdem Ihre Pipeline nun in beiden Umgebungen bereitgestellt wird, können Sie die Drittanbieter-API für Produktüberprüfungen integrieren.
Ihr Websiteteam hat Ihnen die API-Schlüssel und URLs bereitgestellt, die Ihre Website für den Zugriff auf den Dienst verwenden sollte. Es gibt unterschiedliche Werte für Ihre Test- und Produktionsumgebung. In dieser Lerneinheit aktualisieren Sie Ihre Pipeline, um jede Ihrer Umgebungen mit den richtigen Einstellungen für die Produktüberprüfungs-API zu konfigurieren.
In dem Prozess gehen Sie wie folgt vor:
- Erstellen Sie Variablengruppen für jede Ihrer Umgebungen.
- Aktualisieren Sie die Pipeline so, dass sie die richtige Variablengruppe für jede Umgebung auswählt, anstatt Vorlagenparameter zu verwenden.
- Aktualisieren Sie Ihre Bicep-Datei, um die Einstellungen zu übergeben, die Sie für die Produktüberprüfungs-API benötigen.
- Aktualisieren Sie die Variablengruppe und die Pipeline, um die Werte für die Einstellungen der Produktüberprüfungs-API festzulegen.
- Überprüfen Sie die Pipelineergebnisse und die Änderungen an Ihrer Azure-Umgebung.
Hinzufügen von Variablengruppen
Da Sie weitere Parameter hinzufügen, die je nach Umgebung variieren, entscheiden Sie sich, ihre Pipelineparameter nicht mehr direkt zu Ihren YAML-Pipelinedateien hinzuzufügen. Stattdessen verwenden Sie eine Variablengruppe, um die Werte für jede Umgebung zusammenzuhalten.
Wechseln Sie in Ihrem Browser zu Pipelines>Bibliothek.
Wählen Sie die Schaltfläche + Variablengruppe aus.
Geben Sie als Namen für die Variablengruppe ToyWebsiteTest ein.
Wählen Sie die Schaltfläche + Hinzufügen aus, um der Variablengruppe Variablen hinzuzufügen. Erstellen Sie zwei Variablen mit den folgenden Einstellungen:
Name Wert EnvironmentType Test ResourceGroupName ToyWebsiteTest Beachten Sie, dass Sie den Dienstverbindungsnamen nicht in der Variablengruppe definieren. Es gibt spezielle Regeln dafür, wie Dienstverbindungsnamen angegeben werden können. In diesem Modul verwenden Sie Pipelinevorlagenparameter.
Wählen Sie Speichern aus.
Wählen Sie in Ihrem Browser die Schaltfläche Zurück aus, um zur Liste der Variablengruppen zurückzukehren.
Fügen Sie eine weitere Variablengruppe namens ToyWebsiteProduction hinzu. Erstellen Sie zwei Variablen mit den folgenden Einstellungen:
Name Wert EnvironmentType Bereitstellung ResourceGroupName ToyWebsiteProduction Beachten Sie, dass die Variablennamen für beide Umgebungen identisch sind, die Werte sich jedoch unterscheiden.
Speichern Sie die Produktionsvariablengruppe.
Aktualisieren der Bereitstellungspipelinevorlage für die Verwendung der Variablengruppe
Öffnen Sie in Visual Studio Code die Datei deploy.yml.
Entfernen Sie oben in der Datei die Parameter
resourceGroupName
undserviceConnectionName
. Löschen Sie die ParameterenvironmentType
unddeploymentDefaultLocation
nicht.parameters: - name: environmentType type: string - name: deploymentDefaultLocation type: string default: westus3
Aktualisieren Sie den Auftrag
ValidateBicepCode
, um die Variablengruppe zu importieren:- ${{ 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:
Aktualisieren Sie den Auftrag
ValidateBicepCode
so, dass der Dienstverbindungsname basierend auf dem Wert des ParametersenvironmentType
automatisch abgeleitet wird:- ${{ 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)
Aktualisieren Sie den Auftrag
ValidateBicepCode
, um die importierte Variablengruppe zum Festlegen des Ressourcengruppennamens und der Umgebungstypargumente für die Bereitstellungsaufgabe zu verwenden:- ${{ 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)
Nehmen Sie die Änderungen am Auftrag
PreviewAzureChanges
vor:- ${{ 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)
Nehmen Sie die gleichen Änderungen am Bereitstellungsauftrag
Deploy
vor:- 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
Vergewissern Sie sich, dass die Datei deploy.yml jetzt wie der folgende Code aussieht:
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'
Speichern Sie die geänderte Datei.
Aktualisieren der Pipelinedefinition, um die Parameterliste zu vereinfachen
Öffnen Sie die Datei azure-pipelines.yml.
Aktualisieren Sie die Phasen, die Vorlagen verwenden, um die Parameter
resourceGroupName
undserviceConnectionName
zu entfernen. Belassen Sie nur den ParameterenvironmentType
.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
Speichern Sie die geänderte Datei.
Committen Sie Ihre Änderungen mithilfe der folgenden Befehle in Ihr Git-Repository, ohne sie zu pushen:
git add . git commit -m "Use variable groups"
Update der Bicep-Datei
Öffnen Sie die Datei main.bicep.
Fügen Sie unter den Parametern, die sich bereits in der Datei befinden, die folgenden Parameter für die neue Überprüfungs-API hinzu:
@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
Aktualisieren Sie die Ressourcendefinition
appServiceApp
, um die URL und den Schlüssel der Überprüfungs-API für die Anwendung zur Verfügung zu stellen, damit sie vom Code Ihrer Website verwendet werden können: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 } ] } } }
Speichern Sie die geänderte Datei.
Aktualisieren der Variablengruppen
Wechseln Sie in Ihrem Browser zu Pipelines>Bibliothek, und öffnen Sie die ToyWebsiteTest-Variablengruppen.
Fügen Sie die folgenden Variablen hinzu:
Name Wert ReviewApiKey sandboxsecretkey ReviewApiUrl https://sandbox.contoso.com/reviews
Wählen Sie das Vorhängeschlosssymbol neben der Variablen ReviewApiKey aus. Dieser Schritt weist Azure Pipelines an, den Wert der Variablen sicher zu behandeln.
Speichern Sie die Variablengruppe.
Aktualisieren Sie die ToyWebsiteProduction-Variablengruppe, um einen ähnlichen Variablensatz hinzuzufügen:
Name Wert ReviewApiKey productionsecretkey ReviewApiUrl https://api.contoso.com/reviews
Denken Sie daran, das Vorhängeschlosssymbol neben der Variablen ReviewApiKey auszuwählen.
Speichern Sie die Variablengruppe.
Hinzufügen der Überprüfungs-API-Variablen zu den Variablengruppen
Öffnen Sie in Visual Studio Code die Datei deploy.yml.
Fügen Sie im Auftrag
ValidateBicepCode
die Parameterwerte der Überprüfungs-API zur Bereitstellungsaufgabe hinzu:- ${{ 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)
Nehmen Sie die gleiche Änderung am Auftrag
PreviewAzureChanges
vor:- ${{ 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)
Wichtig
Achten Sie darauf, den umgekehrten Schrägstrich (
\
) am Ende der Zeile, die denenvironmentType
-Parameterwert festlegt, und in der nachfolgenden Zeile hinzuzufügen. Das Zeichen\
gibt an, dass weitere Zeilen Teil desselben Azure CLI-Befehls sind.Nehmen Sie die gleiche Änderung am Auftrag
Deploy
vor:- 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
Vergewissern Sie sich, dass die Datei deploy.yml jetzt wie der folgende Code aussieht:
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'
Committen und pushen Sie die Änderungen mithilfe der folgenden Befehle in Ihr Git-Repository:
git add . git commit -m "Add new review API settings to Bicep file and pipeline" git push
Überprüfen der Bereitstellungsergebnisse
Wechseln Sie in Ihrem Browser zu Pipelines.
Wählen Sie die letzte Ausführung Ihrer Pipeline aus.
Warten Sie, bis die Pipeline vor der Phase Bereitstellen (Produktionsumgebung) angehalten wurde. Es kann einige Minuten dauern, bis die Pipeline diesen Punkt erreicht hat.
Wenn Sie aufgefordert werden, die Berechtigung zum Zugriff auf eine Ressource zu erteilen, wählen Sie Ansicht und dann Zulassen aus.
Genehmigen Sie die Bereitstellung in der Produktionsumgebung, indem Sie Überprüfen>Genehmigen auswählen.
Warten Sie, bis die Ausführung der Pipeline abgeschlossen ist.
Wählen Sie Pipelines>Umgebungen aus.
Wählen Sie die Umgebung Produktion aus.
Beachten Sie, dass nun mehrere Bereitstellungen im Verlauf der Umgebung zu sehen sind.
Navigieren Sie in Ihrem Browser zum Azure-Portal.
Wechseln Sie zur Ressourcengruppe ToyWebsiteProduction.
Öffnen Sie in der Liste der Ressourcen die Azure App Service-App.
Wählen Sie Konfiguration aus.
Wählen Sie Werte anzeigen aus.
Beachten Sie, dass die Werte der Produktionswebsite für die Einstellungen ReviewApiKey und ReviewApiUrl auf die Werte festgelegt sind, die Sie in der Produktionsvariablengruppe konfiguriert haben.
Vergleichen Sie die aktuellen Werte mit den Konfigurationseinstellungen für die App Service-App in der Ressourcengruppe ToyWebsiteTest. Beachten Sie, dass die Werte sich unterscheiden.
Bereinigen der Ressourcen
Nachdem Sie die Übung abgeschlossen haben, können Sie die Ressourcen entfernen, damit Ihnen dafür keine Gebühren berechnet werden.
Führen Sie im Visual Studio Code-Terminal die folgenden Befehle aus:
az group delete --resource-group ToyWebsiteTest --yes --no-wait
az group delete --resource-group ToyWebsiteProduction --yes --no-wait
Die Ressourcengruppe wird im Hintergrund gelöscht.
Remove-AzResourceGroup -Name ToyWebsiteTest -Force
Remove-AzResourceGroup -Name ToyWebsiteProduction -Force