Übung – Erstellen einer Azure DevOps-Pipeline zum Bereitstellen Ihrer cloudnativen App
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.
- Melden Sie sich bei dev.azure.com an.
- Wählen Sie + New project aus.
- Geben Sie für den Projektnamen die eShop-Bereitstellung ein.
- Lassen Sie die Sichtbarkeit auf Privatfestgelegt, wählen Sie Erstellen aus.
- Wählen Sie auf der linken Seite Pipelines aus und wählen Sie dann Pipeline erstellen aus.
- Wählen Sie auf der Seite Verbinden unterWo befindet sich Ihr Code?, GitHub aus.
- Wenn Sie dazu aufgefordert werden, melden Sie sich bei GitHub an, und autorisieren Sie Azure Pipelines für den Zugriff auf Ihr GitHub-Konto.
- Wählen Sie Ihr Verzweigungs-Repository für Repository auswählen aus.
- Wählen Sie auf der Seite Konfigurieren die Option In Azure Kubernetes Service bereitstellen aus.
- Wählen Sie im Bereich Für Azure Kubernetes Service bereitstellen Ihr Azure-Abonnement und dann Weiter aus.
- Wenn Sie dazu aufgefordert werden, melden Sie sich zuerst bei Ihrem Azure-Abonnement an.
- Wählen Sie für den Cluster den AKS-Cluster aus, den Sie in der vorherigen Einheit aks-eshop erstellt haben.
- Lassen Sie für den Namespace Vorhandenausgewählt und wählen Sie dann Standard aus.
- Wählen Sie für die Containerregistrierung die Azure Container Registry aus, die Sie in der vorherigen Einheit erstellt haben, zum Beispiel acseshop186748394.
- Geben Sie für den Image-Namen productservice ein.
- Geben Sie für den Service Port 8080ein.
- 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 YAML Speichern und Ausführen aus. Im Bereich Speichern und Ausführen:
- Wählen Sie Für diesen Commit neuen Branch erstellen.
- Behalten Sie bei allen anderen Optionen die Standardeinstellungen bei.
- 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.
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.
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.
Wählen Sie oben rechts das Menü Weitere Aktionen und dann Pipeline bearbeiten aus.
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'
Wählen Sie Speichern.
Wählen Sie im Bereich Speichern Speichernaus.
Wählen Sie Ausführen und wählen Sie dann im Bereich Pipeline ausführen Ausführen aus.
Sehen Sie sich den Abschluss der Buildphase an. Die Bereitstellungsphase wird angehalten, bis Sie sie auswählen und die Ausführung zulassen.
Die Pipeline wird erfolgreich abgeschlossen. Wählen Sie die Bereitstellungsphase aus, um die Schritte anzuzeigen.