Cvičení – přidání více prostředí do kanálu
Teď jste připraveni aktualizovat kanál tak, aby se nasadil do testovacího i produkčního prostředí. V této lekci aktualizujete kanál tak, aby používal šablony, abyste mohli opakovaně používat fáze napříč prostředími.
Během tohoto procesu:
- Přidejte šablonu kanálu pro fázi lintu.
- Přidejte šablonu kanálu, která definuje fáze potřebné k nasazení do libovolného prostředí.
- Aktualizujte kanál tak, aby používal šablony.
- Spusťte kanál a prohlédněte si výsledky.
Přidání šablony kanálu pro fázi lintu
Fáze lint probíhá pouze jednou během spuštění kanálu bez ohledu na to, do jakého počtu prostředí se kanál nasadí. Takže ve skutečnosti nemusíte používat šablony pro fázi lint. Pokud ale chcete, aby byl hlavní definiční soubor kanálu jednoduchý a snadno čitelný, rozhodnete se definovat fázi lint v šabloně.
V editoru Visual Studio Code vytvořte novou složku s názvem pipeline-templates uvnitř složky deploy .
Ve složce šablon kanálů vytvořte nový soubor s názvem lint.yml.
Do souboru vložte následující definici šablony kanálu:
jobs: - job: LintCode displayName: Lint code steps: - script: | az bicep build --file deploy/main.bicep name: LintBicepCode displayName: Run Bicep linter
Fáze lint je stejná jako fáze lintu, která už v kanálu je, ale teď je v samostatném souboru šablony kanálu.
Uložte změny a zavřete soubor.
Přidání šablony kanálu pro nasazení
Vytvořte šablonu kanálu, která definuje všechny fáze potřebné k nasazení jednotlivých prostředí. Pomocí parametrů šablony můžete určit nastavení, která se mohou mezi prostředími lišit.
Ve složce šablon kanálů vytvořte nový soubor s názvem deploy.yml.
Tento soubor představuje všechny aktivity nasazení, které se spouští pro každé z vašich prostředí.
Do souboru vložte následující parametry šablony kanálu:
parameters: - name: environmentType type: string - name: resourceGroupName type: string - name: serviceConnectionName type: string - name: deploymentDefaultLocation type: string default: westus3
Poznámka:
Když začnete pracovat se souborem YAML v editoru Visual Studio Code, může se zobrazit několik červených vlnovek s informací, že došlo k problému. Důvodem je to, že přípona editoru Visual Studio Code pro soubory YAML někdy nesprávně odhadne schéma souboru.
Problémy, které rozšíření hlásí, můžete ignorovat. Nebo pokud chcete, můžete do horní části souboru přidat následující kód, který potlačí odhad přípony:
# yaml-language-server: $schema=./deploy.yml
Pod parametry vložte definici fáze ověření:
stages: - ${{ if ne(parameters.environmentType, 'Production') }}: - stage: Validate_${{parameters.environmentType}} displayName: Validate (${{parameters.environmentType}} Environment) jobs: - job: ValidateBicepCode displayName: Validate Bicep code steps: - task: AzureResourceManagerTemplateDeployment@3 name: RunPreflightValidation displayName: Run preflight validation inputs: connectedServiceName: ${{parameters.serviceConnectionName}} location: ${{parameters.deploymentDefaultLocation}} deploymentMode: Validation resourceGroupName: ${{parameters.resourceGroupName}} csmFile: deploy/main.bicep overrideParameters: > -environmentType ${{parameters.environmentType}}
Všimněte si, že v této fázi je použita podmínka. Běží pouze pro neprodukční prostředí.
Všimněte si také, že identifikátor fáze obsahuje hodnotu parametru
environmentType
. Tento parametr zajišťuje, že každá fáze kanálu má jedinečný identifikátor. Fáze mádisplayName
také vlastnost, která vytvoří dobře formátovaný název, který si můžete přečíst.Pod fázi ověření vložte definici fáze náhledu:
- ${{ if eq(parameters.environmentType, 'Production') }}: - stage: Preview_${{parameters.environmentType}} displayName: Preview (${{parameters.environmentType}} Environment) jobs: - job: PreviewAzureChanges displayName: Preview Azure changes steps: - task: AzureCLI@2 name: RunWhatIf displayName: Run what-if inputs: azureSubscription: ${{parameters.serviceConnectionName}} scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: | az deployment group what-if \ --resource-group ${{parameters.resourceGroupName}} \ --template-file deploy/main.bicep \ --parameters environmentType=${{parameters.environmentType}}
Všimněte si, že tato fáze má také použitou podmínku, ale je to opak podmínky ověřovací fáze. Fáze Preview se spouští pouze pro produkční prostředí.
Pod fázi preview vložte definici fáze nasazení:
- stage: Deploy_${{parameters.environmentType}} displayName: Deploy (${{parameters.environmentType}} Environment) jobs: - deployment: DeployWebsite displayName: Deploy website environment: ${{parameters.environmentType}} strategy: runOnce: deploy: steps: - checkout: self - task: AzureResourceManagerTemplateDeployment@3 name: DeployBicepFile displayName: Deploy Bicep file inputs: connectedServiceName: ${{parameters.serviceConnectionName}} deploymentName: $(Build.BuildNumber) location: ${{parameters.deploymentDefaultLocation}} resourceGroupName: ${{parameters.resourceGroupName}} csmFile: deploy/main.bicep overrideParameters: > -environmentType ${{parameters.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)
Pod fázi nasazení vložte definici fáze orientačního testu:
- 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'
Všimněte si, že
appServiceAppHostName
definice proměnné zahrnujeenvironmentType
parametr, když odkazuje na fázi, která publikovala název hostitele. Tento parametr zajišťuje, aby každá fáze orientačního testu běžela ve správném prostředí.Ověřte, že váš soubor deploy.yml teď vypadá jako v následujícím příkladu:
parameters: - name: environmentType type: string - name: resourceGroupName type: string - name: serviceConnectionName 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 steps: - task: AzureResourceManagerTemplateDeployment@3 name: RunPreflightValidation displayName: Run preflight validation inputs: connectedServiceName: ${{parameters.serviceConnectionName}} location: ${{parameters.deploymentDefaultLocation}} deploymentMode: Validation resourceGroupName: ${{parameters.resourceGroupName}} csmFile: deploy/main.bicep overrideParameters: > -environmentType ${{parameters.environmentType}} - ${{ if eq(parameters.environmentType, 'Production') }}: - stage: Preview_${{parameters.environmentType}} displayName: Preview (${{parameters.environmentType}} Environment) jobs: - job: PreviewAzureChanges displayName: Preview Azure changes steps: - task: AzureCLI@2 name: RunWhatIf displayName: Run what-if inputs: azureSubscription: ${{parameters.serviceConnectionName}} scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: | az deployment group what-if \ --resource-group ${{parameters.resourceGroupName}} \ --template-file deploy/main.bicep \ --parameters environmentType=${{parameters.environmentType}} - stage: Deploy_${{parameters.environmentType}} displayName: Deploy (${{parameters.environmentType}} Environment) jobs: - deployment: DeployWebsite displayName: Deploy website environment: ${{parameters.environmentType}} strategy: runOnce: deploy: steps: - checkout: self - task: AzureResourceManagerTemplateDeployment@3 name: DeployBicepFile displayName: Deploy Bicep file inputs: connectedServiceName: ${{parameters.serviceConnectionName}} deploymentName: $(Build.BuildNumber) location: ${{parameters.deploymentDefaultLocation}} resourceGroupName: ${{parameters.resourceGroupName}} csmFile: deploy/main.bicep overrideParameters: > -environmentType ${{parameters.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'
Uložte změny souboru.
Aktualizace definice kanálu tak, aby používala šablony
Otevřete soubor azure-pipelines.yml.
Aktualizujte soubor tak, aby používal nové šablony nahrazením obsahu následujícím kódem:
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 resourceGroupName: ToyWebsiteTest serviceConnectionName: ToyWebsiteTest # Deploy to the production environment. - template: pipeline-templates/deploy.yml parameters: environmentType: Production resourceGroupName: ToyWebsiteProduction serviceConnectionName: ToyWebsiteProduction
Tento kanál spustí fázi lintu jednou. Pak použije soubor šablony deploy.yml dvakrát: jednou pro každé prostředí. Díky tomu je definice kanálu jasná a snadno pochopitelná. Komentáře také pomáhají vysvětlit, co se děje.
Uložte provedené změny.
Potvrďte a nasdílejte změny do úložiště Git spuštěním následujících příkazů v terminálu editoru Visual Studio Code:
git add . git commit -m "Add pipeline templates" git push
Zobrazení spuštění kanálu
V prohlížeči přejděte na Pipelines.
Vyberte poslední spuštění kanálu.
Všimněte si, že spuštění kanálu teď zobrazuje všechny fáze, které jste definovali v souboru YAML. Možná se budete muset posunout vodorovně, abyste je viděli všechny.
Počkejte, než se kanál pozastaví před fází Nasazení (produkční prostředí). Než se kanál dostane k tomuto bodu, může to trvat několik minut.
Výběrem tlačítka Zkontrolovat schvalte nasazení do produkčního prostředí.
Vyberte tlačítko Schválit.
Počkejte, až se kanál dokončí.
Výběrem karty Testy zobrazíte výsledky testů z tohoto spuštění kanálu.
Všimněte si, že teď existují čtyři výsledky testů. Orientační test běží v testovacím i produkčním prostředí, takže uvidíte výsledky pro obě sady testů.
Vyberte prostředí Kanálů>.
Vyberte produkční prostředí.
Všimněte si, že na obrazovce podrobností o prostředí se zobrazí přehled historie nasazení produkčního prostředí.
Vyberte nasazení a vyberte kartu Změny .
Všimněte si, že na kartě Změny se zobrazuje seznam potvrzení zahrnutých v nasazení. Tyto informace vám pomůžou přesně zjistit, co se v prostředí v průběhu času změnilo.
V prohlížeči přejděte na web Azure Portal.
Přejděte do skupiny prostředků ToyWebsiteProduction .
V seznamu prostředků otevřete aplikaci Aplikace Azure Service.
Všimněte si, že typ plánu služby App Service je S1.
Přejděte do aplikace App Service ve skupině prostředků ToyWebsiteTest .
Všimněte si, že typ plánu služby App Service je F1. Obě prostředí používají různá nastavení, jak jste definovali v souboru Bicep.