Ćwiczenie — implementowanie niebieskiego zielonego wzorca wdrażania

Ukończone

W obszarze Tworzenie potoku wieloetapowego przy użyciu usługi Azure Pipelines utworzyliśmy podstawowy potok wdrażania, który wdraża aplikację internetową w celu aplikacja systemu Azure Service na tych etapach: tworzenie, testowanie i przemieszczanie.

W tym miejscu dodasz do tego przepływu pracy, stosując wzorzec wdrożenia niebieski-zielony podczas przemieszczania.

W tym celu wykonasz następujące czynności:

  • Dodaj miejsce wdrożenia do wystąpienia usługi App Service, które odpowiada przejściu przejściowemu.
  • Dodaj zadanie do potoku, aby zamienić miejsca wdrożenia.

Dodawanie miejsca wdrożenia

W tym miejscu dodasz miejsce wdrożenia do wystąpienia usługi App Service, które odpowiada przejściu przejściowemu.

Domyślnie każde wystąpienie usługi App Service udostępnia domyślne miejsce o nazwie produkcja. Wdrożono w miejscu produkcyjnym podczas konfigurowania potoku w poprzedniej sekcji.

Wystąpienie usługi App Service może mieć wiele miejsc. W tym miejscu dodasz drugie miejsce wdrożenia do wystąpienia usługi App Service, które odpowiada przejściu przejściowemu. Miejsce wdrożenia nosi nazwę swap.

Aby dodać miejsce:

  1. Przejdź do witryny Azure Portal i zaloguj się.

  2. W menu wybierz pozycję Cloud Shell. Po wyświetleniu monitu wybierz środowisko powłoki Bash .

  3. Uruchom następujące polecenie, aby uzyskać nazwę wystąpienia usługi App Service odpowiadającą przejściu przejściowemu i zapisać wynik w zmiennej powłoki Bash o nazwie 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 używa języka JMESPath, który jest językiem zapytań dla formatu JSON. Argument wybiera wystąpienie usługi App Service, którego name pole zawiera "tailspin-space-space-game-web-aging".

  4. Wydrukuj zmienną, staging aby sprawdzić, czy otrzymasz poprawną nazwę.

    echo $staging
    

    Poniżej przedstawiono przykładowe dane wyjściowe:

    tailspin-space-game-web-staging-1234
    
  5. Uruchom następujące polecenie, aby dodać miejsce o nazwie swap do środowiska przejściowego .

    az webapp deployment slot create \
      --name $staging \
      --resource-group tailspin-space-game-rg \
      --slot swap
    
  6. Uruchom następujące polecenie, aby wyświetlić listę nazwy hosta miejsca wdrożenia.

    az webapp deployment slot list \
        --name $staging \
        --resource-group tailspin-space-game-rg \
        --query [].hostNames \
        --output tsv
    

    Wynik przypomina następujące dane wyjściowe:

    tailspin-space-game-web-staging-25391-swap.azurewebsites.net
    

    Zanotuj tę nazwę hosta na później.

  7. Opcjonalnie przejdź do witryny w przeglądarce. Zostanie wyświetlona domyślna strona główna, ponieważ kod nie został jeszcze wdrożony w tym miejscu.

    Screenshot of the default home page in Azure App Service.

Domyślnie miejsce wdrożenia jest dostępne z Internetu. W praktyce można skonfigurować sieć wirtualną platformy Azure, która umieszcza miejsce wymiany w sieci, która nie jest routingiem z Internetu, ale tylko twój zespół może uzyskać dostęp. Miejsce produkcyjne pozostanie dostępne z Internetu.

Wymiana miejsc wdrożenia w środowisku przejściowym

W tym miejscu użyjesz zadania AzureAppServiceManage@0 , aby zamienić miejsca wdrożenia w środowisku przejściowym .

To zadanie służy również do uruchamiania, zatrzymywania lub usuwania miejsca. Możesz też użyć go do zainstalowania rozszerzeń lokacji lub włączenia ciągłego monitorowania w usłudze App Service.

  1. W programie Visual Studio Code zmodyfikuj azure-pipelines.yml przy użyciu tego kodu:

    Napiwek

    Możesz zastąpić cały plik lub po prostu zaktualizować wyróżnioną część.

    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'
    

    Zwróć uwagę na następujące zmiany:

    • Zadanie AzureWebApp@1 określa teraz następujące wartości:
      • deployToSlotOrASE, gdy jest ustawiona na true, jest wdrażana w istniejącym miejscu wdrożenia.
      • resourceGroupName określa nazwę grupy zasobów. Ta wartość jest wymagana, gdy deployToSlotOrASE wartość to true.
      • slotName określa nazwę miejsca wdrożenia. W tym miejscu wdrożysz w miejscu o nazwie swap.
    • Nowe zadanie AzureAppServiceManage@0, zamienia miejsca wdrożenia.
      • sourceSlot i targetSlot określ miejsca do zamiany.
      • action określa akcję do wykonania. Pamiętaj, że to zadanie służy do uruchamiania, zatrzymywania lub usuwania miejsca. W tym miejscu "Miejsca zamiany" określa zamianę miejsc źródłowych i docelowych.

    Ta konfiguracja zawsze jest wdrażana w miejscu zamiany. Następnie zamienia miejsca produkcyjne i zamieniane . Proces zamiany zapewnia, że środowisko produkcyjne wskazuje na nowsze wdrożenie.

  2. W zintegrowanym terminalu dodaj azure-pipelines.yml do indeksu. Zatwierdź zmiany, a następnie wypchnij gałąź do usługi GitHub.

    Napiwek

    Zapisz azure-pipelines.yml przed uruchomieniem tych poleceń usługi Git.

    git add azure-pipelines.yml
    git commit -m "Swap deployment slots"
    git push origin blue-green
    
  3. W usłudze Azure Pipelines prześledzić kompilację za pomocą każdego z kroków.

Uwaga

Jeśli wystąpi następujący błąd, ...'staging' slot did not respond to http ping. (CODE: 417) spróbuj ponownie uruchomić usługę aplikacji. Jeśli problem będzie się powtarzać, zresetuj zamianę automatyczną dla miejsca.

  1. Opcjonalnie w przeglądarce przejdź do adresu URL odpowiadającego każdemu etapowi.

    Mimo że nie wprowadzono jeszcze zmian w witrynie internetowej, zobaczysz, że witryna internetowa Space Game została pomyślnie wdrożona w każdym środowisku usługi App Service.

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