Exercice – Utiliser des paramètres Bicep avec plusieurs environnements
Maintenant que votre pipeline est déployé dans vos deux environnements, vous êtes prêt à l’intégrer à l’API tierce pour les révisions de produits.
Votre équipe de site web vous a fourni les clés d’API et les URL que votre site web doit utiliser pour accéder au service. Vous pouvez utiliser différentes valeurs pour vos environnements de test et de production. Dans cette unité, vous allez mettre à jour votre pipeline pour configurer chacun de vos environnements avec les paramètres appropriés pour l’API de révision de produit.
Pendant ce processus, vous allez :
- Créer des groupes de variables pour chacun de vos environnements.
- Mettre à jour le pipeline pour qu’il sélectionne le groupe de variables correct pour chaque environnement au lieu d’utiliser des paramètres de modèle.
- Mettre à jour votre fichier Bicep pour propager les paramètres dont vous avez besoin pour l’API de révision de produit.
- Mettre à jour le groupe de variables et le pipeline pour définir les valeurs des paramètres de l’API de révision de produit.
- Passer en revue les résultats du pipeline et les modifications apportées à votre environnement Azure.
Ajouter des groupes de variables
Étant donné que vous ajoutez des paramètres qui varient d’un environnement à l’autre, vous décidez de ne pas ajouter vos paramètres de pipeline directement dans vos fichiers YAML de pipeline. Au lieu de cela, vous utiliserez un groupe de variables pour conserver ensemble les valeurs des différents environnements.
Dans votre navigateur, accédez à Pipelines>Bibliothèque.
Sélectionnez le bouton + Groupe de variables.
Entrez ToyWebsiteTest comme nom du groupe de variables.
Sélectionnez le bouton + Ajouter pour ajouter des variables au groupe de variables. Créez deux variables avec les paramètres suivants :
Nom Valeur EnvironmentType Test ResourceGroupName ToyWebsiteTest Notez que vous ne définissez pas le nom de la connexion de service dans le groupe de variables. Des règles spéciales s’appliquent à la façon de spécifier les noms des connexions de service. Dans ce module, vous utilisez des paramètres de modèle de pipeline.
Sélectionnez Enregistrer.
Sélectionnez le bouton Précédent de votre navigateur pour revenir à la liste des groupes de variables.
Ajoutez un autre groupe de variables nommé ToyWebsiteProduction. Créez deux variables avec les paramètres suivants :
Nom Valeur EnvironmentType Production ResourceGroupName ToyWebsiteProduction Notez que les noms des variables sont les mêmes pour les deux environnements, mais que les valeurs sont différentes.
Enregistrez le groupe de variables de production.
Mettre à jour le modèle de pipeline de déploiement pour utiliser le groupe de variables
Dans Visual Studio Code, ouvrez le fichier deploy.yml.
En haut du fichier, supprimez les paramètres
resourceGroupName
etserviceConnectionName
. Ne supprimez pas les paramètresenvironmentType
oudeploymentDefaultLocation
.parameters: - name: environmentType type: string - name: deploymentDefaultLocation type: string default: westus3
Mettez à jour le travail
ValidateBicepCode
pour importer le groupe de variables :- ${{ 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:
Mettez à jour le travail
ValidateBicepCode
pour déduire automatiquement le nom de la connexion de service en fonction de la valeur du paramètreenvironmentType
:- ${{ 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)
Mettez à jour le travail
ValidateBicepCode
pour utiliser le groupe de variables importé pour définir le nom du groupe de ressources et les arguments de type d’environnement pour la tâche de déploiement :- ${{ 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)
Apportez les modifications au travail
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)
Apportez les mêmes modifications au travail de déploiement
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
Vérifiez que votre fichier deploy.yml se présente maintenant comme le code suivant :
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'
Enregistrez les modifications apportées au fichier.
Mettre à jour la définition de pipeline pour simplifier la liste des paramètres
Ouvrez le fichier azure-pipelines.yml.
Mettez à jour les phases qui utilisent des modèles pour supprimer les paramètres
resourceGroupName
etserviceConnectionName
. Laissez uniquement le paramètreenvironmentType
.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
Enregistrez les modifications apportées au fichier.
Validez vos modifications dans votre dépôt Git sans les envoyer (push) à l’aide des commandes suivantes :
git add . git commit -m "Use variable groups"
Mettre à jour le fichier Bicep
Ouvrez le fichier main.bicep.
Sous les paramètres déjà présents dans le fichier, ajoutez les paramètres suivants pour la nouvelle API d’évaluation :
@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
Mettez à jour la définition de ressource
appServiceApp
pour fournir l’URL et la clé de l’API d’évaluation à l’application, afin que le code de votre site web puisse les utiliser :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 } ] } } }
Enregistrez les modifications apportées au fichier.
Mettre à jour les groupes de variables
Dans votre navigateur, accédez à Pipelines>Bibliothèque et ouvrez les groupes de variables ToyWebsiteTest.
Ajoutez les variables suivantes :
Nom Valeur ReviewApiKey sandboxsecretkey ReviewApiUrl https://sandbox.contoso.com/reviews
Sélectionnez l’icône de cadenas en regard de la variable ReviewApiKey. Cette étape indique à Azure Pipelines de traiter la valeur de la variable de façon sécurisée.
Enregistrez le groupe de variables.
Mettez à jour le groupe de variables ToyWebsiteProduction pour ajouter un ensemble similaire de variables :
Nom Valeur ReviewApiKey productionsecretkey ReviewApiUrl https://api.contoso.com/reviews
N’oubliez pas de sélectionner l’icône de cadenas en regard de la variable ReviewApiKey.
Enregistrez le groupe de variables.
Ajouter les variables de l’API de révision aux groupes de variables
Dans Visual Studio Code, ouvrez le fichier deploy.yml.
Dans le travail
ValidateBicepCode
, ajoutez les valeurs des paramètres de l’API de révision à la tâche de déploiement :- ${{ 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)
Apportez la même modification au travail
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)
Important
Veillez à ajouter une barre oblique inverse (
\
) à la fin de la ligne qui définit la valeur du paramètreenvironmentType
, et à la ligne suivante. Le caractère\
indique que les lignes qui suivent font partie de la même commande Azure CLI.Apportez la même modification au travail
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
Vérifiez que votre fichier deploy.yml se présente maintenant comme le code suivant :
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'
Validez et envoyez (push) vos modifications à votre dépôt Git à l’aide des commandes suivantes :
git add . git commit -m "Add new review API settings to Bicep file and pipeline" git push
Passer en revue les résultats de déploiement
Dans votre navigateur, accédez à Pipelines.
Sélectionnez l’exécution la plus récente de votre pipeline.
Attendez que le pipeline s’interrompe avant la phase Déployer (environnement de production). Le pipeline peut mettre quelques minutes pour atteindre ce point.
Si vous êtes invité à accorder l’autorisation d’accéder à une ressource, sélectionnez Afficher, puis Autoriser.
Approuvez le déploiement dans l’environnement de production en sélectionnant Réviser>Approuver.
Attendez la fin de l’exécution du pipeline.
Sélectionnez Pipelines>Environnements.
Sélectionnez l’environnement Production.
Notez que vous voyez maintenant plusieurs déploiements dans l’historique de l’environnement.
Dans votre navigateur, accédez au Portail Azure.
Accédez au groupe de ressources ToyWebsiteProduction.
Dans la liste des ressources, ouvrez l’application Azure App Service.
Sélectionnez Configuration.
Sélectionnez Afficher les valeurs.
Notez que les valeurs du site de production pour les paramètres ReviewApiKey et ReviewApiUrl sont définies sur les valeurs que vous avez configurées dans le groupe de variables de production.
Comparez les valeurs actuelles aux paramètres de configuration de l’application App Service dans le groupe de ressources ToyWebsiteTest. Notez que les valeurs sont différentes.
Nettoyer les ressources
Maintenant que vous avez terminé l’exercice, vous pouvez supprimer les ressources afin de ne pas avoir à payer pour.
Dans le terminal Visual Studio Code, exécutez les commandes suivantes :
az group delete --resource-group ToyWebsiteTest --yes --no-wait
az group delete --resource-group ToyWebsiteProduction --yes --no-wait
Le groupe de ressources est supprimé en arrière-plan.
Remove-AzResourceGroup -Name ToyWebsiteTest -Force
Remove-AzResourceGroup -Name ToyWebsiteProduction -Force