Übung – Erstellen einer Azure DevOps-Pipeline zum Bereitstellen Ihrer cloudnativen App

Abgeschlossen

Ihr*e Manager*in möchte, dass Sie die CI/CD für die eShop-App des Unternehmens ändern und Azure Pipelines verwenden. Sie erstellen nun eine Azure DevOps-Pipeline, um Ihren Produktdienst zu erstellen und bereitzustellen.

Eine Azure DevOps-Pipeline erstellen

Wichtig

Bevor Sie beginnen, müssen Sie über ein Azure DevOps-Konto verfügen. Falls Sie keines haben, können Sie unter dev.azure.com kostenlos eines erstellen.

  1. Melden Sie sich bei dev.azure.com an.
  2. Wählen Sie + New project aus.
  3. Geben Sie für den Projektnamen die eShop-Bereitstellung ein.
  4. Lassen Sie die Sichtbarkeit auf Privatfestgelegt, wählen Sie Erstellen aus.
  5. Wählen Sie auf der linken Seite Pipelines aus und wählen Sie dann Pipeline erstellen aus.
  6. Wählen Sie auf der Seite Verbinden unterWo befindet sich Ihr Code?, GitHub aus.
  7. Wenn Sie dazu aufgefordert werden, melden Sie sich bei GitHub an, und autorisieren Sie Azure Pipelines für den Zugriff auf Ihr GitHub-Konto.
  8. Wählen Sie Ihr Verzweigungs-Repository für Repository auswählen aus.
  9. Wählen Sie auf der Seite Konfigurieren die Option In Azure Kubernetes Service bereitstellen aus.
  10. Wählen Sie im Bereich Für Azure Kubernetes Service bereitstellen Ihr Azure-Abonnement und dann Weiter aus.
  11. Wenn Sie dazu aufgefordert werden, melden Sie sich zuerst bei Ihrem Azure-Abonnement an.
  12. Wählen Sie für den Cluster den AKS-Cluster aus, den Sie in der vorherigen Einheit aks-eshop erstellt haben.
  13. Lassen Sie für den NamespaceVorhandenausgewählt und wählen Sie dann Standard aus.
  14. Wählen Sie für die Containerregistrierung die Azure Container Registry aus, die Sie in der vorherigen Einheit erstellt haben, zum Beispiel acseshop186748394.
  15. Geben Sie für den Image-Namenproductservice ein.
  16. Geben Sie für den Service Port8080ein.
  17. Wählen Sie Überprüfen und konfigurieren aus.

Überprüfen Sie die YAML-Pipelinedatei

Azure Pipelines verwendet YAML-Dateien zum Definieren der Schritte zum Erstellen und Bereitstellen Ihrer Anwendung. Die YAML-Datei wird in Ihrem GitHub-Repository gespeichert und basierend auf den von Ihnen bereitgestellten Informationen automatisch erstellt.

Sehen wir uns die YAML-Datei an:

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)

Die Abschnitte Auslöser und Ressourcen definieren, wann die Pipeline ausgeführt werden soll. In diesem Fall wird die Pipeline ausgeführt, wenn eine Änderung an der Standardverzweigung Ihres Repositorys übernommen wird.

Im Abschnitt Variablen werden die Variablen definiert, die in der Pipeline verwendet werden. Die Variablen werden verwendet, um die Azure-Containerregistrierung und die zu verwendende Dockerfile-Datei zu definieren.

Der YAML definiert dann einen Buildauftrag, der den ubuntu-latest-Agent verwendet. Der Auftrag verwendet die Docker-Aufgabe, um das Image in die Azure-Containerregistrierung zu erstellen und zu übertragen.

Der letzte Schritt ist das Bereitstellen des aktualisierten Produktdienstes in AKS. Der Auftrag verwendet die Aufgabe KubernetesManifest, um das Image auf AKS bereitzustellen.

Führen Sie die Pipeline aus.

Wählen Sie oben rechts auf der Seite Überprüfen Ihrer Pipeline YAMLSpeichern und Ausführen aus. Im Bereich Speichern und Ausführen:

  1. Wählen Sie Für diesen Commit neuen Branch erstellen.
  2. Behalten Sie bei allen anderen Optionen die Standardeinstellungen bei.
  3. Wählen Sie Speichern und ausführen aus.

Überwachen und Beheben von Problemen mit der Pipeline

Azure-Pipelines werden über das Azure DevOps-Portal überwacht und verwaltet. Sehen wir uns die Ausgabe der Ausführung der von Ihnen erstellten Pipeline an.

A screenshot showing the status of an Azure Pipeline.

Auf der Zusammenfassungsseite werden alle Phasen der laufenden Pipeline angezeigt. Sie können eine Phase auswählen, um die Schritte ausführlicher anzuzeigen. In einem Moment sehen Sie, dass die Pipeline fehlgeschlagen ist. Wählen Sie die Phase Build aus.

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

In der Buildphase können Sie sehen, dass der Build fehlgeschlagen ist. Wählen Sie Erstellen und Übertragen eines Image mithilfe von Push an Azure Container Registry aus. Der Fehler in der Protokolldatei zeigt Folgendes:

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

Beheben des Fehlers

Wechseln Sie in DevOps zurück zur Pipelinezusammenfassungsseite. Sie werden die erstellte Pipeline bearbeiten, um den Fehler zu beheben.

  1. Wählen Sie oben rechts das Menü Weitere Aktionen und dann Pipeline bearbeiten aus.

  2. Linie 17 der YAML-Datei definiert die zu verwendende Dockerfile-Datei, und standardmäßig erwartet die Pipeline, dass im Stammverzeichnis des Repositorys eine Datei namens Dockerfile vorhanden ist.

    Der eShop verwendet eine andere Docker-Datei für den Produktdienst namens DockerfileProducts. Bearbeiten Sie die Linie 17 wie folgt:

      dockerfilePath: '**/DockerfileProducts'
    
  3. Wählen Sie Speichern.

  4. Wählen Sie im Bereich SpeichernSpeichernaus.

  5. Wählen Sie Ausführen und wählen Sie dann im Bereich Pipeline ausführenAusführen aus.

    Sehen Sie sich den Abschluss der Buildphase an. Die Bereitstellungsphase wird angehalten, bis Sie sie auswählen und die Ausführung zulassen.

    A screenshot showing the completed pipeline.

    Die Pipeline wird erfolgreich abgeschlossen. Wählen Sie die Bereitstellungsphase aus, um die Schritte anzuzeigen.

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