Azure DevOps YAML-Pipelines bieten einen strengen, versionengesteuerten Ansatz für Continuous Integration und Continuous Delivery (CI/CD), der perfekt zu modernen Software-Delivery-Praktiken passt. Durch die Kodierung der gesamten Pipeline-Definition in YAML-Dateien, die neben Anwendungscode gespeichert sind, erreichen Teams Transparenz, Wiederholbarkeit und Hörbarkeit, die grafische Editoren nicht erreichen können. Dieser Ansatz verwandelt die Pipeline von einer Black Box in einen erstklassigen Bürger der Codebasis, vorbehaltlich der gleichen Überprüfung, Verzweigung und Historie-Tracking wie der Quellcode selbst.

Ob Sie Builds für eine Microservices-Architektur automatisieren, Infrastruktur als Code bereitstellen oder komplexe Workflows für Multi-Umgebungen-Releases orchestrieren, Azure DevOps YAML-Pipelines bieten Ihnen die Kontrolle, Flexibilität und Skalierbarkeit, die erforderlich sind, um Software zuverlässig zu liefern. Dieser Artikel bietet einen detaillierten Einblick in das, was YAML-Pipelines sind, wie sie erstellt werden, erweiterte Muster und bewährte Best Practices aus Produktionsumgebungen.

Was sind Azure DevOps YAML Pipelines?

Azure DevOps YAML-Pipelines sind deklarative Konfigurationsdateien, die die Schritte, Phasen, Jobs und Abhängigkeiten definieren, die zum Erstellen, Testen und Bereitstellen von Anwendungen erforderlich sind. Im Gegensatz zum klassischen Editor, der Pipelinedefinitionen in der Azure DevOps-Dienstdatenbank speichert, existieren YAML-Pipelines als Textdateien in Ihrem Repository - typischerweise mit dem Namen oder unter einem -Verzeichnis. Diese Datei enthält die gesamte Pipelinedefinition in einem strukturierten Format, das Azure DevOps zur Laufzeit analysiert.

Die Pipeline-Datei kann auf andere YAML-Dateien (Vorlagen) für wiederverwendbare Logik verweisen, bedingte Anweisungen, dynamische Variablen enthalten und sogar unterschiedliche Verhaltensweisen basierend auf Branch-, Tag- oder Pfadfiltern auslösen.

Kernkomponenten von YAML Pipelines

Eine YAML-Pipeline besteht aus mehreren hierarchischen Elementen, die zusammenarbeiten: trigger, variablen, stages, jobsstepstemplates Das Verständnis dieser Bausteine ist für das Schreiben von wartbaren und effizienten Pipelines unerlässlich.

Stufen, Jobs und Schritte

Stages stellen wichtige Divisionen in der Pipeline dar, wie Build, Test und Deployment. Sie können sequentiell oder parallel ausgeführt werden. Innerhalb jeder Phase definieren jobs die Ausführungsumgebung (Agentenpool oder Container) und enthalten eine Sequenz von steps. Steps sind die kleinste Arbeitseinheit – ein auszuführendes Skript, eine auszuführende Aufgabe oder eine Vorlage, die enthalten ist. Azure DevOps bietet Hunderte von integrierten Aufgaben für gängige Operationen wie das Installieren von Abhängigkeiten, das Ausführen von Tests oder das Veröffentlichen von Artefakten.

Auslöser

Trigger definieren, wann die Pipeline automatisch starten soll. Am häufigsten ist der CI-Trigger, der Commits an bestimmte Zweige (z. B. , ) auslöst. Sie können auch PR-Trigger für Pull Request Validierung, Zeitplan-Trigger für nächtliche Builds und Pfadfilter verwenden, um die Triggerung auf Änderungen in bestimmten Verzeichnissen zu begrenzen. Erweiterte Triggerkonfigurationen ermöglichen es Ihnen, Platzhalter zu verwenden, Pfade auszuschließen oder bedingt auf Basis von Tags zu laufen.

trigger:
 branches:
 include:
 - main
 - releases/*
 paths:
 exclude:
 - docs/*
 - README.md

Variablen und Parameter

Variables speichert Werte, die in der gesamten Pipeline verwendet werden können – Verbindungszeichenfolgen, Versionsnummern oder Umgebungsnamen. Sie können auf Pipeline-, Bühnen- oder Job-Ebene definiert und zur Warteschlange überschrieben werden. Parameter sind ein leistungsfähigerer Mechanismus zur Einführung von Laufzeitoptionen (z. B. in welche Umgebung sie bereitgestellt werden sollen) und sind besonders nützlich in Vorlagen. Parameter unterstützen Standardwerte, Typeinschränkungen und bedingte Logik.

Azure DevOps unterstützt auch geheime Variablen, die verschlüsselt sind und niemals in Protokollen angezeigt werden.Für produktionsfähige Geheimnisse integrieren Sie sich mit Azure Key Vault mit der Aufgabe "Azure Key Vault" oder der Variablengruppenreferenz.

Vorlagen für die Wiederverwendbarkeit

Templates sind eine der leistungsstärksten Funktionen von YAML-Pipelines. Sie ermöglichen es Ihnen, gemeinsame Logik in separate YAML-Dateien zu faktorisieren und sie in mehrere Pipelines einzuschließen. Es gibt zwei Arten: job-Vorlagen und step-Vorlagen.job-Vorlagen kapseln einen ganzen job (einschließlich pool, Variablen und steps), während step templates wiederverwenden eine Gruppe von Schritten über jobs oder Phasen.

Vorlagen unterstützen Parameter, was sie flexibel macht. Zum Beispiel können Sie eine "Build-Node-App.yml"-Vorlage erstellen, die eine Node.js-Version als Parameter verwendet und npm-Installation, Build und Test ausführt. Jede Pipeline, die eine Node.js-App erstellen muss, kann diese Vorlage einfach mit der entsprechenden Version enthalten. Dadurch werden Duplizierungen vermieden und die Konsistenz zwischen den Projekten sichergestellt.

# templates/build-node-app.yml
parameters:
- name: nodeVersion
 type: string
 default: '18.x'

steps:
- task: NodeTool@0
 inputs:
 versionSpec: ${{ parameters.nodeVersion }}
- script: npm install
 displayName: 'Install dependencies'
- script: npm run build
 displayName: 'Build application'
- script: npm test
 displayName: 'Run tests'

Hauptvorteile von Version-Controlled CI/CD

Die Einführung von YAML-Pipelines bringt mehrere konkrete Vorteile gegenüber klassischen, UI-basierten Pipelines:

  • Vollversionskontrolle: Jede Änderung an der Pipeline wird im selben Repository wie der Anwendungscode verfolgt. Sie können Pipelineänderungen mithilfe von Standard-Git-Workflows diffen, kommentieren und zurückrollen. Dadurch wird das Rätsel "Wer hat die Pipeline geändert" eliminiert und sichergestellt, dass die Pipelinedefinition immer mit dem Code synchronisiert ist, den sie erstellt.
  • Reproduzierbarkeit und Auditierbarkeit: Da die Pipeline als Code definiert ist, können Sie jeden Commit mit genau den gleichen Schritten, Variablen und Abhängigkeiten wie beim ersten Erstellen neu erstellen.
  • Automatisierung über Builds hinaus: YAML-Pipelines unterstützen bedingte Logik, Schleifen und komplexe Ausdrücke mit der Ausdruckssprache von Azure DevOps. Sie können anspruchsvolle Workflows implementieren, wie z. B. die Bereitstellung in mehreren Regionen parallel, die Durchführung von Rauchtests nur auf Release-Zweigen oder das Auslösen von nachgelagerten Pipelines.
  • Portabilität: YAML-Pipelines können zwischen Projekten kopiert, über Teams hinweg wiederverwendet und sogar zum Bootstrap von CI/CD für neue Repositories verwendet werden. Vorlagen verbessern diese Portabilität weiter, indem sie es Teams ermöglichen, gemeinsame Pipeline-Logik zentral zu teilen und zu pflegen.
  • Zusammenarbeit und Code-Review: Pipeline-Änderungen unterliegen dem gleichen Pull-Request-Review-Prozess wie Quellcode. Dies fördert Best Practices wie Peer-Review von Infrastrukturänderungen, reduziert Fehlkonfigurationen und fördert eine Kultur der DevOps-Zusammenarbeit.

Erstellen einer versiongesteuerten YAML-Pipeline

Das Einrichten einer YAML-Pipeline von Grund auf ist einfach.

  1. Entscheiden Sie über eine Dateistruktur. Sie können Ihre Hauptpipelinedatei am Stamm des Repositorys () oder in einem dedizierten Ordner wie ablegen. Der letztere Ansatz lässt sich besser skalieren, wenn Sie mehrere Pipelines haben.
  2. Schreibe die Pipeline-Definition. Beginne mit einer minimal gültigen YAML-Datei, die einen Trigger, einen Pool (Agent VM-Image oder Container) und mindestens einen Job enthält.
  3. Speichern Sie die Datei in Ihrem Repository. Begehen Sie den Befehl und drücken Sie ihn zur Fernbedienung, wobei Sie sicherstellen, dass sich die Datei in dem Branch befindet, den Sie als Standardzweig für die Pipeline verwenden möchten.
  4. Erstellen Sie die Pipeline in Azure DevOps. Navigieren Sie zu Pipelines > Erstellen Sie Pipeline, wählen Sie "Azure Repos Git" (oder Ihre gewählte Quelle), wählen Sie das Repository und wählen Sie dann "Existing Azure Pipelines YAML file". Zeigen Sie auf den Dateipfad, den Sie gerade erstellt haben (z. B. . Azure DevOps analysiert die YAML und zeigt eine Vorschau an.
  5. Bestätigen und ausführen. Klicken Sie auf "Run", um die Pipeline zum ersten Mal auszuführen. Sie können die Ausgabe in Echtzeit überwachen. Nachfolgende Commits zu den auslösenden Zweigen starten automatisch neue Runs.

Für bestehende Projekte, die bereits eine klassische Pipeline haben, können Sie zu YAML migrieren, indem Sie die Pipelinedefinition exportieren oder mit dem YAML-Editor neu erstellen. Microsoft bietet einen Migrationsleitfaden , um den Übergang zu erleichtern.

Begehbarkeit der Probenpipeline

Betrachten wir eine realistischere Pipeline für eine Node.js-Webanwendung, die ein Artefakt erstellt, testet, veröffentlicht und in einer Staging-Umgebung bereitstellt. Dieses Beispiel zeigt mehrstufige Variablen und bedingte Bereitstellung.

trigger:
 branches:
 include:
 - main
 - develop
 paths:
 exclude:
 - 'README.md'

variables:
 nodeVersion: '18.x'
 artifactName: 'webapp'

stages:
- stage: Build
 displayName: 'Build and Test'
 jobs:
 - job: BuildJob
 pool:
 vmImage: 'ubuntu-latest'
 steps:
 - task: NodeTool@0
 inputs:
 versionSpec: $(nodeVersion)
 - script: npm install
 displayName: 'Install dependencies'
 - script: npm run lint
 displayName: 'Lint code'
 - script: npm run build
 displayName: 'Build application'
 - script: npm test
 displayName: 'Run unit tests'
 - task: PublishBuildArtifacts@1
 inputs:
 PathtoPublish: 'dist'
 ArtifactName: $(artifactName)

- stage: DeployStaging
 displayName: 'Deploy to Staging'
 dependsOn: Build
 condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
 jobs:
 - deployment: DeployJob
 pool:
 vmImage: 'ubuntu-latest'
 environment: staging
 strategy:
 runOnce:
 deploy:
 steps:
 - download: current
 artifact: $(artifactName)
 - script: echo "Deploying artifact to staging server..."
 displayName: 'Deploy step'
 - script: echo "Running smoke tests..."
 displayName: 'Smoke test'

Diese Pipeline zeigt:

  • Trigger mit Pfadausschluss – Dokumentationsänderungen lösen keinen vollständigen Build aus.
  • Variablen], die oben für die Wiederverwendbarkeit definiert sind.
  • Zwei Stufen – Build (Nicht-Bereitstellung) und DeployStaging (Bereitstellungsauftrag).
  • Bereitstellungsjob mit dem Schlüsselwort, das Rückverfolgbarkeit, Genehmigungen und Gates ermöglicht.
  • Artifact Publishing and Download – die Build-Ausgabe wird gespeichert und später von der Bereitstellungsstufe abgerufen.

Fortgeschrittene Muster

Multi-Stage mit manuellen Genehmigungen

Azure DevOps YAML-Pipelines unterstützen Umgebungen mit manuellen Genehmigungsprüfungen. Sie können von bestimmten Benutzern oder Gruppen verlangen, dass sie eine Bereitstellung genehmigen, bevor sie fortgesetzt wird. Dies wird in der YAML definiert, indem auf eine Umgebung verwiesen wird, für die Genehmigungen konfiguriert sind.

- stage: DeployProduction
 dependsOn: DeployStaging
 condition: succeeded()
 jobs:
 - deployment: ProdDeployment
 pool:
 vmImage: 'ubuntu-latest'
 environment: production
 strategy:
 runOnce:
 deploy:
 steps:
 - script: echo "Deploying to production..."

Bedingte Ausführung

Verwenden Sie Ausdrücke wie , um zu steuern, welche Phasen, Jobs oder Schritte ausgeführt werden. Azure DevOps unterstützt eine Rich Ausdruckssprache mit Funktionen für die String-Manipulation, logische Operatoren und Sammelprüfungen.

Container verwenden

Anstatt ein VM-Image zu verwenden, können Sie ganze Jobs in einem Container ausführen. Dies ist ideal, um konsistente Umgebungen in der Entwicklung und CI/CD zu gewährleisten. Geben Sie einfach ein -Element unter dem Job oder Pool an.

pool:
 vmImage: 'ubuntu-latest'
container: node:18-alpine

Best Practices für YAML Pipelines

Anhand von Produktionsimplementierungen sind hier die wichtigsten Praktiken aufgeführt, um Ihre Pipelines robust und wartbar zu halten:

  • Vorlagen frei verwenden. Gemeinsame Schritte in parametrierte Vorlagen extrahieren. Dies reduziert die Duplizierung und macht es einfach, Standards durchzusetzen (z. B. eine Sicherheits-Scan-Vorlage, die alle Projekte ausführen müssen).
  • Halten Sie YAML-Dateien klein und fokussiert. Eine einzelne monolithische Datei wird schwer zu lesen und zu debuggen. Split in mehrere Dateien organisiert nach Bühne oder Funktion (z. B. , , ).
  • Sichere Geheimnisse mit Azure Key Vault. Vermeiden Sie Hardcoding-Passwörter, API-Schlüssel oder Zertifikate. Verwenden Sie Variablengruppen, die mit Key Vault verknüpft sind, und verweisen Sie auf diese in Ihrer Pipeline. Azure DevOps ruft automatisch die neuesten Werte zur Laufzeit ab.
  • Validieren Sie die YAML-Syntax vor dem Begehen. Verwenden Sie ein linter- oder IDE-Plugin, um Einrückungsfehler und fehlende Tasten zu erkennen. Azure DevOps bietet auch eine Schaltfläche "Validieren" im Pipeline-Editor.
  • Nennen Sie Ressourcen klar. Geben Sie Stufen, Jobs und Schritte sinnvolle Werte an. Dies verbessert die Lesbarkeit in Protokollen und Visualisierungen erheblich.
  • Verwende Pipeline-Caching, um Builds zu beschleunigen. Cache-Abhängigkeiten wie oder NuGet-Pakete, um zu vermeiden, dass sie bei jedem Lauf erneut heruntergeladen werden. Azure DevOps stellt zu diesem Zweck eine -Aufgabe bereit.
  • Implementieren Sie einen frühen Fehler. Fail the pipeline as quickly as possible. Führen Sie Linting- und Syntax-Checks vor teuren Integrationstests aus. Verwenden Sie die -Option in Skriptaufgaben, um Warnungen zu fangen, die in Fehler umgewandelt wurden.
  • Dokumentieren Sie Ihre Pipeline. Fügen Sie Kommentare in die YAML-Datei ein, die nicht offensichtliche Optionen erläutern, insbesondere wenn Sie Ausdrücke oder bedingte Logik verwenden.

Integration mit anderen Tools

Azure DevOps YAML-Pipelines integrieren sich nativ mit zahlreichen Diensten.

  • SonarQube für die kontinuierliche Codequalitätskontrolle – fügen Sie eine SonarQubePrepare-Task vor dem Build und eine SonarQubeAnalyze-Task danach hinzu.
  • Docker für Container Builds – Verwenden Sie die Docker@2-Task, um Bilder zu erstellen und in Azure Container Registry oder Docker Hub zu schieben.
  • GitHub – YAML-Pipelines können so konfiguriert werden, dass sie mit GitHub-Repositories funktionieren, nicht nur mit Azure Repos.
  • ServiceNow für Change Management – die ServiceNow Change Management-Erweiterung ermöglicht es Pipelines, während der Bereitstellung Änderungsanforderungen zu erstellen und zu aktualisieren.

Eine vollständige Liste der verfügbaren Aufgaben finden Sie in der Dokumentation Azure Pipelines Tasks.

Häufige Fallstricke und wie man sie vermeidet

Selbst erfahrene Teams stoßen gelegentlich auf Probleme mit YAML-Pipelines.

  • Invalid YAML Syntax – Trailing Spaces, Inconsistent Indention (YAML erlaubt keine Tabs).
  • Unklare Variablen-Scoping – Variablen, die auf der obersten Ebene definiert sind, überschreiben Stufe/Job-Variablen, es sei denn, Sie verwenden die Makrosyntax richtig.
  • Missfigurierte Trigger – vergessen, Triggerergebnisse in der Pipeline zu setzen, die nur mit manuellen oder geplanten Triggern ausgeführt werden.
  • Das Ignorieren der Agentenpoolkapazität – die Verwendung eines privaten Agentenpools, ohne sicherzustellen, dass genügend Agenten Verzögerungen oder Ausfälle verursachen können.
  • Keine Pipeline-Änderungen testen – Führen Sie immer einen Test-Build auf einem Branch aus, bevor Sie mit Main fusionieren.

Schlussfolgerung

Azure DevOps YAML-Pipelines stellen einen ausgereiften, code-first-Ansatz für CI/CD dar, der von kleinen Projekten bis hin zu Release-Engineering auf Unternehmensebene skaliert. Durch die Versionskontrolle von Pipeline-Definitionen gewinnen Teams Transparenz, Reproduzierbarkeit und eine nahtlose Brücke zwischen Entwicklung und Betrieb. Die YAML-Syntax ist ausdrucksstark genug, um komplexe Workflows zu modellieren, aber strukturiert genug, um lesbar und wartbar zu bleiben, wenn sie mit Vorlagen und Best Practices gepaart wird.

Bei der Einführung von versiongesteuerten Pipelines geht es nicht nur um Automatisierung, sondern darum, den Bereitstellungsprozess mit der gleichen Strenge wie den Anwendungscode zu behandeln. Für Teams, die die Bereitstellungshäufigkeit erhöhen, manuelle Fehler reduzieren und die Zusammenarbeit verbessern möchten, sind Azure DevOps YAML-Pipelines eine bewährte Grundlage. Beginnen Sie mit der Definition einer einfachen Pipeline für Ihr Projekt und fügen Sie dann schrittweise Stufen, Vorlagen und Integrationen hinzu, wenn Ihre Reife wächst.