Cvičení – implementace vzoru modrého zeleného nasazení

Dokončeno

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:

  1. Přejděte na web Azure Portal a přihlaste se.

  2. V nabídce vyberte Cloud Shell. Po zobrazení výzvy vyberte prostředí Bash .

  3. 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".

  4. 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
    
  5. 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
    
  6. 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í.

  7. 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.

    Screenshot of the default home page in Azure App Service.

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.

  1. 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:
      • deployToSlotOrASEpři nastavení truese nasadí do existujícího slotu nasazení.
      • resourceGroupName určuje název skupiny prostředků. Tato hodnota je vyžadována, pokud deployToSlotOrASE je true.
      • slotName určuje název slotu nasazení. Tady nasadíte do slotu, který má název prohození.
    • Nová úloha , AzureAppServiceManage@0prohodí sloty nasazení.
      • sourceSlot a targetSlot 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í.

  2. 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
    
  3. 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.

  1. 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.

    Screenshot of a browser that shows the Space Game website in the Dev environment.