Exercício - Use parâmetros do bíceps com vários ambientes
Agora que seu pipeline é implantado em ambos os ambientes, você está pronto para integrar com a API de terceiros para análises de produtos.
A equipe do seu site forneceu as chaves de API e URLs que seu site deve usar para acessar o serviço. Há valores diferentes para seus ambientes de teste e produção usarem. Nesta unidade, você atualizará seu pipeline para configurar cada um de seus ambientes com as configurações corretas para a API de revisão do produto.
Durante o processo, você:
- 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 seu arquivo Bicep para propagar as configurações necessárias para a API de revisão do produto.
- Atualize o grupo de variáveis e o pipeline para definir os valores para as configurações da API de revisão do produto.
- Analise os resultados do pipeline e as alterações no seu ambiente do Azure.
Adicionar grupos de variáveis
Como você está adicionando mais parâmetros que variam entre cada ambiente, você decide deixar de adicionar os parâmetros do pipeline diretamente aos arquivos YAML do pipeline. Em vez disso, você usará um grupo de variáveis para manter os valores de cada ambiente juntos.
No navegador, vá para Biblioteca de Pipelines>.
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 Tipo de Ambiente 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 podem ser especificados. Neste módulo, você usa parâmetros de modelo de pipeline.
Selecione Guardar.
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 Tipo de Ambiente Produção ResourceGroupName ToyWebsiteProdução 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
resourceGroupName
parâmetros eserviceConnectionName
. Não exclua osenvironmentType
parâmetros oudeploymentDefaultLocation
.parameters: - name: environmentType type: string - name: deploymentDefaultLocation type: string default: westus3
Atualize o
ValidateBicepCode
trabalho 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
ValidateBicepCode
trabalho para inferir automaticamente o nome da conexão de serviço com base no valor doenvironmentType
parâmetro:- ${{ 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
ValidateBicepCode
trabalho para usar o grupo de variáveis importado para 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 no
PreviewAzureChanges
trabalho:- ${{ 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 no trabalho de
Deploy
implantação:- 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'
Guarde as alterações ao ficheiro.
Atualizar a definição de pipeline para simplificar a lista de parâmetros
Abra o ficheiro azure-pipelines.yml.
Atualize os estágios que usam modelos para remover os
resourceGroupName
parâmetros eserviceConnectionName
. Deixe apenas oenvironmentType
parâmetro.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 as alterações ao ficheiro.
Confirme suas alterações no repositório Git sem enviá-las usando os seguintes 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 para a 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
appServiceApp
recurso para fornecer a URL da API de revisão e a chave para o aplicativo, para que o código do seu site possa usá-los: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 as alterações ao ficheiro.
Atualizar os grupos de variáveis
No navegador, vá para Biblioteca de Pipelines e abra os grupos de> variáveis ToyWebsiteTest.
Adicione as seguintes variáveis:
Nome Valor RevisãoApiKey sandboxsecretkey RevisãoApiUrl https://sandbox.contoso.com/reviews
Selecione o ícone de cadeado ao lado da variável ReviewApiKey . Esta etapa informa ao Azure Pipelines para 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 RevisãoApiKey produçãosecretkey RevisãoApiUrl https://api.contoso.com/reviews
Lembre-se de selecionar o ícone de cadeado ao lado da variável ReviewApiKey .
Salve o grupo de variáveis.
Adicionar as variáveis da API de revisão aos grupos de variáveis
No Visual Studio Code, abra o arquivo deploy.yml .
ValidateBicepCode
No trabalho, adicione os valores dos parâmetros de revisão da API à 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 no
PreviewAzureChanges
trabalho:- ${{ 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
Certifique-se de adicionar a barra invertida (
\
) no final da linha que define o valor doenvironmentType
parâmetro 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 no
Deploy
trabalho:- 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'
Confirme e envie 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
Revise os resultados da implantação
No seu navegador, vá para Pipelines.
Selecione a execução mais recente do seu pipeline.
Aguarde a pausa do pipeline antes do estágio Implantar (Ambiente de Produção ). Pode levar alguns minutos para que o gasoduto chegue a este ponto.
Se lhe for pedido para conceder permissão para aceder a um recurso, selecione Ver e, em seguida, selecione Permitir.
Aprove a implantação no ambiente de produção selecionando Revisar>Aprovar.
Aguarde até que o pipeline termine a execução.
Selecione Ambientes de pipelines>.
Selecione o Ambiente de produção .
Observe que agora você vê várias implantações no histórico do ambiente.
No browser, aceda ao 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 para os valores que você configurou no grupo de variáveis de produção.
Compare os valores atuais com as definições de configuração do aplicativo Serviço de Aplicativo no grupo de recursos ToyWebsiteTest . Observe que os valores são diferentes.
Limpar os recursos
Agora que concluiu o exercício, pode remover os recursos para não ser cobrado por eles.
No terminal de código do Visual Studio, 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