Pipelineausführungssequenz

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2019

Ausführungen stellen jeweils einen Durchlauf einer Pipeline dar. Während einer Ausführung wird die Pipeline verarbeitet, und Agents verarbeiten einen oder mehrere Aufträge. Eine Pipelineausführung umfasst Aufträge, Schritte und Aufgaben. Ausführungen sind sowohl für CI- (Continuous Integration) als auch für CD-Pipelines (Continuous Integration) zentral.

Pipelineübersicht

Wenn Sie eine Pipeline ausführen, geschehen viele Dinge im Hintergrund. Obwohl Sie oft nichts darüber wissen müssen, ist es manchmal nützlich, die einzelnen Elemente zu kennen. Auf allgemeiner Ebene führt Azure Pipelines Folgendes aus:

Auf der Agent-Seite führt ein Agent für jeden Auftrag Folgendes aus:

Aufträge können erfolgreich, fehlerhaft oder abgebrochen beendet werden. Es gibt auch Situationen, in denen ein Auftrag möglicherweise nicht abgeschlossen wird. Kenntnisse über die Ursachen dieses Zustands helfen Ihnen beim Beheben von Problemen.

Nun werden die einzelnen Aktionen einzeln beschrieben.

Verarbeiten der Pipeline

Erweitern von YAML-Vorlagen

Um eine Pipeline in eine Ausführung umzuwandeln, führt Azure Pipelines mehrere Schritte in dieser Reihenfolge durch:

  1. Zunächst werden Vorlagen erweitert und Vorlagenausdrücke ausgewertet.
  2. Als Nächstes werden Abhängigkeiten auf Stageebene ausgewertet, um die ersten auszuführenden Stages zu ermitteln.
  3. Für jede Stage, die für die Ausführung ausgewählt wurde, geschehen zwei Dinge:
  4. Für jeden auszuführenden Auftrag werden Mehrfachkonfigurationen (strategy: matrix oder strategy: parallel in YAML) in mehrere Laufzeitaufträge erweitert.
  5. Für jeden Laufzeitauftrag werden Bedingungen ausgewertet, um zu entscheiden, ob dieser Auftrag für die Ausführung qualifiziert ist.
  6. Für jeden berechtigten Laufzeitauftrag wird ein Agent angefordert.

Nach Abschluss der Laufzeitaufträge überprüft Azure Pipelines, ob neue Aufträge ausgeführt werden können. In diesem Fall werden die Schritte 4 bis 6 mit den neuen Aufträgen wiederholt. Ebenso werden die Schritte 2 bis 6 mit dem Abschluss der Stages für eventuelle neue Stages wiederholt.

Diese Reihenfolge hilft bei der Beantwortung einer häufigen Frage: Warum kann ich bestimmte Variablen nicht in meinen Vorlagenparametern verwenden? Schritt 1 (Vorlagenerweiterung) basiert ausschließlich auf dem Text des YAML-Dokuments. Während dieses Schritts sind keine Laufzeitvariablen vorhanden. Nach Schritt 1 wurden Vorlagenparameter aufgelöst und sind nicht mehr vorhanden.

Auch ein weiteres häufiges Problem wird beantwortet: Warum kann ich keine Variablen verwenden, um Dienstverbindungs-/Umgebungsnamen aufzulösen? Ressourcen werden autorisiert, bevor mit der Ausführung einer Phase begonnen werden kann. Daher sind keine Variablen auf Phasen- und Auftragsebene verfügbar. Variablen auf Pipelineebene können zwar verwendet werden, das gilt aber nur für explizit in der Pipeline enthaltene. Variablengruppen sind selbst eine Ressource, die der Autorisierung unterliegt, sodass ihre Daten bei der Überprüfung der Ressourcenautorisierung ebenfalls nicht verfügbar sind.

Anfordern eines Agents

Wenn Azure Pipelines einen Auftrag ausführen muss, wird der Pool nach einem Agent gefragt. (Serveraufträge bilden eine Ausnahme, da sie auf dem Azure Pipelines-Server ausgeführt werden.) Von Microsoft gehostete und selbstgehostete Agentpools funktionieren etwas anders.

Poolanforderungen nach von Microsoft gehosteten Agents

Zunächst überprüft der Dienst die parallelen Aufträge Ihrer Organisation. Er summiert alle ausgeführten Aufträge für alle von Microsoft gehosteten Agents und vergleicht diese mit der Anzahl der erworbenen parallelen Aufträge. Wenn keine parallelen Slots verfügbar sind, muss der Auftrag warten, bis ein Slot frei wird.

Sobald ein paralleler Slot verfügbar ist, wird der Auftrag an den angeforderten Agent-Typ weitergeleitet. Konzeptionell ist der von Microsoft gehostete Pool ein riesiger globaler Pool von Computern. (In Wirklichkeit handelt es sich um viele verschiedene physische Pools, die nach Geografie und Betriebssystemtyp unterteilt sind.) Basierend auf dem angeforderten vmImage (in YAML) oder Poolnamen (im klassischen Editor) wird ein Agent ausgewählt.

Poolauswahl

Alle Agents im Microsoft-Pool sind neue virtuelle Computer, die noch keine Pipelines ausgeführt haben. Nach Abschluss des Auftrags wird die Agent-VM verworfen.

Poolanforderungen nach selbstgehosteten Agents

Ähnlich wie beim von Microsoft gehosteten Pool überprüft der Dienst zunächst die parallelen Aufträge Ihrer Organisation. Er summiert alle ausgeführten Aufträge für alle selbstgehosteten Agents und vergleicht diese mit der Anzahl der erworbenen parallelen Aufträge. Wenn keine parallelen Slots verfügbar sind, muss der Auftrag warten, bis ein Slot frei wird.

Sobald ein paralleler Slot verfügbar ist, wird der selbstgehostete Pool auf einen kompatiblen Agent untersucht. Selbstgehostete Agents bieten Fähigkeiten, Zeichenfolgen, die angeben, dass eine bestimmte Software installiert oder Einstellungen konfiguriert sind. Die Pipeline weist Anforderungen auf, d. h. erforderliche Fähigkeiten zum Ausführen des Auftrags. Wenn kein freier Agent gefunden werden kann, dessen Fähigkeiten den Anforderungen der Pipeline entsprechen, wartet der Auftrag weiter. Wenn im Pool keine Agents vorhanden sind, deren Fähigkeiten den Anforderungen entsprechen, tritt bei dem Auftrag ein Fehler auf.

Selbstgehostete Agents werden in der Regel zwischen den Ausführungen wiederverwendet. Bei selbstgehosteten Agents kann ein Pipelineauftrag Nebenwirkungen aufweisen, z. B. das Aufwärmen von Caches oder die bereits im lokalen Repository verfügbare Commits.

Vorbereiten der Ausführung eines Auftrags

Nachdem ein Agent einen Auftrag angenommen hat, muss einige Vorbereitung durchgeführt werden. Der Agent lädt alle zum Ausführen des Auftrags erforderlichen Aufgaben herunter (und speichert sie für das nächste Mal zwischen). Es erstellt einen Arbeitsspeicherplatz auf dem Datenträger, in dem Quellcode, Artefakte und Ausgaben der Ausführung gespeichert werden. Anschließend werden Schritte ausgeführt.

Ausführung der einzelnen Schritte

Die Schritte werden sequenziell nacheinander ausgeführt. Bevor ein Schritt beginnen kann, müssen alle vorherigen Schritte abgeschlossen (oder übersprungen) werden.

Ausführung der einzelnen Aufgaben

Schritte werden von Aufgaben implementiert. Aufgaben selbst werden als Node.js- oder PowerShell-Skripts implementiert. Das Aufgabensystem leitet Eingaben und Ausgaben an die unterstützenden Skripts weiter. Außerdem werden einige gängige Dienste bereitgestellt, z. B. zum Ändern des Systempfads und Erstellen neuer Pipelinevariablen.

Jeder Schritt wird in einem eigenen Prozess ausgeführt, wobei er von der Umgebung, die vorherige Schritte hinterlassen haben, isoliert wird. Aufgrund dieses Prozess-pro-Schritt-Modells werden Umgebungsvariablen zwischen den Schritten nicht beibehalten. Aufgaben und Skripts verfügen jedoch über einen Mechanismus zur Kommunikation mit dem Agent: die Protokollierungsbefehle. Wenn eine Aufgabe oder ein Skript einen Protokollierungsbefehl in die Standardausgabe schreibt, führt der Agent alle erforderlichen Aktionen aus.

Es gibt einen Agent-Befehl zum Erstellen neuer Pipelinevariablen. Pipelinevariablen werden im nächsten Schritt automatisch in Umgebungsvariablen konvertiert. Um die neue Variable myVar mit dem Wert myValue festzulegen, kann ein Skript folgendermaßen vorgehen:

echo '##vso[task.setVariable variable=myVar]myValue'
Write-Host "##vso[task.setVariable variable=myVar]myValue"

Berichten und Sammeln von Ergebnissen

Jeder Schritt kann Warnungen, Fehler und Ausfälle melden. Fehler und Warnungen werden an die Pipelinezusammenfassungsseite gemeldet und die Aufgabe dann als „erfolgreich mit Problemen“ gekennzeichnet. Ausfälle werden ebenfalls an die Zusammenfassungsseite gemeldet, dabei wird die Aufgabe jedoch als „fehlerhaft“ markiert. Ein Schritt gilt ein Fehler, wenn er explizit einen Fehler meldet (mithilfe eines ##vso-Befehls) oder das Skript mit einem anderen Exitcode als 0 (null) beendet.

Protokolle und Ergebnisflüsse vom Agent zum Dienst

Während der Ausführung der Schritte sendet der Agent ständig Ausgabezeilen an den Dienst. Aus diesem Grund können Sie einen Livefeed der Konsole einsehen. Am Ende jedes Schritts wird auch die gesamte Ausgabe des Schritts als Protokolldatei hochgeladen. Protokolle können nach Abschluss der Pipeline heruntergeladen werden. Weitere Elemente, die der Agent hochladen kann, sind Artefakte und Testergebnisse. Diese sind auch nach Abschluss der Pipeline verfügbar.

Status und Bedingungen

Der Agent verfolgt den Erfolg oder Fehler jedes Schritts nach. Wenn Schritte erfolgreich mit Problemen sind oder ein Fehler auftritt, wird die Status des Auftrags aktualisiert. Der Auftrag spiegelt immer das schlechteste Ergebnis der einzelnen Schritte wider: Wenn bei einem Schritt ein Fehler auftritt, gilt dies auch für den Auftrag.

Vor dem Ausführen eines Schritts überprüft der Agent die Bedingung dieses Schritts, um zu ermitteln, ob er ausgeführt werden soll. Standardmäßig wird ein Schritt nur ausgeführt, wenn der Status des Auftrags erfolgreich oder erfolgreich mit Problemen lautet. Bei vielen Aufträgen müssen Bereinigungsschritte unabhängig von anderen Geschehnissen ausgeführt werden, damit sie die Bedingung „always()“ angeben können. Es kann für Bereinigungsschritte auch festgelegt werden, dass sie nur bei einem Abbruch ausgeführt werden. Mit einem erfolgreichen Bereinigungsschritt kann der Auftrag nicht vor einem Fehler bewahrt werden. Aufträge können nach dem Wechsel in einen Fehlerzustand nie zum Erfolgsstatus zurückkehren.

Timeouts und Trennungen

Jeder Auftrag weist ein Timeout auf. Wenn der Auftrag nicht in der angegebenen Zeit abgeschlossen wurde, bricht der Server den Auftrag ab. Er versucht, dem Agent zu signalisieren, dass er angehalten wird, und markiert den Auftrag als abgebrochen. Auf der Agent-Seite werden dann alle verbleibenden Schritte abgebrochen und alle verbleibenden Ergebnisse hochgeladen.

Aufträge haben eine als Abbruchtimeout bezeichnete Nachfrist, in der alle Arbeiten nach dem Abbrechen abgeschlossen werden können. (Denken Sie daran, dass Schritte so markiert werden können, dass sie auch bei einem Abbruch ausgeführt werden.) Wenn der Agent nach dem Timeout plus dem Abbruchtimeout nicht gemeldet hat, dass die Arbeit beendet wurde, markiert der Server den Auftrag als fehlerhaft.

Da Azure Pipelines Arbeit an Agent-Computer verteilt, reagieren Agents möglicherweise von Zeit zu Zeit nicht mehr auf den Server. Dies kann vorkommen, wenn der Hostcomputer des Agents nicht mehr vorhanden ist (Stromausfall, Deaktivieren der VM) oder wenn ein Netzwerkfehler auftritt. Als Hilfe beim Erkennen dieser Bedingungen sendet der Agent einmal pro Minute eine Heartbeatnachricht, um den Server darüber zu informieren, dass er noch in Betrieb ist. Wenn der Server für einen Zeitraum von fünf Minuten keinen Heartbeat empfängt, geht er davon aus, dass der Agent nicht wieder aktiviert wird. Der Auftrag wird als fehlerhaft markiert, sodass Benutzer*innen wissen, dass sie die Pipeline wiederholen müssen.

Verwalten von Ausführungen über die Befehlszeilenschnittstelle

Mithilfe der Azure DevOps CLI können Sie die Pipelineausführungen in Ihrem Projekt auflisten und Details zu einer bestimmten Ausführung anzeigen. Sie können auch Tags in Ihrer Pipelineausführung hinzufügen und löschen.

Voraussetzungen

  • Bei Ihnen muss die Azure DevOps CLI-Erweiterung installiert sein, wie unter Erste Schritte mit Azure DevOps CLI beschrieben.
  • Melden Sie sich mithilfe von az login bei Azure DevOps an.
  • Legen Sie für die Beispiele in diesem Artikel mithilfe von az devops configure --defaults organization=YourOrganizationURL die Standardorganisation fest.

Auflisten von Pipelineausführungen

Listen Sie die Pipelineausführungen in Ihrem Projekt mit dem Befehl az pipelines runs list auf. Informationen zu den ersten Schritten finden Sie unter Erste Schritte mit Azure DevOps CLI.

az pipelines runs list [--branch]
                       [--org]
                       [--pipeline-ids]
                       [--project]
                       [--query-order {FinishTimeAsc, FinishTimeDesc, QueueTimeAsc, QueueTimeDesc, StartTimeAsc, StartTimeDesc}]
                       [--reason {all, batchedCI, buildCompletion, checkInShelveset, individualCI, manual, pullRequest, schedule, triggered, userCreated, validateShelveset}]
                       [--requested-for]
                       [--result {canceled, failed, none, partiallySucceeded, succeeded}]
                       [--status {all, cancelling, completed, inProgress, none, notStarted, postponed}]
                       [--tags]
                       [--top]

Optionale Parameter

  • branch: Filtern nach Builds für diesen Branch.
  • org: Azure DevOps-Organisations-URL. Sie können die Standardorganisation mit az devops configure -d organization=ORG_URL konfigurieren. Erforderlich, wenn nicht als Standard konfiguriert oder mithilfe von git config übernommen. Beispiel: --org https://dev.azure.com/MyOrganizationName/.
  • pipeline-ids: Durch Leerzeichen getrennte IDs von Definitionen, für die Builds aufgelistet werden sollen.
  • project: Name oder ID des Projekts. Sie können das Standardprojekt mit az devops configure -d project=NAME_OR_ID konfigurieren. Erforderlich, sofern nicht als Standard konfiguriert oder mithilfe von git config übernommen.
  • query-order: Definieren der Reihenfolge, in der Pipelineausführungen aufgelistet werden. Zulässige Werte sind FinishTimeAsc, FinishTimeDesc, QueueTimeAsc, QueueTimeDesc, StartTimeAsc und StartTimeDesc.
  • reason: ausschließliches Auflisten von Builds aus diesem angegebenen Grund. Zulässige Werte sind batchedCI, buildCompletion, checkInShelveset, individualCI, manual, pullRequest, schedule, triggered, userCreated und validateShelveset.
  • requested-for: Beschränken auf die Builds, die für eine*n angegebene*n Benutzer*in oder eine bestimmte Gruppe angefordert wurden.
  • result: Beschränken auf die Builds mit einem angegebenen Ergebnis. Zulässige Werte sind canceled, failed, none, partiallySucceeded und succeeded.
  • status: Beschränken auf die Builds mit einem angegebenen Status. Zulässige Werte sind all, cancelling, completed, inProgress, none, notStarted und postponed.
  • tags: Beschränken auf die Builds mit allen angegebenen Tags. Leerzeichen getrennt.
  • top: maximale Anzahl von Builds, die aufgelistet werden sollen.

Beispiel

Der folgende Befehl listet die ersten drei Pipelineausführungen auf, die den Status completed (abgeschlossen) und das Ergebnis succeeded (erfolgreich) aufweisen, und gibt das Ergebnis im Tabellenformat zurück.

az pipelines runs list --status completed --result succeeded --top 3 --output table

Run ID    Number      Status     Result     Pipeline ID    Pipeline Name               Source Branch    Queued Time                 Reason
--------  ----------  ---------  ---------  -------------  --------------------------  ---------------  --------------------------  ------
125       20200124.1  completed  succeeded  12             Githubname.pipelines-java  master           2020-01-23 18:56:10.067588  manual
123       20200123.2  completed  succeeded  12             Githubname.pipelines-java  master           2020-01-23 11:55:56.633450  manual
122       20200123.1  completed  succeeded  12             Githubname.pipelines-java  master           2020-01-23 11:48:05.574742  manual

Anzeigen von Details zur Pipelineausführung

Zeigen Sie die Details für eine Pipelineausführung in Ihrem Projekt mit dem Befehl az pipelines runs show an. Informationen zu den ersten Schritten finden Sie unter Erste Schritte mit Azure DevOps CLI.

az pipelines runs show --id
                       [--open]
                       [--org]
                       [--project]

Parameter

  • id: erforderlich. ID der Pipelineausführung.
  • open: optional. Öffnet die Seite „Buildergebnisse“ in Ihrem Webbrowser.
  • org: Azure DevOps-Organisations-URL. Sie können die Standardorganisation mit az devops configure -d organization=ORG_URL konfigurieren. Erforderlich, wenn nicht als Standard konfiguriert oder mithilfe von git config übernommen. Beispiel: --org https://dev.azure.com/MyOrganizationName/.
  • project: Name oder ID des Projekts. Sie können das Standardprojekt mit az devops configure -d project=NAME_OR_ID konfigurieren. Erforderlich, wenn nicht als Standard konfiguriert oder mithilfe von git config übernommen.

Beispiel

Der folgende Befehl zeigt Details für die Pipelineausführung mit der ID 123 an und gibt die Ergebnisse im Tabellenformat zurück. Außerdem wird der Webbrowser mit der Seite „Buildergebnisse“ geöffnet.

az pipelines runs show --id 122 --open --output table

Run ID    Number      Status     Result     Pipeline ID    Pipeline Name               Source Branch    Queued Time                 Reason
--------  ----------  ---------  ---------  -------------  --------------------------  ---------------  --------------------------  --------
123       20200123.2  completed  succeeded  12             Githubname.pipelines-java  master           2020-01-23 11:55:56.633450  manual

Hinzufügen eines Tags zur Pipelineausführung

Fügen Sie einer Pipelineausführung in Ihrem Projekt mit dem Befehl az pipelines runs tag add ein Tag hinzu. Informationen zu den ersten Schritten finden Sie unter Erste Schritte mit Azure DevOps CLI.

az pipelines runs tag add --run-id
                          --tags
                          [--org]
                          [--project]

Parameter

  • run-id: erforderlich. ID der Pipelineausführung.
  • tags: erforderlich. Tags, die der Pipelineausführung hinzugefügt werden sollen (durch Kommas getrennte Werte).
  • org: Azure DevOps-Organisations-URL. Sie können die Standardorganisation mit az devops configure -d organization=ORG_URL konfigurieren. Erforderlich, wenn nicht als Standard konfiguriert oder mithilfe von git config übernommen. Beispiel: --org https://dev.azure.com/MyOrganizationName/.
  • project: Name oder ID des Projekts. Sie können das Standardprojekt mit az devops configure -d project=NAME_OR_ID konfigurieren. Erforderlich, wenn nicht als Standard konfiguriert oder mithilfe von git config übernommen.

Beispiel

Der folgende Befehl fügt das Tag YAML der Pipelineausführung mit der ID 123 hinzu und gibt das Ergebnis im JSON-Format zurück.

az pipelines runs tag add --run-id 123 --tags YAML --output json

[
  "YAML"
]

Auflisten von Pipelineausführungs-Tags

Listen Sie die Tags für eine Pipelineausführung in Ihrem Projekt mit dem Befehl az pipelines runs tag list an. Informationen zu den ersten Schritten finden Sie unter Erste Schritte mit Azure DevOps CLI.

az pipelines runs tag list --run-id
                           [--org]
                           [--project]

Parameter

  • run-id: erforderlich. ID der Pipelineausführung.
  • org: Azure DevOps-Organisations-URL. Sie können die Standardorganisation mit az devops configure -d organization=ORG_URL konfigurieren. Erforderlich, wenn nicht als Standard konfiguriert oder mithilfe von git config übernommen. Beispiel: --org https://dev.azure.com/MyOrganizationName/.
  • project: Name oder ID des Projekts. Sie können das Standardprojekt mit az devops configure -d project=NAME_OR_ID konfigurieren. Erforderlich, wenn nicht als Standard konfiguriert oder mithilfe von git config übernommen.

Beispiel

Der folgende Befehl listet die Tags für die Pipelineausführung mit der ID 123 an und gibt die Ergebnisse im Tabellenformat zurück.

az pipelines runs tag list --run-id 123 --output table

Tags
------
YAML

Löschen eines Tags aus einer Pipelineausführung

Löschen Sie ein Tag aus einer Pipelineausführung in Ihrem Projekt mit dem Befehl az pipelines runs tag delete. Informationen zu den ersten Schritten finden Sie unter Erste Schritte mit Azure DevOps CLI.

az pipelines runs tag delete --run-id
                             --tag
                             [--org]
                             [--project]

Parameter

  • run-id: erforderlich. ID der Pipelineausführung.
  • tag: erforderlich. Tag, das aus der Pipelineausführung gelöscht werden soll.
  • org: Azure DevOps-Organisations-URL. Sie können die Standardorganisation mit az devops configure -d organization=ORG_URL konfigurieren. Erforderlich, wenn nicht als Standard konfiguriert oder mithilfe von git config übernommen. Beispiel: --org https://dev.azure.com/MyOrganizationName/.
  • project: Name oder ID des Projekts. Sie können das Standardprojekt mit az devops configure -d project=NAME_OR_ID konfigurieren. Erforderlich, wenn nicht als Standard konfiguriert oder mithilfe von git config übernommen.

Beispiel

Der folgende Befehl löscht das Tag YAML aus der Pipelineausführung mit der ID 123.

az pipelines runs tag delete --run-id 123 --tag YAML