Azure Pipelines sind ein mächtiges Werkzeug für Continuous Integration und Continuous Delivery (CI/CD). Sie ermöglichen es uns, unsere Softwarebuilds, Tests und Deployments zu automatisieren. Eine der Herausforderungen bei der Verwendung von Pipelines besteht darin, Daten – insbesondere Variablen – zwischen verschiedenen Stages effizient zu teilen. Dieser Artikel erklärt, wie Sie dies erfolgreich bewerkstelligen, um Ihren Workflow zu optimieren.
Warum Variablen zwischen Stages teilen?
Bevor wir uns den Techniken widmen, wollen wir verstehen, warum das Teilen von Variablen so wichtig ist. In komplexen Pipelines, die aus mehreren Stages bestehen (z.B. Build, Test, Deployment), werden oft Informationen in einer Stage erzeugt, die in einer anderen benötigt werden. Beispiele hierfür sind:
- Build-Nummern: Eine Build-Nummer wird während des Build-Prozesses generiert und muss im Deployment-Schritt verfügbar sein, um Artefakte zu taggen oder zu versionieren.
- Artefakt-Pfade: Der Pfad zu den erstellten Artefakten ist im Deployment-Schritt entscheidend, um diese Artefakte zu finden und zu deployen.
- Versionsnummern: Die Version der Software, die gebaut wurde, muss für Deployments und Releases verfügbar sein.
- Konfigurationseinstellungen: Umgebungsspezifische Konfigurationen, die in einer Stage festgelegt werden, müssen in nachfolgenden Stages verwendet werden.
- Testergebnisse: Das Ergebnis von Unit Tests, Integration Tests oder End-to-End Tests kann in den nachfolgenden Stages verwendet werden, um zu entscheiden, ob ein Deployment stattfinden soll oder nicht.
Ohne die Möglichkeit, Variablen zwischen Stages zu teilen, müssten Sie diese Informationen redundant erzeugen oder manuell übergeben, was fehleranfällig und ineffizient wäre. Durch das Teilen von Variablen können Sie einen reibungsloseren, automatisierteren und nachvollziehbareren Workflow erreichen.
Methoden zum Teilen von Variablen zwischen Stages
Azure Pipelines bietet verschiedene Möglichkeiten, Variablen zwischen Stages zu teilen. Wir werden uns die gängigsten und effektivsten Methoden genauer ansehen:
1. Output-Variablen (Stage-Level)
Die empfohlene Methode zum Teilen von Variablen zwischen Stages ist die Verwendung von Output-Variablen. Diese Variablen werden in einem Task einer Stage definiert und können dann in nachfolgenden Stages verwendet werden. Dies ist die sauberste und expliziteste Methode.
So funktioniert’s:
- Definieren einer Output-Variable in einem Task: Innerhalb eines Tasks (z.B. einem Bash-Script oder einer PowerShell-Script) setzen Sie die Output-Variable mit der Pipeline-Befehlssyntax:
##vso[task.setvariable variable=VariablenName;isOutput=true]Wert
- Zugriff auf die Output-Variable in einer nachfolgenden Stage: In der nachfolgenden Stage greifen Sie auf die Variable über die Syntax
stageDependencies.StageName.VariablenName
zu.
Beispiel (YAML):
stages:
- stage: Build
jobs:
- job: BuildJob
steps:
- bash: |
echo "##vso[task.setvariable variable=buildNumber;isOutput=true]1234"
name: SetBuildNumber
- stage: Deploy
dependsOn: Build
variables:
buildNumberFromBuildStage: $[ stageDependencies.Build.BuildJob.outputs['SetBuildNumber.buildNumber'] ]
jobs:
- job: DeployJob
steps:
- bash: |
echo "Build Number: $(buildNumberFromBuildStage)"
In diesem Beispiel setzt der Build-Stage eine Output-Variable namens buildNumber
. Der Deploy-Stage greift dann auf diese Variable zu und speichert sie in einer Stage-Variable namens buildNumberFromBuildStage
, die dann im Deployment-Job verwendet werden kann.
2. Pipeline-Variablen
Pipeline-Variablen sind global für die gesamte Pipeline verfügbar. Sie können im Pipeline-Editor definiert oder durch Trigger (z.B. Pull Requests) gesetzt werden. Obwohl sie einfach zu verwenden sind, sollten sie mit Vorsicht eingesetzt werden, da sie die Lesbarkeit und Wartbarkeit der Pipeline beeinträchtigen können, wenn sie übermäßig genutzt werden.
So funktioniert’s:
- Definieren einer Pipeline-Variable: Im Pipeline-Editor unter „Variables” können Sie neue Variablen hinzufügen und ihnen Werte zuweisen.
- Zugriff auf die Pipeline-Variable in jeder Stage: Sie können auf die Variable in jeder Stage und jedem Job über die Syntax
$(VariablenName)
zugreifen.
Beispiel (YAML):
variables:
environment: 'Development'
stages:
- stage: Build
jobs:
- job: BuildJob
steps:
- bash: |
echo "Environment: $(environment)"
- stage: Deploy
dependsOn: Build
jobs:
- job: DeployJob
steps:
- bash: |
echo "Deploying to: $(environment)"
In diesem Beispiel wird die Pipeline-Variable environment
definiert und sowohl im Build- als auch im Deploy-Stage verwendet.
3. Variablen-Gruppen
Variablen-Gruppen sind Sammlungen von Variablen, die zentral verwaltet und in mehreren Pipelines oder Stages wiederverwendet werden können. Sie sind besonders nützlich für Konfigurationseinstellungen, Geheimnisse (mit Azure Key Vault Integration) oder andere gemeinsame Informationen.
So funktioniert’s:
- Erstellen einer Variablen-Gruppe: In Azure DevOps unter „Pipelines” -> „Library” erstellen Sie eine neue Variablen-Gruppe und fügen Variablen und ihre Werte hinzu.
- Verknüpfen der Variablen-Gruppe mit der Pipeline: In der Pipeline-Definition verwenden Sie das
variables
-Schlüsselwort, um die Variablen-Gruppe zu referenzieren. - Zugriff auf die Variablen in der Gruppe: Sie können auf die Variablen in der Gruppe in jeder Stage und jedem Job über die Syntax
$(VariablenName)
zugreifen.
Beispiel (YAML):
variables:
- group: 'MyVariableGroup'
stages:
- stage: Build
jobs:
- job: BuildJob
steps:
- bash: |
echo "API Key: $(API_KEY)"
- stage: Deploy
dependsOn: Build
jobs:
- job: DeployJob
steps:
- bash: |
echo "Database Connection String: $(DATABASE_CONNECTION_STRING)"
In diesem Beispiel wird die Variablen-Gruppe MyVariableGroup
verwendet, die Variablen wie API_KEY
und DATABASE_CONNECTION_STRING
enthält.
4. Umgebungsvariablen
Während der Ausführung von Tasks können Umgebungsvariablen verwendet werden, um Informationen an Prozesse weiterzugeben. Diese Variablen sind jedoch standardmäßig nicht persistent über Stages hinweg. Um sie zu nutzen, müssen Sie sie explizit als Output-Variablen definieren und wie oben beschrieben verwenden.
Best Practices für das Teilen von Variablen
Um das Teilen von Variablen in Ihren Azure Pipelines effektiv zu gestalten, sollten Sie die folgenden Best Practices berücksichtigen:
- Verwenden Sie Output-Variablen für Stage-übergreifende Daten: Dies ist die sauberste und expliziteste Methode und erleichtert das Nachvollziehen des Datenflusses.
- Verwenden Sie Pipeline-Variablen sparsam: Vermeiden Sie die übermäßige Verwendung von Pipeline-Variablen, um die Lesbarkeit und Wartbarkeit der Pipeline zu gewährleisten.
- Verwenden Sie Variablen-Gruppen für gemeinsame Konfigurationen: Variablen-Gruppen sind ideal für Konfigurationseinstellungen, Geheimnisse und andere Informationen, die in mehreren Pipelines oder Stages wiederverwendet werden.
- Benennen Sie Variablen aussagekräftig: Verwenden Sie beschreibende Namen für Ihre Variablen, um ihre Bedeutung und ihren Zweck klar zu machen.
- Dokumentieren Sie Ihre Pipelines: Kommentieren Sie Ihre Pipeline-Definitionen, um zu erklären, wie Variablen verwendet und zwischen Stages geteilt werden.
- Behandeln Sie Geheimnisse sorgfältig: Verwenden Sie Azure Key Vault Integration für Variablen-Gruppen, um Geheimnisse sicher zu speichern und zu verwalten. Vermeiden Sie es, Geheimnisse direkt in Pipeline-Definitionen zu speichern.
- Nutzen Sie Expressions für dynamische Werte: Azure Pipelines unterstützen Expressions, mit denen Sie dynamisch Werte für Variablen berechnen können.
Fazit
Das erfolgreiche Teilen von Variablen zwischen Stages ist ein wesentlicher Bestandteil der Erstellung effizienter und automatisierter Azure Pipelines. Durch die Verwendung von Output-Variablen, Pipeline-Variablen und Variablen-Gruppen können Sie einen reibungslosen Datenfluss gewährleisten und Ihren Workflow optimieren. Denken Sie daran, die Best Practices zu befolgen, um die Lesbarkeit, Wartbarkeit und Sicherheit Ihrer Pipelines zu gewährleisten. Indem Sie die hier beschriebenen Techniken und Best Practices anwenden, können Sie Ihre Azure Pipelines effektiver gestalten und die Vorteile der CI/CD voll ausschöpfen.