Упражнение. Использование параметров Bicep в нескольких средах
Теперь, когда конвейер настроен для развертывания в обеих средах, можно приступать к интеграции со сторонним интерфейсом API отзывов о товарах.
Ответственная за веб-сайт команда предоставила вам ключи API и URL-адреса, которые веб-сайт должен использовать для доступа к службе. Для тестовой и рабочей сред используются разные значения. В этом уроке вы измените конвейер, чтобы настроить для каждой из сред правильные параметры для интерфейса API отзывов о товарах.
В процессе вы:
- Создадите группы переменных для каждой среды.
- Измените конвейер таким образом, чтобы он выбирал соответствующую группу переменных для каждой среды вместо использования параметров шаблона.
- Измените файл Bicep для распространения параметров, необходимых для интерфейса API отзывов о товарах.
- Измените группу переменных и конвейер, задав значения для параметров интерфейса API отзывов о товарах.
- Проверите результаты работы конвейера и изменения в среде Azure.
Добавление групп переменных
Так как вы добавляете дополнительные параметры, которые различаются для разных сред, вы решаете отказаться от добавления параметров конвейера непосредственно в YAML-файлы конвейера. Вместо этого вы используете группу переменных для совместного хранения значений для каждой среды.
В браузере перейдите на страницу Pipelines>Библиотека.
Нажмите кнопку + Группа переменных.
В качестве имени группы переменных введите ToyWebsiteTest.
Нажмите кнопку + Добавить, чтобы добавить переменные в группу переменных. Создайте две переменные:
Имя. Значение EnvironmentType Тест ResourceGroupName ToyWebsiteTest Обратите внимание, что имя подключения к службе не определено в группе переменных. Существуют специальные правила в отношении имен подключений к службам. В этом модуле используются параметры шаблона конвейера.
Выберите Сохранить.
Нажмите в браузере кнопку Назад, чтобы вернуться к списку групп переменных.
Добавьте еще одну группу переменных с именем ToyWebsiteProduction. Создайте две переменные:
Имя. Значение EnvironmentType Производственный экземпляр ResourceGroupName ToyWebsiteProduction Обратите внимание, что имена переменных одинаковы для обеих сред, но значения различны.
Сохраните рабочую группу переменных.
Изменение шаблона конвейера развертывания для использования группы переменных
В Visual Studio Code откройте файл deploy.yml.
В начале файла удалите параметры
resourceGroupName
иserviceConnectionName
. Не удаляйте параметрыenvironmentType
иdeploymentDefaultLocation
.parameters: - name: environmentType type: string - name: deploymentDefaultLocation type: string default: westus3
Измените задание
ValidateBicepCode
, чтобы импортировать группу переменных:- ${{ 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:
Измените задание
ValidateBicepCode
, чтобы имя подключения к службе определялось автоматически на основе значения параметраenvironmentType
:- ${{ 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)
Измените задание
ValidateBicepCode
так, чтобы использовать импортированную группу переменных для настройки имени группы ресурсов и аргументов типа среды для задачи развертывания:- ${{ 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)
Внесите изменения в задание
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)
Внесите те же изменения в задание развертывания
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
Убедитесь в том, что файл deploy.yml теперь выглядит следующим образом:
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'
Сохраните внесенные в файл изменения.
Изменение определения конвейера для упрощения списка параметров
Откройте файл azure-pipelines.yml.
Измените этапы, для которых используются шаблоны, удалив параметры
resourceGroupName
иserviceConnectionName
. Оставьте только параметрenvironmentType
.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
Сохраните внесенные в файл изменения.
Зафиксируйте изменения в репозитории GIT, не отправляя их, с помощью следующих команд:
git add . git commit -m "Use variable groups"
Обновление файла Bicep
Откройте файл main.bicep.
Под уже имеющимися в файле параметрами добавьте следующие параметры для нового интерфейса API отзывов:
@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
Измените определение ресурса
appServiceApp
для предоставления приложению URL-адреса и ключа интерфейса API отзывов, чтобы код веб-сайта мог использовать их: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 } ] } } }
Сохраните внесенные в файл изменения.
Изменение групп переменных
В браузере перейдите на страницу Pipelines>Библиотека и откройте группы переменных ToyWebsiteTest.
Добавьте следующие переменные:
Имя. Значение ReviewApiKey sandboxsecretkey ReviewApiUrl https://sandbox.contoso.com/reviews
Щелкните значок замка рядом с переменной ReviewApiKey. Таким образом вы сообщаете Azure Pipelines, что значение переменной должно быть защищено.
Сохраните группу переменных.
Измените группу переменных ToyWebsiteProduction, добавив аналогичный набор переменных:
Имя. Значение ReviewApiKey productionsecretkey ReviewApiUrl https://api.contoso.com/reviews
Не забудьте щелкнуть значок замка рядом с переменной ReviewApiKey.
Сохраните группу переменных.
Добавление переменных для интерфейса API отзывов в группы переменных
В Visual Studio Code откройте файл deploy.yml.
В задании
ValidateBicepCode
добавьте значения параметров для интерфейса API отзывов в задачу развертывания:- ${{ 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)
Внесите то же изменение в задание
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)
Внимание
Не забудьте поставить обратную косую черту (
\
) в конце строки, в которой задается значение параметраenvironmentType
, и в следующей строке. Символ\
указывает, что последующие строки являются частью той же команды Azure CLI.Внесите то же изменение в задание
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
Убедитесь в том, что файл deploy.yml теперь выглядит следующим образом:
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'
Зафиксируйте и отправьте изменения в репозиторий GIT с помощью следующих команд:
git add . git commit -m "Add new review API settings to Bicep file and pipeline" git push
Проверка результатов развертывания
В браузере перейдите на страницу Pipelines.
Выберите последнее выполнение конвейера.
Дождитесь приостановки конвейера перед этапом Развертывание (рабочая среда). Для достижения этого момента может потребоваться несколько минут.
Если вам будет предложено предоставить разрешение на доступ к ресурсу, выберите Просмотр и щелкните Разрешить.
Утвердите развертывание в рабочей среде, нажав кнопку Проверка>Утвердить.
Подождите, пока конвейер завершит работу.
Выберите Pipelines>Среды.
Выберите среду Рабочая.
Обратите внимание, что теперь в журнале среды отображается несколько развертываний.
В браузере перейдите на портал Azure.
Перейдите к группе ресурсов ToyWebsiteProduction.
В списке ресурсов откройте приложение Службы приложений Azure.
Выберите Конфигурация.
Выберите Показать значения.
Обратите внимание, что для параметров ReviewApiKey и ReviewApiUrl рабочего сайта заданы значения, настроенные в группе переменных для рабочей среды.
Сравните текущие значения с параметрами конфигурации для приложения Службы приложений в группе ресурсов ToyWebsiteTest. Обратите внимание, что эти значения различаются.
Очистка ресурсов
Теперь, когда вы завершили упражнение, можно удалить ресурсы, чтобы не оплачивать их.
В окне терминала Visual Studio Code выполните следующие команды:
az group delete --resource-group ToyWebsiteTest --yes --no-wait
az group delete --resource-group ToyWebsiteProduction --yes --no-wait
Группа ресурсов удалится в фоновом режиме.
Remove-AzResourceGroup -Name ToyWebsiteTest -Force
Remove-AzResourceGroup -Name ToyWebsiteProduction -Force