mercredi 4 avril 2012

TFS Event Worfklow Events : Un Must Have


TFS Event Workflow permet en toute simplicité d'être abonné à des évènements TFS tel que l'enregistrement d'un Work Item ou encore un évènement de checkin pour déclencher le traitement de notre choix. Cette technique permet d'apporter des possibilités de programmation évènementielle dans notre monde TFS pour tout un tas de bonnes raisons dont par exemple :
  • Le calcul de champs de Work Items à la volée dans le cadre d'un SLA ou de calcul de Earned Value Management
  • La modification de l'état de wok items dynamiquemnet, par exemple, lorsque tous les work items de type tache sont en resolved, il est possible automatiquement de passer en resolved le requirement ou la User Story Parent
  • Et bien d'autres scénarios bien sur
Pour activer cette fonctionnalité. Tout simplement télécharger sur CodePlex l'asset publié par Artiso TFSEventWorkflow à l'adresse Suivante : TFS Event Workflow
Cet asset exploite le système Bisubscribe d'abonnement aux évènements de Team Foundation Server pour la partie déclenchement et pour la partie logique d'exécution, Workflow Foundation 4.0 avec un set d'activités Custom qui ont été développées dans le cadre de ce projet, mais qui bien entendu peut être étendu à volonté.
On reste pleinement dans la logique des workflows de Build sauf que le host du workflow n'est pas le Build Service mais le serveur TFS lui même et que le déclenchement de l'exécution des Workflows est arbitré par les évènements déclenchés sur la plate forme TFS.
Dans le cadre de cet article, nous allons démontré un cas d'utilisation très simple et utile, la création automatique d'une Tache enfant lors de la création d'une User Story, cet exemple est intéressant car il permet d'apporter de la productivité dans le méthode Agile pour ce qui concerne la génération des taches pour les développeurs.
Nous allons démontrer cette fonctionnalité en réalisant étape par étape le projet complet jusqu'à son déploiement
Etape 1 : Installer les prérequis : Télécharger TFS Event Workflow sur CodePlex et installer les librairies sur le poste de développement. Idéalement, le développement doit être réalisé sur une serveur TFS de développement, sinon, installer le SDK TFS 2010 ou installer les Dlls nécéssaires au développement qui sont :
  • Microsoft.TeamFoundation.Framework.Server
  • Microsoft.TeamFoundation.WorkItemTracking.Client
  • Microsoft.TeamFoundation.WorkItemTracking.Server.Dataaccesslayer
Etape 2 : Création du projet, lancer Visual Studio 2010 et Créer un projet et choisir dans la rubrique Workflow, le template "Activity Designer Library" et nommer le projet TFSEventWorkflowSample par exemple puis valider

Etape 3 : Ajouter les références nécessaires au projet en utilisant le bouton Browse si les dlls n'ont pas été inscrites dans le GAC :
  • artiso.TFSEventWorkflows.TFSActivitiesLib
  • Microsoft.TeamFoundation.Framework.Server
  • Microsoft.TeamFoundation.WorkItemTracking.Client
  • Microsoft.TeamFoundation.WorkItemTracking.Server.Dataaccesslayer
puis valider
Ci dessous les références
Etape 3 : Ajouter au projet une activité nommée AddTaskToNewUserStory
Etape 4 : Mettre à jour la boite à outils pour afficher les activités customs livrées avec TFS Event Workflow. Pour cela afficher la boite à outil (Ctrl Alt X) puis à l'aide du menu contextuel lancer la commande New Tab et entrer le nom TFS Event Workflow

Puis le nouvel onglet TFSEventWorkflow étant actif, à l'aide du menu contextuel, lancer la commande Choose Items pour peupler la boite à outil

Cliquer sur Browse, localiser la dll artiso.TFSEventWorkflows.TFSActivitiesLib.dll, la liste des activités customs apparait, valider simplement
La boite à outil est mise à jour avec les activités fournies avec TFS Event Workflow
Etape 5 : Construction du workflow, A partir de la boite à outils Glisser une Sequence sur la surface de Design
L'étape suivant va consister à mettre en place les arguments et variables nécessaires au workflow, pour cela activer le bloc Sequence puis l'onglet variable et entrer les trois variables suivantes :
  • SavedWorkitem de type WorkItem
  • NewWorkitem de type WorkItem
  • TfsUrl de type String
activer ensuite l'onglet Arguments et entrer les deux arguments suivants :
  • TFSEvent Direction In et Type WorkItemChangedEvent
  • TeamFoundationRequestContext Direction In et de Type : TeamFoundationRequestContext

A noter, pour récupérer les bons types facilement, utiliser le bouton Browse for Types dans la liste et taper une partie du nom pour activer l'auto filtrage comme montré ci dessous
et également
Pour la suite nous allons simplement implémenter la logique du worklow et paramétrer les différentes activités.
Pour commencer glisser l'activité GetWorkItemChangedEventData à l'intérieur de la séquence


Appuyer sur F4 pour afficher la fenêtre de propriétés et complèter comme suit
  • TeamFoundationRequestContext ==>TeamFoundationRequestContext
  • TFSCollectionUrl ==>TFSUrl
  • WorkItem ==> SavedWorkitem
  • WorkItemChangedEvent ==> TFSEvent

Glisser un bloc If au dessous de l'activité précédente,

appuyer sur F4 pour afficher la fenêtre de propriété et entrer la condition suivante :
SavedWorkitem.Type.Name.Equals("User Story") And SavedWorkitem.Links.Count.Equals(1) And SavedWorkitem.Revision.Equals(1)

Puis glisser un bloc Sequence dans le bloc Then du If
Glisser une activité CreateNewWorkItem dans le nouveau bloc Séquence
Afficher la fenêtre de propriété et compléter comme suit :
  • NewWorkItem ==> NewWorkItem
  • TeamProjectName ==> SavedWorkitem.Project.Name
  • TfsCollectionUrl ==> TFSUrl
  • WorkItemType ==> "Task"

Glisser ensuite une activité ChangeWorkItemField au dessous de la précédente
Afficher les propriétés et compléter comme suit :
  • FieldReferenceName ==> "System.Title"
  • NewValue ==> "Task for User Story: " + SavedWorkitem.Title
  • WorkItem ==> NewWorkItem
Vous pouvez modifier New Value qui sera le titre de la tache créée dynamiquement en fonction de vos besoins
Glisser ensuite au dessous une activité SaveWorkItem qui permettra de sauvegarder la tache précédemment créée
Afficher la fenêtre de propriété et configurer comme suit :
WorkItem ==> NewWorkItem
Glisser enfin l'activité CreateLink qui va permettre de créer un lien child entre la User Story sauvegardée et la tache dynamiquement créée par notre workflow
Afficher la fenêtre de propriétés et configurer comme suit :
  • ChildWorkItem ==> NewWorkItem
  • LinkType ==> "System.LinkTypes.Hierarchy"
  • ParentWorkItem ==> SavedWorkitem
Le Workflow est terminé, il ne reste plus qu'à déployer le tout sur le serveur TFS puis Tester
Pour cela, il reste 3 étapes
1 - Installer TFS Event Workflow sur le serveur TFS en utilisant l'installer au format msi
2 - Copier le fichier de workflow créé ci dessous dans le dossier Plugins de TFS, le dossier ou a été installé d'ailleurs Tfs Event Workflow : c:\Program Files\Microsoft Team Foundation Server 2010\Application Tier\Web Services\bin\Plugins

3 - Procéder à la configuration du Plugin pour exécuter notre workflow :
Pour cela éditer le fichier de configuration "artiso.TFSEventWorkflows.TFSEventWorkflowsServerPlugin.dll"
Se placer dans la balise tfsEvents et complèter comme ci dessous. A noter que comme le fichier de workflow a été déposé dans le dossier de plug in, le nom du workflow suffit sans donner le chemin complet

<tfsEventConfig>

<tfsEvents>

<add eventName="Microsoft.TeamFoundation.WorkItemTracking.Server.WorkItemChangedEvent"

eventAssemblyName="Microsoft.TeamFoundation.WorkItemTracking.Server.Dataaccesslayer"

workflowFileName="AddTaskToNewUserStory.xaml" />

tfsEvents>

tfsEventConfig>

Pour tester, simplement créer une User Story sur le serveur TFS et constater la création de la tache fille automatiquement
Cet outil publié par l'équipe de Thomas Schlisser - Artiso, simplifie considérablement le branchement logique métier sur les évènements TFS, attention toutefois à rester cohérent dans les implémentations pour ne pas surcharger la plate forme par une exécution excessive de Workflows.
Bon développement évènementiel sur TFS!

Aucun commentaire: