Esercizio - Usare parametri Bicep con più ambienti
Ora che la pipeline viene distribuita in entrambi gli ambienti, è possibile eseguire l'integrazione con l'API di terze parti per le revisioni dei prodotti.
Il team del sito Web ha fornito le chiavi API e gli URL che il sito Web deve usare per accedere al servizio. Esistono valori diversi per gli ambienti di test e produzione da usare. In questa unità si aggiornerà la pipeline per configurare ognuno degli ambienti con le impostazioni corrette per l'API di revisione del prodotto.
Durante il processo, si eseguiranno queste operazioni:
- Creare gruppi di variabili per ognuno degli ambienti.
- Aggiornare la pipeline in modo che selezioni il gruppo di variabili corretto per ogni ambiente, anziché usare i parametri del modello.
- Aggiornare il file Bicep per propagare le impostazioni necessarie per l'API di revisione del prodotto.
- Aggiornare il gruppo di variabili e la pipeline per impostare i valori per le impostazioni dell'API di revisione del prodotto.
- Esaminare i risultati della pipeline e le modifiche apportate all'ambiente di Azure.
Aggiungere gruppi di variabili
Se si aggiungono più parametri che variano da un ambiente all'altro è consigliabile non aggiungerli direttamente nei file YAML della pipeline, ma usare un gruppo di variabili per tenere insieme i valori per ogni ambiente.
Nel browser passare a Pipeline>Libreria.
Selezionare il pulsante + Gruppo di variabili.
Immettere ToyWebsiteTest come nome del gruppo di variabili.
Selezionare il pulsante + Aggiungi per aggiungere le variabili al relativo gruppo. Creare due variabili con le impostazioni seguenti:
Nome Valore EnvironmentType Test ResourceGroupName ToyWebsiteTest Il nome della connessione del servizio non viene specificato nel gruppo di variabili, dal momento che esistono regole speciali sul modo in cui è possibile specificare tali nomi. In questo modulo si usano i parametri del modello della pipeline.
Seleziona Salva.
Nel browser selezionare il pulsante Indietro per tornare all'elenco dei gruppi di variabili.
Aggiungere un altro gruppo di variabili denominato ToyWebsiteProduction. Creare due variabili con le impostazioni seguenti:
Nome Valore EnvironmentType Produzione ResourceGroupName ToyWebsiteProduction Notare che i nomi delle variabili sono gli stessi per entrambi gli ambienti, ma i valori sono diversi.
Salvare il gruppo di variabili di produzione.
Aggiornare il modello della pipeline di distribuzione per usare il gruppo di variabili
In Visual Studio Code aprire il file deploy.yml.
Nella parte superiore del file rimuovere i parametri
resourceGroupName
eserviceConnectionName
. Non eliminare i parametrienvironmentType
odeploymentDefaultLocation
.parameters: - name: environmentType type: string - name: deploymentDefaultLocation type: string default: westus3
Aggiornare il processo
ValidateBicepCode
per importare il gruppo di variabili:- ${{ 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:
Aggiornare il processo
ValidateBicepCode
per dedurre automaticamente il nome della connessione del servizio in base al valore del parametroenvironmentType
:- ${{ 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)
Aggiornare il processo
ValidateBicepCode
in modo da usare il gruppo di variabili importato per impostare il nome del gruppo di risorse e gli argomenti tipo di ambiente per l'attività di distribuzione:- ${{ 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)
Apportare le modifiche al processo
PreviewAzureChanges
:- ${{ 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)
Apportare le stesse modifiche al processo di distribuzione
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
Verificare che il file deploy.yml ora sia simile al codice seguente:
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'
Salvare le modifiche apportate al file .
Aggiornare la definizione della pipeline per semplificare l'elenco di parametri
Aprire il file azure-pipelines.yml.
Aggiornare le fasi che usano i modelli per rimuovere i parametri
resourceGroupName
eserviceConnectionName
. Lasciare solo il parametroenvironmentType
.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
Salvare le modifiche apportate al file .
Eseguire il commit delle modifiche nel repository Git senza eseguirne il push usando i comandi seguenti:
git add . git commit -m "Use variable groups"
Aggiornare il file Bicep
Aprire il file main.bicep.
Sotto i parametri già presenti nel file, aggiungere i parametri seguenti per la nuova API di revisione:
@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
Aggiornare la definizione della risorsa
appServiceApp
per fornire l'URL dell'API di revisione e la chiave all'applicazione, in modo che il codice del sito Web possa usarli: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 } ] } } }
Salvare le modifiche apportate al file .
Aggiornare il gruppo di variabili
Nel browser passare a Pipeline>Libreria e aprire i gruppi di variabili ToyWebsiteTest.
Aggiungere le variabili seguenti:
Nome Valore ReviewApiKey sandboxsecretkey ReviewApiUrl https://sandbox.contoso.com/reviews
Selezionare l'icona a forma di lucchetto accanto alla variabile ReviewApiKey. Con questo passaggio si indica ad Azure Pipelines di gestire in modo sicuro il valore della variabile.
Salvare il gruppo di variabili.
Aggiornare il gruppo di variabili ToyWebsiteProduction per aggiungere un set di variabili simile:
Nome Valore ReviewApiKey productionsecretkey ReviewApiUrl https://api.contoso.com/reviews
Ricordarsi di selezionare l'icona a forma di lucchetto accanto alla variabile ReviewApiKey.
Salvare il gruppo di variabili.
Aggiungere le variabili dell'API di revisione ai gruppi di variabili
In Visual Studio Code aprire il file deploy.yml.
Nel processo
ValidateBicepCode
aggiungere i valori dei parametri dell'API di revisione all'attività di distribuzione:- ${{ 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)
Apportare la stessa modifica al processo
PreviewAzureChanges
:- ${{ 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)
Importante
Assicurarsi di aggiungere la barra rovesciata (
\
) alla fine della riga che imposta il valore del parametroenvironmentType
e sulla riga successiva. Il carattere\
indica che altre righe fanno parte dello stesso comando dell'interfaccia della riga di comando di Azure.Apportare la stessa modifica al processo
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) -reviewApiUrl $(ReviewApiUrl) -reviewApiKey $(ReviewApiKey) deploymentOutputs: deploymentOutputs
Verificare che il file deploy.yml ora sia simile al codice seguente:
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'
Eseguire il commit e il push delle modifiche nel repository Git usando i comandi seguenti:
git add . git commit -m "Add new review API settings to Bicep file and pipeline" git push
Revisionare i risultati della distribuzione
Nel browser passare a Pipeline.
Selezionare l'esecuzione più recente della pipeline.
Attendere la sospensione della pipeline prima di procedere con la fase Distribuzione (ambiente di produzione). Potrebbero essere necessari alcuni minuti prima che la pipeline raggiunga questo punto.
Se viene richiesto di concedere l'autorizzazione per accedere a una risorsa, selezionare Visualizza e quindi selezionare Consenti.
Approvare la distribuzione nell'ambiente di produzione selezionando il pulsante Esamina>Approva.
Attendere il completamento dell'esecuzione della pipeline.
Selezionare Pipeline>Ambienti.
Selezionare l'ambiente Produzione.
Si noti che ora vengono visualizzate più distribuzioni nella cronologia dell'ambiente.
Nel browser passare al portale di Azure.
Passare al gruppo di risorse ToyWebsiteProduction.
Nell'elenco delle risorse aprire l'app Servizio app di Azure.
Seleziona Configurazione.
Selezionare Show values (Mostra valori).
Si noti che i valori del sito di produzione per le impostazioni ReviewApiKey e ReviewApiUrl sono impostati sui valori configurati nel gruppo di variabili di produzione.
Confrontare i valori correnti con le impostazioni di configurazione per l'app Servizio app nel gruppo di risorse ToyWebsiteTest. Si noti che i valori sono diversi.
Pulire le risorse
Ora che l'esercizio è stato completato, è possibile rimuovere le risorse per evitare che vengano fatturate.
Nel terminale di Visual Studio Code eseguire i comandi seguenti:
az group delete --resource-group ToyWebsiteTest --yes --no-wait
az group delete --resource-group ToyWebsiteProduction --yes --no-wait
Il gruppo di risorse viene eliminato in background.
Remove-AzResourceGroup -Name ToyWebsiteTest -Force
Remove-AzResourceGroup -Name ToyWebsiteProduction -Force