Cvičení – implementace vzoru modrého zeleného nasazení
V Vytvoření vícefázového kanálu pomocí Azure Pipelinesjste vytvořili základní kanál nasazení, který nasadí webovou aplikaci do služby Azure App Service v těchto fázích: vývoj, testa příprava.
Zde přidáte do tohoto pracovního postupu použitím vzoru nasazení modrého zeleného během přípravného.
Uděláte to takto:
- Přidejte slot nasazení do instance služby App Service, která odpovídá fázi nasazení přípravy.
- Přidejte do pipeline úlohu pro prohození slotů nasazení.
Přidání slotu nasazení
Tady přidáte nasazovací slot do instance služby App Service, která odpovídá přípravné fázi.
Ve výchozím nastavení poskytuje každá instance služby App Service výchozí slot pojmenovaný produkční. Při nastavování kanálu (pipeline) v předchozí části jste nasadili na slot v produkčním prostředí.
Instance služby App Service může mít více slotů. Tady přidáte druhý slot pro nasazení v instanci služby App Service, který odpovídá Staging. Slot nasazení má název swapu.
Přidání slotu:
Přejděte na portál Azure 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, 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 JSON. Argument vybere instanci služby App Service, jejíž polename
obsahuje "tailspin-space-game-web-staging".Vytiskněte proměnnou
staging
, abyste ověřili, že získáte 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 slot pojmenovaný swap do přípravného prostředí.
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í váš náhradní slot do sítě, která není přístupná z internetu, ale ke které má přístup pouze 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 výměně nasazovacích slotů ve vašem prostředí pro přípravu.
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:
- Úloha
AzureWebApp@1
teď určuje tyto hodnoty:-
deployToSlotOrASE
, je-li nastavena natrue
, nasadí do existujícího nasazovacího slotu. -
resourceGroupName
určuje název skupiny prostředků. Tato hodnota se vyžaduje, pokud jedeployToSlotOrASE
true
. -
slotName
určuje název slotu nasazení. Zde nasadíte do slotu jménem swap.
-
- Nová úloha,
AzureAppServiceManage@0
, prohodí sloty nasazení.-
sourceSlot
atargetSlot
specifikují sloty k prohození. -
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. Zde "Prohození slotů" určuje prohození zdrojových a cílových slotů.
-
Tato konfigurace se vždy nasadí do slotu prohození. Potom prohodí sloty produkce a . Proces výměny zajistí, že produktivní odkazuje na novější nasazení.
- Úloha
V integrovaném terminálu přidejte do indexu azure-pipelines.yml. Potvrďte změny a pak pushněte větev na GitHub.
Spropitné
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 můžete sledovat sestavení na každém kroku.
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é přepínání pro váš slot.
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, vidíte, že web Space Game byl úspěšně nasazen do každého prostředí služby App Service.