VSTS Api - Obtenir le(s) parent(s) d'un workitem
Un petit article pour faire suite à celui sur l'envoi automatique de release note depuis VSTS que j'ai fait il y a quelques semaines. Depuis cet article, j'ai fait quelques ajustements, non pas pour le changement de nom et le passage à Azure DevOps, mais pour me permettre de faire apparaître dans ma release note, le(s) parent(s) d'un workitem toujours dans l'optique de résoudre le souci de tracabilité que j'évoquais. Même si l'article n'est pas très long, la documentation et les exemples de code sur ce point sont assez rares, je me permets donc de le partager.
Pour rappel, un workitem (tâche, bug, ...) peut avoir des liens avec beaucoup d'éléments (un autre workitem, un commit, une build, ...), ces liens peuvent être automatiques ou manuels. Dans mon scénario, je souhaite obtenir les liens de type parent, qui sont des liens manuels.
Comment procéder pour obtenir le(s) parent(s) ?
Il faut modifier l'appel qui permet d'obtenir le détail de workitems, (la méthode "GetWorkItemsAsync" de "WorkItemTrackingHttpClient"). Au lieu de se baser sur le paramètre "fields", il faut utiliser le paramètre "expand", c'est un enum qui prend les valeurs suivantes :
- None
- Relations
- Fields
- Links
- All
Le code sera donc le suivant (j'utilise volontairement la valeur "All", car j'ai besoin des valeurs dans relations et dans fields, attention, la propriété "fields" et la propriété "expand" ne peuvent pas être utilisées en même temps) :
var witClient = connection.GetClient<WorkItemTrackingHttpClient>(); var workItems = await witClient.GetWorkItemsAsync(releaseDifWorkItems.Value.Select(w => int.Parse(w.Id)), expand: Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models.WorkItemExpand.All);
Une fois les workitems obtenus, il suffit d'obtenir l'id des relations de type parent que chaque workitem peut avoir. Le type de relation dans le cas d'une relation parent est "System.LinkTypes.Hierarchy-Reverse".
var parentIds = new List<int>(); var parentRelName = "System.LinkTypes.Hierarchy-Reverse"; foreach (var workItem in workItems) { if (workItem.Relations.Any(r => r.Rel == parentRelName)) { foreach (var parentRelation in workItem.Relations.Where(r => r.Rel == parentRelName)) { var parentRelationSplit = parentRelation.Url.Split('/'); var parentId = int.Parse(parentRelationSplit.Last()); if(!parentIds.Any(p => p == parentId)) { parentIds.Add(parentId); } } } }
Le seul moyen que j'ai trouvé pour obtenir l'id du workitem parent est de découper l'url, l'id étant le dernier élément. Si vous avez des suggestions sur ce point-là, je suis preneur car je pense qu'il y a un meilleur moyen, qui serait beaucoup plus pérenne.
Ensuite une fois les ids des workitems parent obtenus, il suffit de rappeler la même méthode "GetWorkItemsAsync" pour obtenir le détail des workitems parent et les afficher eux aussi dans la release note !
Commentaires