Ćwiczenie — używanie parametrów Bicep z wieloma środowiskami
Teraz, gdy potok jest wdrażany w obu środowiskach, możesz przystąpić do integracji z interfejsem API innej firmy na potrzeby przeglądów produktów.
Twój zespół witryny internetowej udostępnił Ci klucze interfejsu API i adresy URL, których witryna internetowa powinna używać do uzyskiwania dostępu do usługi. Istnieją różne wartości używane w środowiskach testowych i produkcyjnych. W tej lekcji zaktualizujesz potok, aby skonfigurować poszczególne środowiska przy użyciu poprawnych ustawień interfejsu API przeglądu produktu.
Podczas tego procesu wykonasz następujące czynności:
- Utwórz grupy zmiennych dla każdego środowiska.
- Zaktualizuj potok, aby wybrać prawidłową grupę zmiennych dla każdego środowiska zamiast używać parametrów szablonu.
- Zaktualizuj plik Bicep, aby propagować ustawienia potrzebne dla interfejsu API przeglądu produktu.
- Zaktualizuj grupę zmiennych i potok, aby ustawić wartości ustawień interfejsu API przeglądu produktu.
- Przejrzyj wyniki potoku i zmiany w środowisku platformy Azure.
Dodawanie grup zmiennych
Ponieważ dodajesz więcej parametrów, które różnią się między poszczególnymi środowiskami, decydujesz się odejść od dodawania parametrów potoku bezpośrednio do plików YAML potoku. Zamiast tego użyjesz grupy zmiennych, aby zachować wartości dla każdego środowiska razem.
W przeglądarce przejdź do pozycji Biblioteka potoków>.
Wybierz przycisk + Grupa zmiennych.
Wprowadź wartość ToyWebsiteTest jako nazwę grupy zmiennych.
Wybierz przycisk + Dodaj, aby dodać zmienne do grupy zmiennych. Utwórz dwie zmienne z następującymi ustawieniami:
Nazwa/nazwisko Wartość Typ środowiska Test ResourceGroupName ToyWebsiteTest Zwróć uwagę, że nie definiujesz nazwy połączenia usługi w grupie zmiennych. Nazwy połączeń usługi mają specjalne reguły dotyczące sposobu ich określenia. W tym module użyjesz parametrów szablonu potoku.
Wybierz pozycję Zapisz.
Wybierz przycisk Wstecz w przeglądarce, aby powrócić do listy grup zmiennych.
Dodaj kolejną grupę zmiennych o nazwie ToyWebsiteProduction. Utwórz dwie zmienne z następującymi ustawieniami:
Nazwa/nazwisko Wartość Typ środowiska Produkcyjne ResourceGroupName ToyWebsiteProduction Zwróć uwagę, że nazwy zmiennych są takie same dla obu środowisk, ale wartości są różne.
Zapisz grupę zmiennych produkcyjnych.
Aktualizowanie szablonu potoku wdrażania w celu używania grupy zmiennych
W programie Visual Studio Code otwórz plik deploy.yml .
W górnej części pliku usuń
resourceGroupName
parametry iserviceConnectionName
. Nie usuwajenvironmentType
parametrów lubdeploymentDefaultLocation
.parameters: - name: environmentType type: string - name: deploymentDefaultLocation type: string default: westus3
Zaktualizuj zadanie,
ValidateBicepCode
aby zaimportować grupę zmiennych:- ${{ 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:
Zaktualizuj zadanie,
ValidateBicepCode
aby automatycznie wywnioskować nazwę połączenia usługi na podstawie wartości parametruenvironmentType
:- ${{ 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)
Zaktualizuj zadanie,
ValidateBicepCode
aby użyć zaimportowanej grupy zmiennych, aby ustawić nazwę grupy zasobów i argumenty typu środowiska dla zadania wdrożenia:- ${{ 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)
Wprowadź zmiany w zadaniu
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)
Wprowadź te same zmiany w
Deploy
zadaniu wdrażania:- 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
Sprawdź, czy plik deploy.yml wygląda teraz następująco:
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'
Zapisz zmiany w pliku.
Aktualizowanie definicji potoku w celu uproszczenia listy parametrów
Otwórz plik azure-pipelines.yml.
Zaktualizuj etapy, które używają szablonów, aby usunąć
resourceGroupName
parametry iserviceConnectionName
. Pozostaw tylkoenvironmentType
parametr .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
Zapisz zmiany w pliku.
Zatwierdź zmiany w repozytorium Git bez wypychania ich przy użyciu następujących poleceń:
git add . git commit -m "Use variable groups"
Aktualizowanie pliku Bicep
Otwórz plik main.bicep.
Poniżej parametrów, które znajdują się już w pliku, dodaj następujące parametry dla nowego interfejsu API przeglądu:
@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
Zaktualizuj definicję
appServiceApp
zasobu, aby podać adres URL i klucz interfejsu API przeglądu aplikacji, aby kod witryny internetowej mógł ich używać: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 } ] } } }
Zapisz zmiany w pliku.
Aktualizowanie grup zmiennych
W przeglądarce przejdź do pozycji Biblioteka potoków>i otwórz grupy zmiennych ToyWebsiteTest.
Dodaj następujące zmienne:
Nazwa/nazwisko Wartość ReviewApiKey sandboxsecretkey ReviewApiUrl https://sandbox.contoso.com/reviews
Wybierz ikonę kłódki obok zmiennej ReviewApiKey . Ten krok informuje usługę Azure Pipelines o bezpiecznym traktowaniu wartości zmiennej.
Zapisz grupę zmiennych.
Zaktualizuj grupę zmiennych ToyWebsiteProduction , aby dodać podobny zestaw zmiennych:
Nazwa/nazwisko Wartość ReviewApiKey productionsecretkey ReviewApiUrl https://api.contoso.com/reviews
Pamiętaj, aby wybrać ikonę kłódki obok zmiennej ReviewApiKey .
Zapisz grupę zmiennych.
Dodawanie zmiennych interfejsu API przeglądu do grup zmiennych
W programie Visual Studio Code otwórz plik deploy.yml .
W zadaniu
ValidateBicepCode
dodaj wartości parametrów interfejsu API przeglądu do zadania wdrażania:- ${{ 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)
Wprowadź tę samą zmianę w
PreviewAzureChanges
zadaniu:- ${{ 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)
Ważne
Pamiętaj, aby dodać ukośnik odwrotny (
\
) na końcu wiersza, który ustawiaenvironmentType
wartość parametru i w kolejnym wierszu. Znak\
wskazuje, że dalsze wiersze są częścią tego samego polecenia interfejsu wiersza polecenia platformy Azure.Wprowadź tę samą zmianę w
Deploy
zadaniu:- 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
Sprawdź, czy plik deploy.yml wygląda teraz następująco:
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'
Zatwierdź i wypchnij zmiany do repozytorium Git przy użyciu następujących poleceń:
git add . git commit -m "Add new review API settings to Bicep file and pipeline" git push
Przeglądanie wyników wdrożenia
W przeglądarce przejdź do pozycji Potoki.
Wybierz najnowszy przebieg potoku.
Poczekaj na wstrzymanie potoku przed etapem Wdrażanie (środowisko produkcyjne). Osiągnięcie tego punktu przez potok może potrwać kilka minut.
Jeśli zostanie wyświetlony monit o udzielenie uprawnień dostępu do zasobu, wybierz pozycję Wyświetl , a następnie wybierz pozycję Zezwól.
Zatwierdź wdrożenie w środowisku produkcyjnym, wybierając pozycję Przejrzyj>zatwierdź.
Poczekaj na zakończenie działania potoku.
Wybierz pozycję Środowiska potoków>.
Wybierz środowisko produkcyjne.
Zauważ, że w historii środowiska jest teraz widocznych wiele wdrożeń.
W przeglądarce przejdź do witryny Azure Portal.
Przejdź do grupy zasobów ToyWebsiteProduction .
Na liście zasobów otwórz aplikację usługi aplikacja systemu Azure Service.
Wybierz pozycję Konfiguracja.
Wybierz pozycję Pokaż wartości.
Zwróć uwagę, że wartości lokacji produkcyjnej dla ustawień ReviewApiKey i ReviewApiUrl są ustawione na wartości skonfigurowane w grupie zmiennych produkcyjnych.
Porównaj bieżące wartości z ustawieniami konfiguracji aplikacji usługi App Service w grupie zasobów ToyWebsiteTest . Zwróć uwagę, że wartości są różne.
Oczyszczanie zasobów
Po ukończeniu ćwiczenia możesz usunąć zasoby, aby nie były naliczane opłaty.
W terminalu programu Visual Studio Code uruchom następujące polecenia:
az group delete --resource-group ToyWebsiteTest --yes --no-wait
az group delete --resource-group ToyWebsiteProduction --yes --no-wait
Grupa zasobów jest usuwana w tle.
Remove-AzResourceGroup -Name ToyWebsiteTest -Force
Remove-AzResourceGroup -Name ToyWebsiteProduction -Force