Ejercicio: Uso de parámetros de Bicep con varios entornos
Ahora que la canalización se implementa en ambos entornos, está listo para integrar con la API de terceros para las revisiones de productos.
El equipo del sitio web le ha proporcionado las claves de API y las direcciones URL que el sitio web debe usar para acceder al servicio. Hay distintos valores para los entornos de prueba y producción que se van a usar. En esta unidad va a actualizar la canalización a fin de configurar cada uno de los entornos con la configuración correcta de la API de revisión de productos.
Durante el proceso, hará lo siguiente:
- Crear grupos de variables para cada uno de los entornos.
- Actualizar la canalización para que seleccione el grupo de variables correcto para cada entorno en lugar de usar parámetros de plantilla.
- Actualizar el archivo de Bicep para propagar la configuración que necesita de la API de revisión de productos.
- Actualizar el grupo de variables y la canalización para establecer los valores de la configuración de la API de revisión de productos.
- Revisar los resultados de la canalización y los cambios en el entorno de Azure.
Incorporación de grupos de variables
Dado que va a incorporar más parámetros que varían entre entornos, decide no agregar los parámetros de canalización directamente a los archivos YAML de canalización. En lugar de eso, va a usar un grupo de variables para mantener juntos los valores de cada entorno.
En el explorador, vaya a Canalizaciones>Biblioteca.
Seleccione el botón + Grupo de variables.
Escriba ToyWebsiteTest como nombre del grupo de variables.
Seleccione el botón + Agregar para agregar variables al grupo de variables. Cree dos variables con la siguiente configuración:
Nombre Value EnvironmentType Prueba ResourceGroupName ToyWebsiteTest Observe que no define el nombre de la conexión de servicio en el grupo de variables. Los nombres de las conexiones de servicio tienen reglas especiales sobre cómo se pueden especificar. En este módulo usará parámetros de plantilla de canalización.
Seleccione Guardar.
Seleccione el botón Atrás en el explorador para volver a la lista de grupos de variables.
Agregue otro grupo de variables de nombre ToyWebsiteProduction. Cree dos variables con la siguiente configuración:
Nombre Value EnvironmentType Producción ResourceGroupName ToyWebsiteProduction Observe que los nombres de las variables son los mismos en ambos entornos, pero los valores son diferentes.
Guarde el grupo de variables de producción.
Actualización de la plantilla de canalización de implementación para usar el grupo de variables
En Visual Studio Code, abra el archivo deploy.yml.
En la parte superior del archivo, elimine los parámetros
resourceGroupName
yserviceConnectionName
. No elimine los parámetrosenvironmentType
ydeploymentDefaultLocation
.parameters: - name: environmentType type: string - name: deploymentDefaultLocation type: string default: westus3
Actualice el trabajo
ValidateBicepCode
para importar el grupo 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:
Actualice el trabajo
ValidateBicepCode
para deducir automáticamente el nombre de la conexión de servicio en función del valor del parámetroenvironmentType
:- ${{ 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)
Actualice el trabajo
ValidateBicepCode
para usar el grupo de variables importado a fin de establecer el nombre del grupo de recursos y los argumentos de tipo de entorno para la tarea de implementación:- ${{ 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)
Guarde los cambios en el trabajo
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)
Realice los mismos cambios en el trabajo de implementación
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
Compruebe que el archivo deploy.yml ahora es similar al código siguiente:
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'
Guarde los cambios en el archivo.
Actualización de la definición de canalización para simplificar la lista de parámetros
Abra el archivo azure-pipelines.yml.
Actualice las fases que usan plantillas para eliminar los parámetros
resourceGroupName
yserviceConnectionName
. Deje solo el parámetroenvironmentType
.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
Guarde los cambios en el archivo.
Confirme los cambios en el repositorio de Git sin insertarlos mediante los siguientes comandos:
git add . git commit -m "Use variable groups"
Actualización del archivo de Bicep
Abra el archivo main.bicep.
Debajo de los parámetros que ya están en el archivo, agregue los parámetros siguientes para la nueva API de revisión:
@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
Actualice la definición de recurso
appServiceApp
para proporcionar la dirección URL y la clave de la API de revisión a la aplicación, de modo que el código del sitio web pueda usarlos: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 } ] } } }
Guarde los cambios en el archivo.
Actualización de los grupos de variables
En el explorador, vaya a Canalizaciones>Biblioteca y abra los grupos de variables ToyWebsiteTest.
Agregue las siguientes variables:
Nombre Value ReviewApiKey sandboxsecretkey ReviewApiUrl https://sandbox.contoso.com/reviews
Seleccione el icono de candado junto a la variable ReviewApiKey. Este paso indica a Azure Pipelines que trate el valor de la variable de forma segura.
Guarde el grupo de variables.
Actualice el grupo de variables ToyWebsiteProduction para agregar un conjunto similar de variables:
Nombre Value ReviewApiKey productionsecretkey ReviewApiUrl https://api.contoso.com/reviews
Acuérdese de seleccionar el icono de candado junto a la variable ReviewApiKey.
Guarde el grupo de variables.
Incorporación de las variables de la API de revisión a los grupos de variables
En Visual Studio Code, abra el archivo deploy.yml.
En el trabajo
ValidateBicepCode
, agregue los valores de parámetro de la API de revisión a la tarea de implementación:- ${{ 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)
Realice el mismo cambio en el trabajo
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
Asegúrese de agregar la barra diagonal inversa (
\
) al final de la línea que establece el valor de parámetroenvironmentType
, y en la línea siguiente. El carácter\
indica que hay más líneas que forman parte del mismo comando de la CLI de Azure.Realice el mismo cambio en el trabajo
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
Compruebe que el archivo deploy.yml ahora es similar al código siguiente:
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'
Confirme e inserte los cambios en el repositorio de Git mediante los siguientes comandos:
git add . git commit -m "Add new review API settings to Bicep file and pipeline" git push
Revisión de los resultados de la implementación
En el explorador, vaya a Canalizaciones.
Seleccione la ejecución más reciente de la canalización.
Espere a que la canalización se ponga en pausar antes de la fase Implementación (entorno de producción). La canalización puede tardar unos minutos en llegar a este punto.
Si se le pide que conceda permiso para acceder a un recurso, seleccione Ver y, a continuación, seleccione Permitir.
Apruebe la implementación en el entorno de producción; para ello, seleccione el botón Revisar>Aprobar.
Espere a que finalice la ejecución de la canalización.
Seleccione Canalizaciones>Entornos.
Seleccione el entorno Producción.
Observe que ahora se ven varias implementaciones en el historial del entorno.
En el explorador, vaya a Azure Portal.
Vaya al grupo de recursos ToyWebsiteProduction.
En la lista de recursos, abra la aplicación Azure App Service.
Seleccione Configuración.
Seleccione Mostrar valores.
Observe que los valores del sitio de producción para las opciones ReviewApiKey y ReviewApiUrl se establecen en los valores configurados en el grupo de variables de producción.
Compare los valores actuales con las opciones de configuración de la aplicación App Service en el grupo de recursos ToyWebsiteTest. Observe que los valores son diferentes.
Limpiar los recursos
Ahora que ha completado el ejercicio, puede quitar los recursos para que no se le facturen.
En el terminal de Visual Studio Code, ejecute los comandos siguientes:
az group delete --resource-group ToyWebsiteTest --yes --no-wait
az group delete --resource-group ToyWebsiteProduction --yes --no-wait
El grupo de recursos se elimina en segundo plano.
Remove-AzResourceGroup -Name ToyWebsiteTest -Force
Remove-AzResourceGroup -Name ToyWebsiteProduction -Force