Ćwiczenie — tworzenie potoku usługi Azure DevOps w celu wdrożenia aplikacji natywnej dla chmury

Ukończone

Twój menedżer chce zmienić ciągłą integrację/ciągłe wdrażanie dla firm eShop, aby korzystała z usługi Azure Pipelines. Teraz utworzysz potok usługi Azure DevOps, aby skompilować i wdrożyć usługę produktów.

Tworzenie potoku usługi Azure DevOps

Ważne

Przed rozpoczęciem musisz mieć konto usługi Azure DevOps. Jeśli go nie masz, możesz go utworzyć bezpłatnie na dev.azure.com.

  1. Zaloguj się do dev.azure.com.
  2. Wybierz pozycję + Nowy projekt.
  3. W polu Nazwa projektu wprowadź wartość wdrożenie eShop.
  4. Pozostaw pozycję Widoczność ustawioną na Prywatny, a następnie wybierz pozycję Utwórz.
  5. Po lewej stronie wybierz pozycję Potoki, a następnie wybierz pozycję Utwórz potok.
  6. Na stronie Połączenie w polu Gdzie jest twój kod?, wybierz pozycję GitHub.
  7. Jeśli zostanie wyświetlony monit, zaloguj się do usługi GitHub i autoryzuj usługę Azure Pipelines w celu uzyskania dostępu do konta usługi GitHub.
  8. W obszarze Wybierz repozytorium wybierz rozwidlenie repozytorium.
  9. Na stronie Konfigurowanie wybierz opcję Wdróż w usłudze Azure Kubernetes Service.
  10. W okienku Wdrażanie w usłudze Azure Kubernetes Service wybierz subskrypcję platformy Azure, a następnie wybierz pozycję Kontynuuj.
  11. Jeśli zostanie wyświetlony monit, zaloguj się do subskrypcji platformy Azure.
  12. W polu Klaster wybierz klaster usługi AKS utworzony w poprzedniej lekcji aks-eshop.
  13. W obszarze Przestrzeń nazw pozostaw zaznaczoną opcję Istniejąca , a następnie wybierz pozycję domyślną.
  14. W obszarze Rejestr kontenerów wybierz usługę Azure Container Registry utworzoną w poprzedniej lekcji, na przykład acseshop186748394.
  15. W polu Nazwa obrazu wprowadź wartość productservice.
  16. W polu Port usługi wprowadź wartość 8080.
  17. Wybierz pozycję Zweryfikuj i skonfiguruj.

Przeglądanie pliku YAML potoku

Usługa Azure Pipelines używa plików YAML do definiowania kroków tworzenia i wdrażania aplikacji. Plik YAML jest przechowywany w repozytorium GitHub i został utworzony automatycznie na podstawie podanych informacji.

Przejrzyjmy plik YAML:

trigger:
- main

resources:
- repo: self

variables:

  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: '3bcbb23c-6fca-4ff0-8719-bfbdb64a89b1'
  imageRepository: 'productservice'
  containerRegistry: 'acseshop186748394.azurecr.io'
  dockerfilePath: '**/Dockerfile'
  tag: '$(Build.BuildId)'
  imagePullSecret: 'acseshop18674839414442d34-auth'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'


stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

    - upload: manifests
      artifact: manifests

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build

  jobs:
  - deployment: Deploy
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    environment: 'PhilStollerymod9cloudnativeexercisecode-1959.default'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              manifests: |
                $(Pipeline.Workspace)/manifests/deployment.yml
                $(Pipeline.Workspace)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

Sekcje wyzwalacza i zasobów definiują, kiedy należy uruchomić potok. W takim przypadku potok zostanie uruchomiony po zatwierdzeniu zmiany w głównej gałęzi repozytorium.

Sekcja zmiennych definiuje zmienne używane w potoku. Zmienne są używane do definiowania usługi Azure Container Registry i pliku Dockerfile do użycia.

Następnie YAML definiuje zadanie kompilacji , które używa agenta ubuntu-latest . Zadanie używa zadania platformy Docker do skompilowania i wypchnięcia obrazu do usługi Azure Container Registry.

Ostatnim etapem jest wdrożenie zaktualizowanej usługi produktu w usłudze AKS. Zadanie używa zadania KubernetesManifest do wdrożenia obrazu w usłudze AKS.

Uruchamianie potoku

W prawym górnym rogu strony Przeglądanie potoku YAML wybierz pozycję Zapisz i uruchom. W okienku Zapisywanie i uruchamianie:

  1. Wybierz pozycję Utwórz nową gałąź dla tego zatwierdzenia.
  2. Pozostaw wartości domyślne wszystkich pozostałych opcji.
  3. Wybierz pozycję Zapisz i uruchom.

Monitorowanie potoku i rozwiązywanie problemów z tym potokiem

Usługa Azure Pipelines jest monitorowana i zarządzana z poziomu portalu usługi Azure DevOps. Przyjrzyjmy się danych wyjściowych uruchomienia utworzonego potoku.

A screenshot showing the status of an Azure Pipeline.

Na stronie podsumowania są wyświetlane wszystkie etapy uruchomionego potoku. Możesz wybrać etap, aby wyświetlić kroki bardziej szczegółowo. W ciągu kilku minut zobaczysz, że potok uległ awarii. Wybierz etap Kompilacja.

A screenshot of the build stage in a pipeline that has failed.

Na etapie kompilacji widać, że kompilacja nie powiodła się. Wybierz krok Kompiluj i wypychaj obraz do usługi Azure Container Registry . Błąd w pliku dziennika pokazuje:

##[error]Unhandled: No Dockerfile matching  /home/vsts/work/1/s/**/Dockerfile  was found.

Naprawianie błędu

W usłudze DevOps wróć do strony podsumowania potoku. Zamierzasz edytować utworzony potok, aby naprawić błąd.

  1. W prawym górnym rogu wybierz menu Więcej akcji , a następnie wybierz pozycję Edytuj potok.

  2. Wiersz 17 pliku YAML definiuje plik Dockerfile do użycia, a domyślnie potok oczekuje pliku o nazwie Dockerfile w katalogu głównym repozytorium.

    EShop używa innego pliku platformy Docker dla usługi produktu o nazwie DockerfileProducts. Edytuj wiersz 17, aby:

      dockerfilePath: '**/DockerfileProducts'
    
  3. Wybierz pozycję Zapisz.

  4. W okienku Zapisz wybierz pozycję Zapisz.

  5. Wybierz pozycję Uruchom , a następnie w okienku Uruchom potok wybierz pozycję Uruchom.

    Obejrzyj zakończenie etapu kompilacji. Etap Wdrażania jest wstrzymywane do momentu wybrania go i zezwolenia na jego uruchomienie.

    A screenshot showing the completed pipeline.

    Potok zostanie pomyślnie ukończony. Wybierz etap Deploy (Wdrażanie), aby wyświetlić kroki.

    A screenshot showing the Deploy stage and the successfully completed steps.