Kurs
Wenn deine CI/CD-Pipeline ständig zusammenbricht oder sich langsam und schwerfällig anfühlt, bist du nicht allein. Ich hatte schon mit fehlgeschlagenen Builds, nicht passenden Umgebungen und Teamkollegen zu tun, die versehentlich meine Arbeit überschrieben haben. Azure Pipelines beseitigt diese Frustrationen mit einem in der Cloud gehosteten Dienst, mit dem fast jedes Projekt auf jeder Plattform erstellt, getestet und bereitgestellt werden kann.
Deshalb zeige ich dir in diesem Tutorial, wie du das machst:
- Erstelle deine erste Azure Pipeline
- Baue dein Projekt in der Cloud
- Füge automatisierte Tests hinzu, um Fehler frühzeitig zu erkennen
- Bereitstellung in Staging oder Produktion mit einem einzigen Push
- Überwache und optimiere deine Pipeline für Geschwindigkeit und Zuverlässigkeit
- Befolge bewährte Praktiken, die sich in realen Projekten bewährt haben
Lass uns loslegen!
Was sind Azure Pipelines?
Azure Pipelines ist eine Cloud-basierte Lösung, die die Entwicklung, das Testen und die Bereitstellung von Anwendungen vereinfacht.
Es ist eine Komponente des Azure DevOps-Toolkits, das den gesamten Lebenszyklus der Softwareentwicklung unterstützt. Außerdem ist es eine flexible Option für Teams jeder Größe, da es verschiedene Plattformen und Programmiersprachen unterstützt. GitHub, Azure Repos und andere bekannte Versionskontrollsysteme sind darin integriert.
Zu den wichtigsten Funktionen von Azure Pipelines gehören:
Service |
Zweck |
Multiplattform-Unterstützung |
Azure Pipelines automatisiert die Erstellung und Bereitstellung von Anwendungen für verschiedene Betriebssysteme, wie Linux, macOS und Windows. |
Integration mit Versionskontrolle |
Azure Pipelines verbinden sich mit deinen Code-Repositories wie Azure Repos, GitHub und anderen bekannten Versionskontrollsystemen. |
YAML-basierte Pipeline-Konfiguration |
Mit Azure Pipelines können wir unsere Build- und Deployment-Prozesse als Code definieren und so Versionskontrolle ermöglichen. |
Kontinuierliche Integration und kontinuierliche Bereitstellung (CI/CD) |
Azure Pipelines erleichtert den End-to-End-Prozess der Integration von Codeänderungen und der Bereitstellung von Anwendungen. |
Meiner Erfahrung nach sind Azure Pipelines für alle hilfreich, die proper CI/CD in ihrem Team haben wollen. Sie ist flexibel, skalierbar und lässt sich gut mit anderen Azure-Diensten integrieren.
Azure Pipelines Architektur (Quelle: Microsoft).
Wenn du ein breiteres Verständnis von Azure DevOps über Pipelines hinaus suchst, ist dieses Azure DevOps-Tutorial waden gesamten CI/CD-Lebenszyklus von Anfang bis Ende durch.
Deine erste Azure Pipeline einrichten
Um mit der Azure Pipelines-Umgebung zu arbeiten, müssen wir zunächst alles so einrichten, dass ein durchgängiger Build-, Test- und Deployment-Prozess möglich ist.
Voraussetzungen
Bevor du mit der Erstellung deiner ersten Pipeline beginnst, solltest du sicherstellen, dass du die folgenden Punkte beachtet hast:
- Azure DevOps Konto und Organisation einrichten: Melde dich füroder einen Azure DevOps-Accountan, wenn du noch keinen hast. Erstelle eine Organisation, um deine Projekte zu verwalten.
- Repository: Du brauchst ein Code-Repository mit einem Beispielprojekt. Diese kann in Azure Repos oder GitHub gehostet werden. Für dieses Tutorial verwenden wir ein einfaches Node.js-Projekt.
- Zugang zum Azure-Portal: Du brauchst auch Zugang zudem Azure-Portal, wenn du Azure-Dienste wie Azure Kubernetes Service (AKS) und viele andere nutzen willst.
Wenn du dich über das Azure-Ökosystem informieren möchtest, empfehle ich dir den Kurs "Microsoft Azure verstehen".
Ein neues Projekt und Repository erstellen
Jetzt, wo dein Azure DevOps-Konto und deine Organisation eingerichtet sind, können wir unser erstes Projekt und Repository erstellen.
- Erstelle ein neues Projekt:
- Melde dich bei deinem Azure DevOps-Konto an.
- Klicke auf Neues Projekt, gib ihm einen Namen (z. B. "AzureDevOps-DataCamp-Tutorial") und wähle die Sichtbarkeit (öffentlich oder privat).
- Klicke auf Projekt erstellen.
- Richte ein Repository ein:
- Wenn du Azure Repos verwendest, navigiere zum AbschnittRepos und initialisiere ein neues Repository.
- Alternativ kannst du ein bestehendes GitHub-Repository verknüpfen, indem du Repository importieren wählst.
- Benenne dein Repository, wähle deinen Repository-Typ (Git oder TFVC), füge die URL deines geklonten Repositorys ein und klicke auf Importieren.
- Wenn du GitHubverwendest, kannst du dein GitHub-Konto mit Azure DevOps verknüpfen, indem du unten links in deiner Projektoberfläche auf Projekteinstellungen > GitHub-Verbindungen > Verbinde dein GitHub-Konto.
Für dieses Tutorial verwenden wir Azure Repos als Code-Repository. Wenn du gerade erst anfängst oder keinen bestimmten Grund hast, dich für TFVC zu entscheiden, rate ich dir, Git zu wählen.
Erstellen deiner ersten Pipeline
Es ist an der Zeit, unsere erste Pipeline zu erstellen. Befolge die folgenden Schritte:
- In deinen Pipelines Abschnitt, klicken Sie auf Pipeline erstellen.
- Wähle Azure Repos Git als Quelle und wähle dein Repository aus.
- Du kannst deine Pipeline mit dem YAML- oder Classic-Editor konfigurieren. Nehmen wir YAML, eine codebasierte Methode, um die Pipeline zu definieren.
- Speichere die Pipeline und führe sie aus, um zu sehen, ob alles richtig funktioniert.
Die Wahl zwischen YAML und dem klassischen Editor
Azure Pipelines bietet zwei Möglichkeiten, deine Pipelines zu definieren:
- YAML-Pipelines: Eine codebasierte Möglichkeit, deine Pipeline zu beschreiben. Sie werden in einer
.yaml
oder.yml
Datei in deinem Quellcode-Repository definiert, was die Versionierung und bessere Zusammenarbeit ermöglicht. - Classic Editor: Der Classic Editor ist eine benutzerfreundliche, visuelle Drag-and-Drop-Oberfläche, die weniger flexibel für komplexe Szenarien ist.
Aspekt |
YAML Pipelines |
Klassischer Editor |
Versionskontrolle |
YAML-Pipelines unterstützen die Versionskontrolle und werden im Quellcode-Repository gespeichert. |
Der Classic Editor unterstützt keine Versionskontrolle. Es ist eine grafische Benutzeroberfläche (GUI). |
Flexibilität |
YAML-Pipelines bieten ein Höchstmaß an Flexibilität. |
Der Classic Editor ist nur begrenzt flexibel. |
Am besten für |
YAML-Pipelines eignen sich am besten für langfristige, komplexe Arbeitsabläufe und Automatisierung. |
Der Classic Editor eignet sich am besten für schnelle Einrichtungsarbeiten. |
Meiner Erfahrung nach bieten YAML-Pipelines mehr Flexibilität und sind besser für Teams geeignet, dieInfrastructure as Code (IaC) Praktiken ermöglichen. Aber der Classic Editor ist perfekt für alle, die eine visuellere Herangehensweise bevorzugen.
Für eine langfristige Skalierbarkeit sind YAML-Pipelines jedoch dem klassischen Editor vorzuziehen.
Bauen mit Azure Pipelines
Jetzt wollen wir sehen, wie wir mit Azure Pipelines bauen können.
In diesem Abschnitt legen wir die Schritte fest, die Azure Pipelines unternimmt, um deinen Code zu erstellen, z. B. die Installation von Abhängigkeiten, die Kompilierung und die Durchführung von Tests. Wir werden diese Schritte in einer Konfigurationsdatei in unserem Quellcode-Repository mit YAML ausdrücken, einer einfachen, für Menschen lesbaren Methode, um Schritte in einem Rezept zu beschreiben.
YAML-Pipeline-Syntax
Hier ist ein einfaches Beispiel für eine YAML-Pipeline:
# This section defines the trigger(s) for the pipeline.
# 'main' specifies that the pipeline will run whenever changes are pushed to the 'main' branch.
trigger:
- main # automatically triggers this pipeline when changes are made to the 'main' branch.
# This defines the pool where the pipeline will run.
# 'ubuntu-latest' specifies the virtual machine image for executing tasks.
pool:
vmImage: 'ubuntu-latest' # This uses the latest Ubuntu image provided by Azure DevOps.
# Steps contain the individual tasks or actions that the pipeline will execute.
steps:
- script: echo Hello, world! # A script task to run shell commands. This one prints "Hello, world!".
displayName: 'Run my first pipeline script' # A friendly name for this step, making it easier to identify in the pipeline logs.
Lass uns den Code Schritt für Schritt aufschlüsseln:
trigger
: Gibt den Zweig an, der die Pipeline auslöst (z. B.main
).pool
: Legt den Build-Agenten fest (z. B.ubuntu-latest
).steps
: Listet die auszuführenden Aufgaben auf, z. B. die Installation von Abhängigkeiten und die Ausführung eines Build-Skripts.
Konfigurieren der Build-Schritte
Um deiner YAML-Pipeline Build-Schritte hinzuzufügen, musst du das "Skript" unter dem Abschnitt "Schritte" definieren.
Für eine einfache Node.js
Anwendung zum Beispiel enthält unsere azure-pipelines.yml
Datei unten Code, den Azure DevOps automatisch erstellt hat.
# Node.js
# Build a general Node.js project with npm.
# Add steps that analyze code, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
steps:
- task: NodeTool@0
inputs:
versionSpec: '20.x'
displayName: 'Install Node.js'
- script: |
npm install
npm run build
displayName: 'npm install and build'
Werfen wir einen Blick auf den Build steps
in der obigen YAML-Pipeline:
- Installiere Node.js: Verwende die Aufgabe
NodeTool@0
, um die Node.js-Version anzugeben. - Installiere die Abhängigkeiten: Führe
npm install
aus, um die Projektabhängigkeiten zu installieren. - Kompiliere den Code (baue das Projekt): Führe
npm run build
aus, um den Code zu kompilieren.
Betrieb der Pipeline
Unsere Pipeline kann manuell ausgelöst oder so eingestellt werden, dass sie automatisch läuft, wenn Ereignisse wie Branch-Pushes eintreten.
- Manueller Auslöser: Klicke auf Run Pipeline in der Azure DevOps-Oberfläche, um die Pipeline manuell auszulösen.
- Automatischer Auslöser: Richte Trigger ein, die auf Repository-Ereignissen basieren, um Änderungen in den Zweig
main
zu verschieben und die Pipeline automatisch auszulösen. Hier ist ein Beispiel:
trigger:
- main
Nachdem du deine Pipeline ausgeführt hast, kannst du die Protokolle einsehen und eventuelle Probleme beheben.
Um auf die Protokolle zuzugreifen, gehst du zur Zusammenfassung deines Pipeline-Laufs und wählst den entsprechenden Job oder die Aufgabe aus. Wie in der Abbildung unten kannst du jeden Job (Build, Push oder Update) auswählen, um die Rohprotokolle zu sehen.
Um häufige Probleme zu beheben, kannst du deine Pipeline auf häufige Probleme wie Zeitüberschreitungen, Ressourcenbeschränkungen oder Fehlkonfigurationen überprüfen.
Hinzufügen von Tests zu deiner Pipeline
Du fügst deiner Pipeline Tests hinzu, um die Qualität des Codes zu sichern und Probleme in der Entwicklung frühzeitig zu erkennen. In Azure Pipelines kannst du Unit-, Integrations- oder andere Tests integrieren, indem du Schritte in deiner Pipeline-Konfiguration hinzufügst.
Prüfschritte konfigurieren
Baue Testschritte in deine Pipeline ein, um die Codequalität zu gewährleisten. Du kannst beliebte Frameworks wie Jest, Mocha oder NUnit verwenden. Hier siehst du zum Beispiel, wie du mit Jest Unit-Tests hinzufügst:
- script: |
npm test
displayName: 'Run unit tests with Jest'
Testergebnisse anzeigen
In Azure Pipelines gibt es eine integrierte Testberichterstattung. Du kannst die Veröffentlichung von Testergebnissen für eine einfachere Nachverfolgung einrichten und die Testergebnisse in den Pipeline-Protokollen einsehen. So geht's:
- Navigieren Sie zunächst zu Builds > Testergebnisse.
- Um Testergebnisse zu veröffentlichen, verwende die Aufgabe
PublishTestResults@2
, um die Ergebnisse anzuzeigen. Das macht den Lernpfad insgesamt einfacher. Zum Beispiel:
- task: PublishTestResults@2
inputs:
testResultsFiles: '**/test-results.xml'
testRunTitle: 'Unit Tests'
Bereitstellen mit Azure Pipelines
In den Bereitstellungsschritten in deiner Azure-Pipeline-YAML-Datei kannst du deine Anwendung automatisch in verschiedenen Umgebungen bereitstellen, z. B. in der Test-, Staging- und Produktionsumgebung. In diesem Abschnitt gehen wir auf einige Möglichkeiten der Bereitstellung mit Azure Pipelines ein.
Bereitstellen in Azure Web Apps
Azure Web Apps ist ein Dienst im Azure Portal, mit dem du Webanwendungen in großem Umfang entwickeln, bereitstellen und verwalten kannst.
Für die Bereitstellung in Azure Web Apps musst du die beiden Dienste miteinander verknüpfen. So geht's:
- Gehe unten links in deinem Projekt auf Projekt-Einstellungen und klicke auf . Dienst-Verbindungen unter den Pipelines Abschnitt.
- Klicke auf Neue Serviceverbindung und wählen Sie Azure Ressourcen-Manager.
- Authentifiziere dich mit deinem Azure-Konto.
- Stelle den Azure App Service bereit:
- Gehe zurück zu deinen Pipelines und konfiguriere deine Pipeline.
- Füge in deiner Pipeline eine Aufgabe zur Bereitstellung in Azure hinzu.
- Gib die Ressourcengruppe und die Dienstdetails an.
Hier ist ein Beispiel für eine YAML-Bereitstellungspipeline für eine einfache Node.js
App für Azure App Service:
# Define the task for deploying to an Azure Web App
- task: AzureWebApp@1
inputs:
# This specifies your Azure subscription service connection
azureSubscription: 'your-azure-subscription'
# This specifies the name of your web app
appName: 'your-app-name'
# This specifies the location of the app package or files to be deployed
package: '$(Build.ArtifactStagingDirectory)'
Lass uns den obigen Code aufschlüsseln, damit du ihn für deinen Anwendungsfall anpassen kannst:
- Ersetze
your-azure-subscription
durch den Namen der Serviceverbindung, die den Zugang zu deinem Azure-Abonnement ermöglicht. - Ersetze
your-app-name
durch den tatsächlichen Namen deiner Web-App in Azure. - Ersetze
$(Build.ArtifactStagingDirectory)
durch das Verzeichnis, in dem das Web-App-Paket oder die Dateien für die Bereitstellung abgelegt werden sollen.$(Build.ArtifactStagingDirectory)
- Diese Variable verweist auf den Ordner, in dem sich deine Build-Artefakte (deine App-Dateien) befinden, nachdem sie erstellt worden sind.
Einrichten der kontinuierlichen Bereitstellung (CD)
Wenn unser Code alle Tests und Prüfungen bestanden hat, müssen wir als Nächstes unser Continuous Deployment einrichten. Befolge die unten beschriebenen Schritte.
Azure Release Pipeline Deployment Model (Quelle: Microsoft)
- Erstelle eine Release-Pipeline:
- Gehe zu Pipelines > Freigaben und klicke auf Neue Pipeline.
- Wählen Sie die Azure App Service-Bereitstellung Vorlage.
- Konfiguriere die Umgebungen:
- Hinzufügen und konfigurieren Dev, Staging, QA, und Produktion Umgebungen, in denen deine Anwendung eingesetzt werden soll.
- Verknüpfe das Artefakt aus deiner Build-Pipeline als Quelle für die Release-Pipeline, indem du Artefakt hinzufügen.
- Konfiguriere Genehmigungen und Gates:
- Für sensible Umgebungen, wie z.B. Produktionsumgebungen, ist es notwendig, Genehmigungen vor der Bereitstellung zu erteilen. Zum Beispiel kann es sein, dass ein Teamleiter die Freigabe genehmigen muss. Du kannst auch Gates wie automatische Tests oder Überwachungsprüfungen hinzufügen, um sicherzustellen, dass die Bereitstellung den Qualitätsstandards entspricht.
Meiner Erfahrung nach ist diese Phase notwendig, um die Stabilität in anspruchsvollen Entwicklungsumgebungen zu erhalten. Genehmigungen und Gates sorgen für Kontrolle und stellen sicher, dass nur qualitativ hochwertiger Code in die Produktion gelangt.
Bereitstellung in Kubernetes
Kubernetes macht es einfach, zuverlässige und skalierbare containerisierte Anwendungen zu betreiben. Mit dem Azure Kubernetes Service (AKS) erhältst du eine verwaltete Umgebung, die die Bereitstellung und den Betrieb vereinfacht. In diesem Abschnitt zeige ich dir, wie du deine Anwendung mithilfe von Azure Pipelines in AKS bereitstellst.
Bereite deinen AKS-Cluster vor
Du kannst einen AKS-Cluster über das Azure-Portal oder die CLI erstellen. Hier ist ein einfacher Bash CLI-Befehl zum Bereitstellen von Clustern:
az aks create \
--resource-group <ResourceGroupName> \
--name <AKSClusterName> \
--node-count 3 \
--enable-addons monitoring \
--generate-ssh-keys
Lasst uns den obigen Befehl aufschlüsseln:
--resource-group
: Dies gibt die Azure-Ressourcengruppe an, in der der AKS-Cluster erstellt werden soll.--name
: Dies bezieht sich auf den Namen deines AKS-Clusters.--node-count
: Hier wird die Anzahl der Knoten im Cluster festgelegt (z. B. 3 in diesem Beispiel).--enable-addons monitoring
: Das macht die Überwachung und Analyse mit Azure Monitor for Containers möglich.--generate-ssh-keys
: Dadurch werden automatisch SSH-Schlüssel für den sicheren Zugang zum Knotenpunkt generiert, falls keine Angaben gemacht werden.
Vergiss nicht, und
durch die tatsächlichen Namen deiner Ressourcengruppe und deines Clusters zu ersetzen.
Kubectl muss konfiguriert werden, nachdem dein AKS-Cluster eingerichtet wurde. Dadurch wird sichergestellt, dass dein Pipeline-Agent oder dein lokaler Computer kubectl
verwenden kann, um mit dem Cluster zu kommunizieren.
Du kannst deine Azure-Aufgaben mit Hilfe der Kommandozeile beschleunigen, umols - dieser Azure CLI-Spickzettel ist eine praktische Referenz.
Erstelle eine YAML-Datei für die Bereitstellung
Nehmen wir als Beispiel eine einfache Deployment-YAML-Datei für das Deployment eines Docker-Images in Kubernetes:
# This defines the API version and the kind of Kubernetes resource we are creating.
# 'apps/v1' is the API version, and 'Deployment' is the resource type.
apiVersion: apps/v1
kind: Deployment
# Metadata contains information to identify the resource uniquely.
# 'name' specifies the name of the Deployment.
metadata:
name: my-app # Name of the Deployment, used for identification.
# "spec" specifies the intended deployment state.
spec:
# Number of replicas/pods we want for this Deployment.
replicas: 3 # Ensures high availability by running three app replicas.
# Selector is used to define the labels that this Deployment will manage.
selector:
matchLabels:
app: my-app # This ensures that only Pods with the label 'app: my-app' are managed by this Deployment.
# Template specifies the blueprint for the pods created by the Deployment.
template:
metadata:
labels:
app: my-app # Labels for the Pods, matching the selector above.
# A specification for the containers of the Pods.
spec:
containers:
- name: my-app # Name of the container. This is useful for linking to the container in logs, etc.
image: mycontainerregistry.azurecr.io/my-app:latest # Pull the container image you will call from your container registry.
ports:
- containerPort: 80 # The container listens on port 80.
Bereitstellen mit Azure Pipelines
Füge in deine YAML-Pipeline eine Aufgabe für die Verteilung an AKS ein.
# This defines a task for deploying Kubernetes manifests within an Azure DevOps pipeline.
- task: KubernetesManifest@0 # Task type for working with Kubernetes manifest files.
inputs:
# This configures what to do with the Kubernetes manifest files.
action: 'deploy' # 'deploy' action ensures the Kubernetes manifests are applied to the cluster.
# This defines the namespace where the Kubernetes resources will be deployed.
namespace: 'default' # 'default' is the namespace for deploying resources. Change if needed.
# All this does is point to the manifest files that define the desired state of your Kubernetes resources.
manifests: '$(Build.ArtifactStagingDirectory)/manifests/*.yaml'
# The 'manifests' variable points to the location of all the YAML files (e.g., Deployment, Service, etc.) that will be applied during the deployment.
# To access private container registry images, use the image pull secret.
imagePullSecrets: 'my-registry-secret'
# This instructs Kubernetes on which secret to use when pulling images from a private container registry.
# Ensure that 'my-registry-secret' exists in the namespace before the deploy
Commit und push die YAML-Datei, um das Deployment auszulösen.
AKS vereinfacht die Container-Orchestrierung und erleichtert die Verwaltung von Skalierung, Updates und Rollbacks. Meiner Erfahrung nach ist es ein Muss für moderne Cloud-native Anwendungen.
Werde Azure AZ-900 zertifiziert
Optimieren und Überwachen deiner Pipelines
Früher in meiner Karriere war der Aufbau von Pipelines nicht die größte Herausforderung - eine schnelle und zuverlässige Pipeline zu haben schon. Eine gut optimierte Pipeline sorgt nicht nur für schnellere Builds, sondern verringert auch die Frustration im Team, senkt die Bereitstellungsrisiken und beschleunigt die Bereitstellung.
Ich verrate dir einige Tipps und Strategien, mit denen du deine Azure DevOps Pipelines schnell, organisiert und zuverlässig halten kannst.
Pipeline-Caching
Die Installation von Abhängigkeiten ist ein weiterer häufiger Engpass in der Pipeline. Egal ob du mit npm, .NET oder anderen Paketmanagern arbeitest, das wiederholte Herunterladen der gleichen Abhängigkeiten kann viel Zeit kosten. Das Zwischenspeichern von Abhängigkeiten und Artefakten zwischen den Läufen verkürzt die Ausführungszeit drastisch.
Hier erfährst du, wie du Abhängigkeiten in Azure Pipelines zwischenspeichern kannst.
Zuerst musst du die Paketmanager identifizieren, wie z.B.:
- Node.js (
node_modules
) - NuGet-Pakete
- Python (
pip
Pakete) - Maven/Gradle-Abhängigkeiten
Azure Pipelines unterstützt Caching-Mechanismen, wie z. B. die Aufgabe Cache@2
, mit der du Abhängigkeiten zwischen Pipeline-Läufen zwischenspeichern kannst.
Nehmen wir als Beispiel ein einfaches Caching für Node.js:
# This task is used to cache files to speed up your pipeline.
- task: Cache@2 # This is the task name for caching files in Azure Pipelines.
inputs:
# Key is used to identify the cache. It combines npm (package manager), operating system (OS), and package-lock.json files.
key: 'npm | "$(Agent.OS)" | package-lock.json'
# RestoreKeys is an optional value used when the specific cache key is not found. It helps to find a fallback cache.
restoreKeys: |
npm | "$(Agent.OS)"
# Path defines the location of files or folders to be cached.
# Here, we are caching the 'node_modules' directory to avoid reinstalling dependencies.
path: '$(Build.SourcesDirectory)/node_modules'
# CacheHitVar is a variable that stores whether the cache was successfully used (restored).
# This can be checked later in the pipeline to decide if tasks need to run.
cacheHitVar: 'NPM_CACHE_RESTORED'
Du kannst dann die Installation überspringen, wenn sie im Cache ist. Dies ist ein cleverer Check, bevor du die Installation von npm
abschließt. Es ist eine effiziente bedingungsbasierte Logik.
Nehmen wir unten ein einfaches Beispiel:
# This step runs the command to install Node.js dependencies using npm.
- script: npm install # Installs packages listed in the package.json file.
# The condition checks whether the cache was restored successfully.
# This step will run if the cache is not restored ('NPM_CACHE_RESTORED' is not true).
condition: ne(variables.NPM_CACHE_RESTORED, 'true') # Run only if the cache is not restored.
Dieses Beispiel für einfaches Caching für eine Node.js-Anwendung speichert das Cache-Verzeichnis npm
mit package-lock.json
als Schlüssel. Wenn sich deine Abhängigkeiten nicht ändern, stellt es sie wieder her und spart so bei jedem Build Minuten.
Ich habe erlebt, dass Caching die Erstellungszeit drastisch reduziert, vor allem bei großen Projekten, aber nur, wenn die Cache-Schlüssel sorgfältig ausgewählt werden. In einem meiner letzten Projekte konnte ich so die Erstellungszeit einer Node.js-Anwendung um 55 % reduzieren.
Überwachung des Zustands der Pipeline
Eine erfolgreiche Pipeline besteht nicht nur aus grünen Häkchen, Sichtbarkeit und schnellem Feedback. Wenn etwas kaputt geht, soll dein Team sofort Bescheid wissen. Hier erfährst du, wie du den Problemen einen Schritt voraus bist.
Wie man Azure DevOps Dashboards einrichtet
Azure DevOps bietet integrierte Widgets zur Anzeige des Pipelinestatus, der letzten Läufe, der Fehlerraten und der durchschnittlichen Dauer.
- Zuerst navigierst du zu Dashboards unter deinem Projekt.
- Klicken Sie dann auf Neues Dashboard oder verwende ein bestehendes.
- Du kannst Widgets hinzufügen wie: Geschichte bauen, Übersicht über die Release Pipeline, Testergebnisse Trendund mehr.
Diese Lernpfade sind wichtig, um Trends beim Bestehen und Nichtbestehen zu verfolgen, zu sehen, welche Umgebungen problematisch sind, und vieles mehr.
Konfigurieren von Warnungen für fehlgeschlagene Pipelines
- Gehe unten links in deinem Projekt auf Projekt-Einstellungen.
- Klick Benachrichtigungen.
- Dann klicken Sie auf Neues Abonnement.
Gehen wir von einem Szenario aus: Im Abschnitt Kategorie wählst du Build; im Abschnitt Vorlage wählst du "A build fails" und klickst auf Weiter.
Du hast eine Schnittstelle wie die folgende:
- Klicken Sie abschließend auf Fertigstellen.
- In den Benachrichtigungen Abschnitt kannst du die Build Beschreibung auf den "Ein Build schlägt fehl" überprüfen, die wir zuvor erstellt haben.
Ich habe einmal einen kritischen Einsatzfehler verpasst, weil keine Warnmeldungen eingerichtet waren. Seitdem habe ich für jeden Produktionseinsatz Teamwarnungen eingerichtet und konfiguriert. Auf diese Weise verpasse ich nie einen fehlerhaften Build oder eine Verzögerung in meinem Veröffentlichungszyklus.
Analyse der Pipeline-Leistung
Wir wissen, dass deine Pipeline, selbst wenn sie funktioniert, langsam sein kann und langsame Pipelines die Produktivität beeinträchtigen. Das frühzeitige Erkennen von Engpässen spart also später Ärger.
Pipeline-Metriken geben Aufschluss über die Leistung von Builds und Deployments. So kommst du an sie heran.
Zuerst musst du Folgendes aktivieren Analytics-Ansichten unter den Projekteinstellungen und eine Verbindung zu Power BI herstellen oder über die integrierten Diagramme erkunden.
Den Zustand der Pipeline überwachen
- Unter den Pipelines Abschnitt, gehen Sie zu Analytik.
- Sieh dir Kennzahlen wie die Durchlaufrate der Pipeline, die Durchlaufrate der Tests und die Dauer der Pipeline an.
Wir wollen uns genauer ansehen, welche wichtigen Kennzahlen wir in der Analytik überwachen können und warum sie wichtig sind:
Metrisch |
Warum es wichtig ist |
Trends der Baudauer |
So kannst du Verlangsamungen im Laufe der Zeit leicht erkennen. |
Ausfallrate nach Branche |
Dies hilft, instabile Merkmale zu erkennen. |
Zeit in der Warteschlange |
Dies hilft, Engpässe bei den Agenten zu erkennen. |
Vor ein paar Monaten habe ich an der Pipeline eines Kunden gearbeitet, undwas dabei besonders auffiel, war die Time in Queue. Ich habe einmal festgestellt, dass mein Team und ich einen selbst gehosteten Agentenpool überlastet hatten und 40 % unserer Pipelinezeit damit verbracht haben, auf einen verfügbaren Runner zu warten. Niemand hat es kommen sehen, bis die Analysen es offensichtlich gemacht haben.
Wir könnten das beheben, indem wir zwei weitere selbst gehostete Agenten hinzufügen und die Last nach Auftragsart verteilen. Die Ergebnisse zeigten sich sofort: Die durchschnittliche Bauzeit für die Pipeline sank um etwa 35 %.
Überwachung anhand von Protokollen
Abgesehen von den Metriken sind die Timeline-Logs also Gold wert, vor allem bei lang laufenden Aufgaben. Im Laufe der Jahre habe ich in kritischen Schritten von Skripten immer wieder benutzerdefinierte Protokollmarkierungen eingefügt, um genaue Verzögerungen festzustellen.
Lass uns ein einfaches Beispiel nehmen:
# This step prints a message to the console in the pipeline logs.
# It helps to mark the start of the dependency installation process.
echo "=== START: Dependency Install ===" # Display a message indicating the beginning of dependency installation.
Werde Azure AZ-900 zertifiziert
Best Practices für Azure Pipelines
Nachdem wir uns nun mit den Kerndiensten von Azure Pipelines und vielen weiteren Diensten befasst haben, wollen wir uns nun ansehen, wie du das Beste aus ihnen herausholen kannst, indem du diese Best Practices befolgst.
Lass uns von der Leistung zur Struktur übergehen, denn eine schnelle Pipeline, die schwer zu pflegen ist, schadet jedem Team.
Organisieren von Pipelines für Teams
Wenn mehrere Teams oder Umgebungen Pipelines gemeinsam nutzen, wird es oft unübersichtlich. Du wirst Struktur brauchen. Eine riesige Pipeline für Entwicklungs-, Staging- und Produktionsumgebungen führt zu Chaos.
Um deine Pipeline zu organisieren, musst du sie in Umgebungen unterteilen. Schauen wir uns im Folgenden eine einfache Strukturan.
Umwelt |
Pipeline Name |
Auslöser |
Entwicklung |
|
Feature-Zweige (Läuft bei jedem Commit) |
Inszenierung |
|
Pull Requests → Staging (Manueller Trigger) |
Produktion |
|
Manuelle oder freigegebene Pipelines (Genehmigung erforderlich) |
Die wichtigsten Dinge, die du aus dieser einfachenStruktur verstehen kannst:
- Jede Datei wird aus gemeinsamen Vorlagen gezogen.
- Jede Datei verwendet umgebungsspezifische Variablen.
- Jede Datei steuert den Zugriff über Pipeline-Berechtigungen.
Die Erfahrung zeigt, dass diese Trennung das Debugging erleichtert und es jüngeren Entwicklern ermöglicht, in der Entwicklungsumgebung zu arbeiten, ohne die Produktionsumgebung zu gefährden.
Vorlagen und wiederverwendbaren Code verwenden
Bei DevOps geht es darum, manuelle Arbeitsabläufe zu reduzieren und die Automatisierung des gesamten Softwareentwicklungsprozesses zu verbessern.
YAML-Code ist fehleranfällig, wenn er zwischen Projekten kopiert und eingefügt wird. Azure DevOps bietet Pipeline-Vorlagen für die DRY-Einrichtung (Don't Repeat Yourself) über YAML-Pipelines. Du kannst die YAML-Pipeline-Vorlagen projektübergreifend wiederverwenden, deine Pipelines einheitlich gestalten und sogar die Bearbeitungszeit der Pipelines reduzieren.
Nehmen wir ein einfaches wiederverwendbares Build-Template als Beispiel.
Definiere zunächst deine Build-Vorlage, build-template.yml
:
# Here we configure the platform and the build configuration.
parameters:
buildPlatform: 'Any CPU' # This specifies the build platform (e.g., Any CPU, x86, x64).
buildConfiguration: 'Release' # This specifies the build configuration (Release) to avoid warning.
# A pipeline is composed of steps (a series of tasks that will be executed)
steps:
- task: DotNetCoreCLI@2 # Task for running .NET Core commands in the pipeline.
inputs:
command: 'build' # This runs the 'build' command to compile the project(s).
projects: '**/*.csproj' # This specifies to build all .csproj files in the repository.
arguments: '--configuration ${{ parameters.buildConfiguration }}'
# This passes the build configuration parameter (e.g., Release or Debug) to the command.
Verwende deine Build-Vorlage in deiner Hauptpipeline:
# A pipeline job is a group of tasks. Here, the job is named 'Build'.
jobs:
- job: Build # The job name where the build process occurs.
# Steps define the tasks or actions the pipeline will perform.
steps:
- template: templates/build-template.yml # Reference an external YAML template for reusable steps.
Geheimnisse und Variablen verwalten
Bei der Arbeit an Projekten, insbesondere in kollaborativen Umgebungen, ist es üblich, sensible Informationen wie Datenbankverbindungsstrings, API-Schlüssel, Passwörter oder Token zu verwenden. Wenn diese Geheimnisse in deinem Code fest kodiert sind oder in Protokollen auftauchen, können sie leicht kompromittiert werden.
Sehen wir uns an, wie wir unsere Geheimnisse und Variablen mit Azure Pipelines Geheimnissen und Variablengruppen sicher verwalten können.
Schritt 1: Erstellen einer Variablengruppe
- Klicken Sie auf die Pipelines Registerkarte in der linken Seitenleiste.
- Klicken Sie im Abschnitt Pipelines auf Bibliothek.
- Erstelle eine Variablengruppe:
- Klicken Sie auf die Variablengruppen Registerkarte.
- Klicken Sie auf das Feld Variablengruppe hinzufügen Schaltfläche.
- Gib einen Namen für deine Variablengruppe ein (z. B.
MyAppSecrets
).
Schritt 2: Hinzufügen von Geheimnissen zur Variablengruppe
- Variablen hinzufügen:
- In der Variablengruppe klickst du auf Hinzufügen um eine neue Variable zu erstellen.
- Gib den Namen der Variablen ein (z. B.
DB_CONNECTION_STRING
). - Markiere das Kästchen mit der Aufschrift Diesen Wert geheim halten um sicherzustellen, dass er als Geheimnis behandelt wird.
- Gib den Wert der Variablen ein (z. B. den Verbindungsstring meiner Datenbank).
- Klicke auf Speichern um die Variable zu speichern.
Schritt 3: Geheimnisse in deiner Pipeline verwenden
Jetzt, wo du eine Variablengruppe mit Geheimnissen erstellt hast, kannst du diese Variablen in deiner Pipeline-YAML-Datei verwenden.
- Verweise auf die Variablengruppe: Füge die Variablengruppe zu deiner Pipeline-YAML-Datei hinzu:
variables:
- group: MyAppSecrets
- Nutze die Geheimnisse in deinen Schritten: Du kannst die Geheimnisse in deinen Pipelineschritten mit der Syntax
$(VariableName)
referenzieren. Hier ist ein Beispiel dafür, wie duDB_CONNECTION_STRING
in einem Scriptschritt verwenden kannst:
# This defines the trigger for the pipeline.
# The pipeline runs automatically whenever changes are pushed to the 'main' branch.
trigger:
- main # Trigger the pipeline on changes to the 'main' branch.
# The pool specifies the environment where the pipeline will run.
# 'ubuntu-latest' means the pipeline will use the latest Ubuntu operating system image.
pool:
vmImage: 'ubuntu-latest' # Use the latest Ubuntu image provided by Azure Pipelines.
# Variables section defines reusable values for the pipeline.
# 'group: MyAppSecrets' links to a variable group that stores sensitive information like secrets.
variables:
- group: MyAppSecrets # Load secrets, such as database credentials, from a variable group.
# Steps define the tasks that the pipeline will execute one by one.
steps:
- script: |
echo "Connecting to the database..." # Print a message indicating the start of database connection.
echo "Connection String: $(DB_CONNECTION_STRING)" # Display the database connection string from the variable group.
displayName: 'Connect to Database' # A simple name for this step that appears in the pipeline logs.
Schritt 4: Betrieb der Pipeline
- Sobald du deine YAML-Datei gespeichert hast, gehst du zu den Pipelines und klicke auf Pipeline ausführen.
- Nachdem die Pipeline gelaufen ist, kannst du deine Logs überprüfen. Du wirst feststellen, dass der geheime Wert versteckt ist, damit deine sensiblen Informationen sicher sind.
Fazit
In diesem Tutorial gehen wir den gesamten Weg der Nutzung von Azure Pipelines durch - vom Einrichten deiner ersten Pipeline bis hin zum Aufbau, Testen, Bereitstellen, Überwachen und Optimieren.
Die Einführungsphase erfordert Übung. Fange einfach an, verbessere dich ständig und mit der Zeit wirst du Vertrauen und Sicherheit im Umgang mit CI/CD-Workflows gewinnen. Azure Pipelines gibt dir die Werkzeuge, du bringst die Iteration und das Lernen mit.
Mit konsequenter Arbeit kannst du deinen Entwicklungsprozess optimieren und sicher sein, dass du qualitativ hochwertige Software in großem Umfang bereitstellen kannst.
Um tiefer in Azure DevOps und Microsoft Azure einzutauchen, schaudir die folgenden Ressourcen an:
- Azure DevOps Tutorial - Dieses Tutorial führt dich durch Azure DevOps und macht CI/CD einfacher denn je.
- Microsoft Azure verstehen - Schaffe dir eine solide Grundlage in Microsoft Azure und nutze die Möglichkeiten des Cloud Computing.
- Microsoft Azure Grundlagen (AZ-900) - Mach dich mit diesem einsteigerfreundlichen Lernpfad, der alle wichtigen Azure-Grundlagen abdeckt, fit für die Prüfung.
- Die Architektur und Dienste von Microsoft Azure verstehen - Lerne, wie die Architektur und die Dienste von Azure zusammenarbeiten, um Cloud-Lösungen zu ermöglichen.
FAQs
Kann ich Azure Pipelines für Nicht-Azure-Projekte nutzen?
Ja, das kannst du. Azure Pipelines unterstützt die Bereitstellung in On-Premise- und verschiedenen Cloud-Umgebungen wie AWS, GCP und vielen mehr.
Welche Programmiersprachen werden von Azure Pipelines unterstützt?
Azure Pipelines unterstützt viele Programmiersprachen, darunter Node.js, Python, Java, .NET und viele mehr.
Was ist der Unterschied zwischen Azure Pipelines und GitHub Actions?
Azure Pipelines bietet eine tiefere Integration mit dem Azure-Ökosystem und robuste Deployment-Tools, während GitHub Actions ein einfacheres, GitHub-natives CI/CD-Erlebnis bietet. Beide unterstützen YAML-Workflows und containerisierte Bereitstellungen.
Kann ich Azure Pipelines mit Nicht-Microsoft-Technologien wie Python oder Java nutzen?
Ja, Azure Pipelines unterstützt alle wichtigen Plattformen und Sprachen, einschließlich Python, Java, Node.js und mehr. Du kannst Builds und Deployments für jeden Tech Stack mit YAML konfigurieren.
Ist die Nutzung von Azure Pipelines kostenlos?
Azure Pipelines bietet einen kostenlosen Tier mit 1.800 Minuten/Monat für öffentliche Projekte und begrenzte private Bauzeit. Zusätzliche Nutzung erfordert einen kostenpflichtigen Plan oder selbst gehostete Agenten.
Was sind Azure DevOps Service Connections, und warum sind sie wichtig?
Service Connections verbinden Azure Pipelines sicher mit externen Diensten wie Azure Web Apps oder Kubernetes-Clustern. Sie sind unverzichtbar für die automatisierte Bereitstellung und Verwaltung der Infrastruktur.
Wie ist Azure Pipelines im Vergleich zu Jenkins oder CircleCI?
Azure Pipelines bietet eine besser integrierte Erfahrung für Azure-Nutzer und eine bessere Unterstützung für Microsoft-Dienste. Jenkins ist besser anpassbar, erfordert aber mehr Einrichtungsaufwand; CircleCI zeichnet sich durch Geschwindigkeit und Parallelität aus.
Emmanuel Akor ist ein Cloud- und DevOps-Ingenieur, der sich mit der Nutzung von Cloud-Technologien und DevOps-Tools auskennt, um wirkungsvolle Projekte voranzutreiben. Emmanuel hat einen erstklassigen Abschluss in Informatik von der Babcock University und war früher Cloud Co-Lead bei GDSC. Als Technical Content Writer zeichnet er sich dadurch aus, dass er Wissen weitergibt und mit Teams zusammenarbeitet.