Cvičení – implementace vzoru modrého zeleného nasazení
V části Vytvoření kanálu s více fázemi pomocí Azure Pipelines jste vytvořili základní kanál nasazení, který nasadí webovou aplikaci do služby Aplikace Azure Service v těchto fázích: vývoj, testování a příprava.
Tady do tohoto pracovního postupu přidáte použitím vzoru modrého zeleného nasazení během přípravy.
Uděláte to takto:
- Přidejte slot nasazení do instance služby App Service, která odpovídá přípravnému prostředí.
- Přidejte do kanálu úlohu pro prohození slotů nasazení.
Přidání slotu nasazení
Tady přidáte slot nasazení do instance služby App Service, která odpovídá přípravnému prostředí.
Ve výchozím nastavení každá instance služby App Service poskytuje výchozí slot s názvem production. Při nastavování kanálu v předchozí části jste nasadili do produkčního slotu.
Instance služby App Service může mít více slotů. Tady přidáte druhý slot nasazení do instance služby App Service, která odpovídá přípravnému nasazení. Slot nasazení má název swap.
Přidání slotu:
Přejděte na web Azure Portal a přihlaste se.
V nabídce vyberte Cloud Shell. Po zobrazení výzvy vyberte prostředí Bash .
Spuštěním následujícího příkazu získejte název instance služby App Service, která odpovídá přípravnému prostředí , a uložte výsledek do proměnné Bash s názvem
staging
.staging=$(az webapp list \ --resource-group tailspin-space-game-rg \ --query "[?contains(@.name, 'tailspin-space-game-web-staging')].{name: name}" \ --output tsv)
Argument
--query
používá JMESPath, což je dotazovací jazyk pro JSON. Argument vybere instanci služby App Service, jejížname
pole obsahuje "tailspin-space-game-web-staging".Vytiskněte proměnnou
staging
, abyste ověřili, že se zobrazí správný název.echo $staging
Tady je příklad výstupu:
tailspin-space-game-web-staging-1234
Spuštěním následujícího příkazu přidejte do přípravného prostředí slot s názvem swap.
az webapp deployment slot create \ --name $staging \ --resource-group tailspin-space-game-rg \ --slot swap
Spuštěním následujícího příkazu vypíšete název hostitele slotu nasazení.
az webapp deployment slot list \ --name $staging \ --resource-group tailspin-space-game-rg \ --query [].hostNames \ --output tsv
Výsledek se podobá tomuto výstupu:
tailspin-space-game-web-staging-25391-swap.azurewebsites.net
Poznamenejte si tento název hostitele pro pozdější použití.
Jako volitelný krok přejděte na svůj web v prohlížeči. Zobrazí se výchozí domovská stránka, protože jste ještě nenasadili kód do tohoto slotu.
Ve výchozím nastavení je slot nasazení přístupný z internetu. V praxi byste mohli nakonfigurovat virtuální síť Azure, která umístí slot pro prohození do sítě, která není směrovatelná z internetu, ale ke které má přístup jenom váš tým. Váš produkční slot by zůstal dostupný z internetu.
Prohození slotů nasazení v přípravném prostředí
Tady použijete úlohu AzureAppServiceManage@0 k prohození slotů nasazení v přípravném prostředí.
Tento úkol můžete použít také ke spuštění, zastavení nebo odstranění slotu. Nebo ho můžete použít k instalaci rozšíření webu nebo k povolení průběžného monitorování ve službě App Service.
V editoru Visual Studio Code upravte azure-pipelines.yml pomocí tohoto kódu:
Tip
Celý soubor můžete nahradit nebo jenom aktualizovat zvýrazněnou část.
trigger: - '*' variables: buildConfiguration: 'Release' stages: - stage: 'Build' displayName: 'Build the web application' jobs: - job: 'Build' displayName: 'Build job' pool: vmImage: 'ubuntu-20.04' demands: - npm variables: wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot' dotnetSdkVersion: '6.x' steps: - task: UseDotNet@2 displayName: 'Use .NET SDK $(dotnetSdkVersion)' inputs: version: '$(dotnetSdkVersion)' - task: Npm@1 displayName: 'Run npm install' inputs: verbose: false - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)' displayName: 'Compile Sass assets' - task: gulp@1 displayName: 'Run gulp tasks' - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt' displayName: 'Write build info' workingDirectory: $(wwwrootDir) - task: DotNetCoreCLI@2 displayName: 'Restore project dependencies' inputs: command: 'restore' projects: '**/*.csproj' - task: DotNetCoreCLI@2 displayName: 'Build the project - $(buildConfiguration)' inputs: command: 'build' arguments: '--no-restore --configuration $(buildConfiguration)' projects: '**/*.csproj' - task: DotNetCoreCLI@2 displayName: 'Publish the project - $(buildConfiguration)' inputs: command: 'publish' projects: '**/*.csproj' publishWebProjects: false arguments: '--no-build --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(buildConfiguration)' zipAfterPublish: true - publish: '$(Build.ArtifactStagingDirectory)' artifact: drop - stage: 'Dev' displayName: 'Deploy to the dev environment' dependsOn: Build jobs: - deployment: Deploy pool: vmImage: 'ubuntu-20.04' environment: dev variables: - group: Release strategy: runOnce: deploy: steps: - download: current artifact: drop - task: AzureWebApp@1 displayName: 'Azure App Service Deploy: website' inputs: azureSubscription: 'Resource Manager - Tailspin - Space Game' appName: '$(WebAppNameDev)' package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip' - stage: 'Test' displayName: 'Deploy to the test environment' dependsOn: Dev jobs: - deployment: Deploy pool: vmImage: 'ubuntu-20.04' environment: test variables: - group: 'Release' strategy: runOnce: deploy: steps: - download: current artifact: drop - task: AzureWebApp@1 displayName: 'Azure App Service Deploy: website' inputs: azureSubscription: 'Resource Manager - Tailspin - Space Game' appName: '$(WebAppNameTest)' package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip' - stage: 'Staging' displayName: 'Deploy to the staging environment' dependsOn: Test jobs: - deployment: Deploy pool: vmImage: 'ubuntu-20.04' environment: staging variables: - group: 'Release' strategy: runOnce: deploy: steps: - download: current artifact: drop - task: AzureWebApp@1 displayName: 'Azure App Service Deploy: website' inputs: azureSubscription: 'Resource Manager - Tailspin - Space Game' deployToSlotOrASE: 'true' resourceGroupName: 'tailspin-space-game-rg' slotName: 'swap' appName: '$(WebAppNameStaging)' package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip' - task: AzureAppServiceManage@0 displayName: 'Swap deployment slots' inputs: azureSubscription: 'Resource Manager - Tailspin - Space Game' resourceGroupName: 'tailspin-space-game-rg' webAppName: '$(WebAppNameStaging)' sourceSlot: 'swap' targetSlot: 'production' action: 'Swap Slots'
Všimněte si těchto změn:
- Úkol
AzureWebApp@1
teď určuje tyto hodnoty:deployToSlotOrASE
při nastavenítrue
se nasadí do existujícího slotu nasazení.resourceGroupName
určuje název skupiny prostředků. Tato hodnota je vyžadována, pokuddeployToSlotOrASE
jetrue
.slotName
určuje název slotu nasazení. Tady nasadíte do slotu, který má název prohození.
- Nová úloha ,
AzureAppServiceManage@0
prohodí sloty nasazení.sourceSlot
atargetSlot
určete sloty, které se mají prohodit.action
určuje akci, která se má provést. Vzpomeňte si, že tento úkol můžete použít ke spuštění, zastavení nebo odstranění slotu. V této části "Prohození slotů" určuje prohození zdrojových a cílových slotů.
Tato konfigurace se vždy nasadí do slotu prohození . Pak prohodí produkční a prohození slotů. Proces prohození zajišťuje, že produkční prostředí odkazuje na novější nasazení.
- Úkol
V integrovaném terminálu přidejte do indexu azure-pipelines.yml . Potvrďte změny a pak nasdílejte větev do GitHubu.
Tip
Před spuštěním těchto příkazů Git uložte azure-pipelines.yml .
git add azure-pipelines.yml git commit -m "Swap deployment slots" git push origin blue-green
V Azure Pipelines trasujte sestavení jednotlivými kroky.
Poznámka:
Pokud narazíte na následující chybu ...'staging' slot did not respond to http ping. (CODE: 417)
, zkuste restartovat službu App Service. Pokud problém přetrvává, resetujte automatické prohození slotu.
Jako volitelný krok v prohlížeči přejděte na adresu URL odpovídající každé fázi.
I když jste ještě neprovedli změny na webu, uvidíte, že se web Space Game úspěšně nasadil do každého prostředí služby App Service.