Exercício – Usar parâmetros Bicep com vários ambientes
Agora que seu pipeline é implantado em ambos os ambientes, você está pronto para integrar-se à API de terceiros para revisões de produtos.
Sua equipe de site forneceu as chaves de API e as URLs que seu site deve usar para acessar o serviço. Há valores diferentes para os ambientes de teste e de produção usarem. Nesta unidade, você vai atualizar seu pipeline para configurar cada um dos ambientes com as configurações corretas para a API de análise de produto.
Durante o processo, você vai:
- Crie grupos de variáveis para cada um dos seus ambientes.
- Atualize o pipeline para que ele escolha o grupo de variáveis correto para cada ambiente, em vez de usar parâmetros de modelo.
- Atualize o arquivo Bicep para propagar as configurações de que você precisa para a API de análise de produto.
- Atualize o grupo de variáveis e o pipeline para definir os valores para as configurações da API de análise do produto.
- Examine os resultados do pipeline e as alterações no ambiente do Azure.
Adicionar grupos de variáveis
Como você está adicionando mais parâmetros que variam entre cada ambiente, decide deixar de adicionar seus parâmetros de pipeline diretamente aos arquivos YAML do pipeline. Em vez disso, você vai usar um grupo de variáveis para manter os valores de cada ambiente juntos.
No navegador, acesse Pipelines>Biblioteca.
Selecione o botão + Grupo de variáveis.
Insira ToyWebsiteTest como o nome do grupo de variáveis.
Selecione o botão +Adicionar para adicionar variáveis ao grupo de variáveis. Crie duas variáveis com as seguintes configurações:
Nome Valor EnvironmentType Teste ResourceGroupName ToyWebsiteTest Observe que você não define o nome da conexão de serviço no grupo de variáveis. Os nomes de conexão de serviço têm regras especiais sobre como eles podem ser especificados. Neste módulo, você usa parâmetros de modelo de pipeline.
Selecione Salvar.
Selecione o botão Voltar no navegador para retornar à lista de grupos de variáveis.
Adicione outro grupo de variáveis chamado ToyWebsiteProduction. Crie duas variáveis com as seguintes configurações:
Nome Valor EnvironmentType Produção ResourceGroupName ToyWebsiteProduction Observe que os nomes das variáveis são os mesmos para ambos os ambientes, mas os valores são diferentes.
Salve o grupo de variáveis de produção.
Atualizar o modelo de pipeline de implantação para usar o grupo de variáveis
No Visual Studio Code, abra o arquivo deploy.yml.
Na parte superior do arquivo, remova os parâmetros
resourceGroupName
eserviceConnectionName
. Não exclua os parâmetrosenvironmentType
oudeploymentDefaultLocation
.parameters: - name: environmentType type: string - name: deploymentDefaultLocation type: string default: westus3
Atualize o trabalho
ValidateBicepCode
para importar o grupo de variáveis:- ${{ 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:
Atualize o trabalho
ValidateBicepCode
para inferir automaticamente o nome da conexão de serviço com base no valor do 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)
Atualize o trabalho
ValidateBicepCode
para usar o grupo de variáveis importado a fim de definir o nome do grupo de recursos e os argumentos de tipo de ambiente para a tarefa de implantação:- ${{ 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)
Faça as alterações ao trabalho
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)
Faça as mesmas alterações ao trabalho de implantação
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
Verifique se o arquivo deploy.yml agora se parece com o seguinte código:
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'
Salve as alterações no arquivo.
Atualizar a definição de pipeline para simplificar a lista de parâmetros
Abra o arquivo azure-pipelines.yml.
Atualize os estágios que usam modelos para remover os parâmetros
resourceGroupName
eserviceConnectionName
. Deixe apenas o 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
Salve as alterações no arquivo.
Faça o commit de suas alterações no repositório Git sem enviá-las por push usando os seguinte comandos:
git add . git commit -m "Use variable groups"
Atualizar o arquivo Bicep
Abra o arquivo main.bicep.
Abaixo dos parâmetros que já estão no arquivo, adicione os seguintes parâmetros à nova API de revisão:
@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
Atualize a definição de recurso
appServiceApp
para fornecer a URL da API de revisão e a chave para o aplicativo para que o código do site possa usá-las: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 } ] } } }
Salve as alterações no arquivo.
Atualizar os grupos de variáveis
No navegador, vá para Pipelines>Biblioteca e abra os grupos de variáveis ToyWebsiteTest.
Adicione as seguintes variáveis:
Nome Valor ReviewApiKey sandboxsecretkey ReviewApiUrl https://sandbox.contoso.com/reviews
Selecione o ícone de cadeado ao lado da variável ReviewApiKey. Esta etapa diz para o Azure Pipelines tratar o valor da variável com segurança.
Salve o grupo de variáveis.
Atualize o grupo de variáveis ToyWebsiteProduction para adicionar um conjunto semelhante de variáveis:
Nome Valor ReviewApiKey productionsecretkey ReviewApiUrl https://api.contoso.com/reviews
Selecione o ícone de cadeado ao lado da variável ReviewApiKey.
Salve o grupo de variáveis.
Adicionar as variáveis de API de revisão aos grupos de variáveis
No Visual Studio Code, abra o arquivo deploy.yml.
No trabalho
ValidateBicepCode
, adicione os valores de parâmetro de API de revisão à tarefa de implantação:- ${{ 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)
Faça a mesma alteração ao trabalho
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
Adicione a barra invertida (
\
) ao final da linha que define o valor do parâmetroenvironmentType
e na linha subsequente. O caractere\
indica que outras linhas fazem parte do mesmo comando da CLI do Azure.Faça a mesma alteração ao trabalho
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
Verifique se o arquivo deploy.yml agora se parece com o seguinte código:
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'
Faça o commit e o push de suas alterações para o repositório Git usando os seguintes comandos:
git add . git commit -m "Add new review API settings to Bicep file and pipeline" git push
Examinar os resultados da implantação
No navegador, acesse Pipelines.
Selecione a execução mais recente do pipeline.
Aguarde até que o pipeline pause antes da fase Implantar (Ambiente de Produção). Pode levar alguns minutos para o pipeline chegar a esse ponto.
Se precisar conceder permissão para acessar um recurso, selecione Exibir e Permitir.
Aprove a implantação para o ambiente de produção selecionando Examinar>Aprovar.
Aguarde até que o pipeline termine a execução.
Selecione Pipelines>Ambientes.
Selecione o ambiente de Produção.
Observe que agora você vê várias implantações no histórico do ambiente.
No navegador, acesse o portal do Azure.
Vá para o grupo de recursos ToyWebsiteProduction.
Na lista de recursos, abra o aplicativo Serviço de Aplicativo do Azure.
Selecione Configuração.
Selecione Mostrar valores.
Observe que os valores do site de produção para as configurações ReviewApiKey e ReviewApiUrl são definidos com os valores configurados no grupo de variáveis de produção.
Compare os valores atuais com as definições de configuração do aplicativo do Serviço de Aplicativo no grupo de recursos ToyWebsiteTest. Observe que os valores são diferentes.
Limpar os recursos
Agora que você concluiu o exercício, remova os recursos para não ser cobrado por eles.
No terminal do Visual Studio Code, execute os seguintes comandos:
az group delete --resource-group ToyWebsiteTest --yes --no-wait
az group delete --resource-group ToyWebsiteProduction --yes --no-wait
O grupo de recursos é excluído em segundo plano.
Remove-AzResourceGroup -Name ToyWebsiteTest -Force
Remove-AzResourceGroup -Name ToyWebsiteProduction -Force