Azure DevOps Tipps und Tricks: Work-Items automatisch aktualisieren

Work-Items können mit Power Automate in andere Spalten und Iterationen verschoben werden. Eine Erweiterung unserer Schritt-für-Schritt-Anleitung.

Azure DevOps Tipps und Tricks: Work-Items automatisch verschieben

Im vorangegangenen Artikel haben wir dir erklärt, wie man Power Automate nutzen kann, um Work-Items in einem Azure DevOps (ADO) Board automatisch zu aktualisieren und in eine andere Swimlane zu verschieben. Darauf aufbauend beschreiben wir in diesem Artikel einen ähnlichen Fall, bei dem Work-Items automatisch in eine andere Spalte auf dem Board verschoben werden, wenn ein bestimmtes Tag gesetzt wird. Außerdem wird gezeigt, wie man das Work-Item der aktuellen Iteration zuweisen kann.

Vorschau 1: Ausgangssituation mit dem Work-Item “Example 3” ohne Tags in der Default-Swimlane.
Vorschau 1: Ausgangssituation mit dem Work-Item “Example 3” ohne Tags in der Default-Swimlane.
Vorschau 1: Ausgangssituation mit dem Work-Item “Example 3” ohne Tags in der Default-Swimlane.
Vorschau 1: Ausgangssituation mit dem Work-Item “Example 3” ohne Tags in der Default-Swimlane.

Um die folgenden Schritte besser zu verstehen, solltest du bereits unseren Artikel Azure DevOps Tipps und Tricks: Work-Items automatisch verschieben gelesen haben.

Voraussetzungen

  • Du brauchst eine Power Automate Premium Lizenz
  • Es gibt nur eine aktiv genutzte current iteration für den aktuellen Sprint

1) Flow und Trigger konfigurieren

Logge dich in Power Automate ein und erstelle einen neuen Automated cloud flow. Wähle den Flow-Trigger When a work item is updated, klicke auf Create und aktualisiere die entsprechenden Felder des Triggers im Flow-Editor entsprechend den Gegebenheiten deines ADO-Projektes.

2) Modifizieren der Trigger-Bedingung

Klicke auf die drei Punkte im Titel des Triggers und wähle Settings. Im folgenden Fenster füge den folgenden Befehl als Trigger Condition ein:

@equals(triggerOutputs()?['body/fields/System_State'], 'New')

Dadurch wird der Flow nur durch ein aktualisiertes Work-Item getriggert, das den Status New besitzt. Somit spart man sich weitere Bedingungsabfragen zur Steuerung innerhalb des Flows und der Flow läuft nicht jedes Mal, wenn irgendein beliebiges Ticket auf dem Board aktualisiert wird, das die gewünschten Bedingungen nicht erfüllt. Für unser Beispiel kommt diese Methode in Frage, solltest du jedoch komplexere Bedingungen einbauen wollen, wodurch und wohin ein Work-Item verschoben werden soll, muss dies im Flow selbst abgebildet werden.

Vorschau 3: Die Einstellungen des Flow-Triggers.
Vorschau 3: Die Einstellungen des Flow-Triggers.

3) Variablen konfigurieren

Es müssen einige Informationen des Work-Items, das den Flow triggert, für den weiteren Gebrauch gespeichert werden:

  • die Tags
  • die aktuelle Iteration und
  • ähnlich zu der Swimlane-Referenz einen Platzhalter für die interne ADO-Referenz der aktuellen Spalte.

Initialisiere drei Variablen des Typs String mit Namen CurrentIterationTags und ColumnReference. Dem Wert der Tag-Variable wird der Dynamic content Tag zugewiesen, der Wert der anderen beiden Variablen bleibt leer.

4) Verwendete Tags prüfen

Da Work-Items nur verschoben werden sollen, wenn ein bestimmtes Tag gesetzt wird, baue eine Bedingung ein, die die Tags des Work-Items überprüft. Verwende dazu die zuvor definierte Variable Tags und als Bedingung contains Approved. Den aus der Bedingung resultierenden No-Branch können wir ignorieren oder bei Bedarf eine Stop-Flow-operation verwenden. Wir konzentrieren uns im Folgenden auf den Yes-Branch.

5) Board-interne Spaltenreferenz

Wie auch bei den Swimlanes ist es nicht möglich, die Spaltenvariable eines Work-Items direkt zu ändern. Du kannst aber die Spaltenreferenz durch den bereits bekannten API-Call unter der folgenden URL abfragen:

https://dev.azure.com/<organisation>/<project>/<team name>/_apis/work/boards/<backlog level>.

Die JSON-Antwort auf die HTTP-Anfrage enthält die Spaltenreferenz unter fields -> columnField -> referenceName und beginnt mit WEF_ .

Vorschau 4: Die HTTP-Anfrage zum Erhalt der Spaltenreferenz.
Vorschau 4: Die HTTP-Anfrage zum Erhalt der Spaltenreferenz.

6) Setze die Spaltenreferenz

Ähnlich wie die Swimlane-Referenz gesetzt wurde, speichere nun das Ergebnis der HTTP-Anfrage in der Variablen ColumnReference. Der Value der Set variable Operation sollte ohne Zeilenumbruch folgendermaßen aussehen:

@{outputs('Send_an_HTTP_request_to_Azure_DevOps_(get_reference)')
?['body/fields/columnField/referenceName']}

Send_an_HTTP_request_to_Azure_DevOps_(get_reference) stellt dabei den Titel der vorherigen HTTP-Anfrage dar.

7) Die aktuelle Iteration

7.1) Bestimme die aktuelle Iteration

Um die aktuelle Iteration zu erhalten, wird eine weitere HTTP-Anfrage der Form benötigt.

<project>/_apis/work/teamsettings/iterations?$timeframe=current&api-version=7.1-preview.1
Vorschau 5: Die HTTP-Anfrage zum Erhalt der aktuelle Iteration.
Vorschau 5: Die HTTP-Anfrage zum Erhalt der aktuelle Iteration.

Die JSON-Antwort dieser Anfrage beinhaltet die aktuelle Iteration in einem Array:

outputs('Send_an_HTTP_request_to_Azure_DevOps_(get_iteration)')?['body/value']?[0]?['path']

Send_an_HTTP_request_to_Azure_DevOps_(get_iteration) ist dabei wieder der Titel der Operation, der die HTTP-Anfrage aus dem vorherigen Schritt beinhaltet.

Der Wert der Variablen CurrentIteration aus der outputs-Funktion beinhaltet die Iteration mit nur einem Backslash in der Form project\iteration. Schreibt man dieses Ergebnis so in ein Work-Item, erhält man einen Fehler, da innerhalb eines Work-Items zwei Backslashs erwartet werden. Um dieses Problem zu beheben, füge eine compose Data Operation als weiteren Schritt in den Flow. Als Input wird ein Ausdruck der Form

`replace(variables('CurrentIteration'), '\', '\\')`

verwendet.

Vorschau 6: Beide Schritte zum Setzen der “CurrentIteration” und dem manuellen Einfügen eines weiteren Backslashs zusammengefasst.
Vorschau 6: Beide Schritte zum Setzen der “CurrentIteration” und dem manuellen Einfügen eines weiteren Backslashs zusammengefasst.

8) Aktualisiere das Work-Item

Um das Work-Item zu verschieben, verwende eine weitere Send an HTTP-request to Azure DevOps Operation, um die Work-Item-Informationen zu aktualisieren.
Stelle den korrekten Organization Name ein und wähle PATCH als Method. Befülle die Relative URI im folgenden Format:

<project>/_apis/wit/workitems/@{triggerOutputs()?['body/id']}?api-version=7.0

Die Anfrage verwendet die ID des Work-Items, das den Flow getriggert hat. Füge ein Header-Feld mit dem Key Content-Type und dem Value application/json-patch+json hinzu. Der Body der Anfrage sollte im JSON-Format wie folgt aussehen:

[
  {
    "op": "replace",
    "path": "/fields/System.IterationPath",
    "value": "@{outputs('Compose_-_Replace_single_backslash')}"
  },
   {
     "op": "add",
     "path": "/fields/@{variables('ColumnReference')}",
     "value": "Approved"
   }
]

Der path für die Spalte beinhaltet unsere ColumnReference-Variable und der Value ist der Bezeichner der Spalte, in welche der Item verschoben werden soll. Der path für die Iteration ist „/fields/System.IterationPath“ und der value ist das Resultat im modifizierten compose Schritt.

Damit sollte der gesamte Flow wie folgt aussehen:

Vorschau 7: Übersicht über den gesamten Flow in Power Automate.
Vorschau 7: Übersicht über den gesamten Flow in Power Automate.

Abschließende Bemerkungen

  • Mehrere Flows, die für das selbe ADO-Board konfiguriert sind, können sich gegenseitig beeinflussen.