Let There Be Code RSS 2.0
# Friday, January 29, 2010

Depuis quelques temps je me suis remis au développement de BOWIE. Voulant absolument découvrir l’API de gestion des Builds du SDK de TFS, je me suis creusé les méninges afin de trouver une fonctionnalités intéressantes pour pouvant s’intégrer de façon originale dans Outlook.

Sachant qu’une Build :

  • s’exécute à un temps T1
  • se termine à un temps T2
  • et possède un certain status (Accepted, Failed…),

une Build peut donc être représentée dans un calendrier Outlook par un rendez-vous avec :

  • une date de début
  • une date de fin
  • une catégorie représentant le status
  • une zone permettant d’afficher le détail de la Build, comme dans Visual Studio

On peut également aller plus loin en représentant dans le calendrier les définitions de Build. Dans certain cas, nous créons des définitions de Build récurrentes. Ces définitions de Build récurrentes définissent :

  • un pattern de récurrence (journalier, hebdomadaire…)

Ce type de définition de Build peut donc être représentée par un rendez-vous récurrent dans un calendrier Outlook. Nous pourrions par exemple en ouvrant le rendez-vous, proposer une interface permettant d’éditer la définition, ou encore de démarrer une nouvelle Build.

Après avoir mis à plat toutes ces idées, il ne reste plus qu’à trouver les points d’entrées dans le TFS SDK. Tout d’abord nous avons besoin des références suivantes :

  • TeamFoundation.Client
  • TeamFoundation.Build.Client
  • TeamFoundation.Build.Common

La récupération de toutes les Builds d’un projet nécessite une instance de la classe TeamFoundationServer que l’on obtient à l’aide de la classe TeamFoundationFactory.

Ensuite il faut récupérer l’API du serveur de Build via la méthode GetService<IBuildServer>(). Enfin il ne reste qu’à appeler la fonction QueryBuilds(string projectName) en lui spécifiant un nom de Team Project :

TeamFoundationServer tfs = TeamFoundationServerFactory.GetServer("http://ServerUri");
IBuildServer bserver = tfs.GetService<IBuildServer>();
IBuildDetail[] details = bserver.QueryBuilds("TeamProjectName");

Maintenant que nous avons nos Builds, il nous faut les parcourir et créer des rendez-vous dans le calendrier pour chacune d’elle… et ne pas oublier de stocker l’Uri de la Build dans les UserProperties de l’Appointment :

AppointmentItem appt = folder.Items.Add(OlItemType.olAppointmentItem) as AppointmentItem;
appt.Start = item.StartTime;
appt.End = item.FinishTime;
appt.Subject = item.BuildDefinition.Name + " - " + item.Status.ToString();
appt.ReminderSet = false;
appt.UserProperties.Add("BuildUri", OlUserPropertyType.olText);
appt.UserProperties["BuildUri"].Value = item.Uri.ToString();

Après quelques petits efforts on arrivera facilement à faire un petit formulaire dans ce style :

image

Pour l’affichage du rapport d’exécution d’une Build on peut utiliser une FormRegion dans le formulaire d’un Appointment.

On récupère l’Uri de la Build dans les UserProperties de l’Appointment. Puis toujours avec l’API du serveur de Build on récupère les détails d’exécution via la méthode GetAllBuildDetails(Uri buildUri) :

TeamFoundationServer tfs = TeamFoundationServerFactory.GetServer("http://TeamServerUri");
IBuildServer bserver = tfs.GetService<IBuildServer>();
IBuildDetail details = bserver.GetAllBuildDetails(new Uri("BuildUri"));
Un objet BuildDetail, comme son nom l’indique, contient toutes les informations d’une Build : l’heure d’exécution, le temps d’exécution, le numéro de build, les étapes de la build, le work item

éventuellement créé, le status, le chemin du fichier de log, la liste des erreurs, des warnings, la configuration… bref vraiment toutes les infos.

Le code ci-dessous nous montre comment récupérer certaines de ces informations :

// Numéro de la Build
lblBuildNumber.Text = details.BuildNumber;

// Emplacement du Log
lnkLogPath.Text = details.DropLocation;

// Dernière Modification
lblSummary.Text = string.Format("Build last modified by {0} {1:0.0} hours ago \r\n", details.LastChangedBy, (DateTime.Now - details.LastChangedOn).TotalHours);

// Plateforme
lblErros.Text += configuration.Fields[InformationFields.Platform] + " | " + configuration.Fields[InformationFields.Flavor] + "\r\n";

// Nombre d'erreurs et de warnings
lblErros.Text += configuration.Fields[InformationFields.TotalCompilationErrors] + "error(s), " + configuration.Fields[InformationFields.TotalCompilationWarnings] + "warning(s) \r\n";

// WorkItem créé
foreach (IBuildInformationNode node in details.Information.GetNodesByType(InformationTypes.OpenedWorkItem, true))
{
	lnkBug.Text = string.Format("Bug {0}", node.Fields[InformationFields.WorkItemId]);
    lblState.Text = string.Format("Current state is {0}, currently assigned to {1} \r\n", node.Fields[InformationFields.Status], node.Fields[InformationFields.AssignedTo]);
}

// Le détail des erreurs (fichier, numéro de ligne, message)
foreach (IBuildInformationNode item in details.Information.GetNodesByType(InformationTypes.BuildError, true))
{
	lblErros.Text += "    " + item.Fields[InformationFields.File] + " (" + item.Fields[InformationFields.LineNumber] + "): " + item.Fields[InformationFields.Message] + " \r\n\r\n";
}

Le code précédent donne le résultat suivant :

image

Friday, January 29, 2010 5:40:00 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Outlook Work Items Extension | TFS SDK
# Wednesday, January 27, 2010

Je vous invite à vous inscrire au plus grand événement Microsoft de l’année, les Techdays, qui aura lieu les 8, 9 et 10 février au Palais des Congrès de Paris.

J’y ferai une apparition, le mardi 8 à 17h30 sur le parcours ALM pour présenter les nouveautés de Visual Studio 2010 Architecte au côté de François Merand.

La session:

Architecture : quoi de neuf avec Visual Studio 2010

Le mardi 9 février 2010, 17:30 - 18:30

UML, explorateur d'architecture, diagrammes de couches... Visual Studio 2010 a été pensé comme un outil d'architecture complet à la portée de tous. Au cours de cette session, nous explorerons les possibilités de cet outil pour les phases d'architecture de vos développements, et au delà.

 

 

N’attendez plus, inscrivez vous!!

Wednesday, January 27, 2010 8:55:00 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Techdays 2010
# Friday, January 22, 2010

Pour ce dernier lab j’ai choisi de montrer ce qu’il est possible de faire avec les templates de génération de code T4 et Entity Framework :

L’atelier se découpe en 2 parties :

  • Créer son premier template T4
  • Utiliser le template de génération de code Entity Self Tracking pour EF 4.0

Toutes les ressources pour ce lab sont disponible ici :

Friday, January 22, 2010 5:16:00 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Entity Framework 4.0
# Sunday, January 17, 2010

Voici le 3ème épisode de la série d’ateliers sur Entity Framework 4.0. Dans ce lab je vous propose de découvrir les bases d’ADO.NET Data Services et notamment :

  • Exposer un modèle Entity Framework ou une partir du modèle avec ADO.NET Data Services
  • Interroger le service via REST
  • Créer et utiliser un proxy ADO.NET Data Services afin de récupérer des données

Le starter et la solution sont disponible ici :

Sunday, January 17, 2010 6:18:53 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
ADO.NET Data Services | Entity Framework 4.0
# Monday, December 21, 2009

Pour continuer la découverte du TFS SDK, je vous propose de découvrir comment retrouver l’adresse du Team System Web Access (TSWA) d’un serveur Team grâce au TFS SDK. Pour info je n’ai trouvé aucune documentation concernant cette partie du SDK sur la MSDN.

Pourquoi avoir besoin de récupérer les URL ? Tout simplement lorsque l’on étend les fonctionnalités de TFS vers d’autres outils tiers. Par exemple, dans une fonctionnalité de BOWIE 2010 d’envoie de Work Items par mail, je voulais, pour chacun des work items, avoir un lien qui pointe vers la page d’édition du work item comme indiqué ci-dessous :

image

Pour cela nous avons besoin d’une instance de la classe TeamFoundationServer que l’on trouve dans l’assembly Microsoft.TeamFoundation.Client.dll. Il faut ensuite récupérer une instance de la classe TswaClientHyperlinkService via la méthode GetService de l’objet TeamFoundationServer :

TeamFoundationServer server = TeamFoundationServerFactory.GetServer("http://localhost:8080/tfs/DefaultCollection");
TswaClientHyperlinkService tswa = server.GetService<TswaClientHyperlinkService>();
Grâce à cette classe nous allons pouvoir récupérer les url du Team System Web Access. Dans mon cas, pour récupérer l’url d’un work item à partir de son Id, il suffit d’utiliser la méthode GetWorkItemEditorUrl(int id) :

int wiId = 3;
Uri wiUri = tswa.GetWorkItemEditorUrl(wiId);

On obtient une URL du style : http://localhost:8080/tfs/web/wi.aspx?pcguid=7e6d1e34-000d-4adb-ad5e-93db70187570&id=3

Cette URL permet d’accéder à la page suivante :

image

Voici quelques unes des méthodes de la classe TswaClientHyperlinkService permettant de récupérer les url d’objets TFS:

  • GetChangesetDetailsUrl(int changeSetId)
  • GetHomeUrl(Uri projectUri)
  • GetShelvesetDetailsUrl(string shelvesetName, string shelvesetOwner)
  • GetSourceExplorerUrl(string serverItemPath)
  • GetViewBuildDetailsUrl(Uri buildUri)
  • GetWorkItemQueryEditorUrl(Uri projectUri, string queryPath)

La prochaine fois je vous ferai découvrir l’API de Build du TFS SDK, via le type IBuildServer.

Monday, December 21, 2009 8:17:37 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Outlook Work Items Extension | Team System Web Access | TFS SDK
# Friday, December 18, 2009

Après les nombreux retours des utilisateurs auprès de Microsoft liés aux problèmes de performance de Visual Studio 2010 Beta 2, Microsoft a décidé de repousser de quelques semaines le lancement de Visual Studio 2010. Microsoft mettra à disposition une Release Candidate en Février. Le lancement de Visual Studio est donc repoussé au mois d’Avril. Scott Guthrie et Somasegar, ainsi que d’autres personnes, ont relayé cette information sur leur blog respectif. Ce décalage va permettre aux équipes de développement de Visual Studio de travailler sur l’amélioration des performances.

Brian Harry communique d’ailleurs régulièrement sur ces améliorations. On retrouve ainsi sur son blog une vidéo de comparaison des performances entre le Debugger de VS 2010 Beta 2 et la version actuelle. Egalement disponible, des tableaux comparatifs sur l’amélioration des performances de l’éditeur de code et de l’intelliSense et sur le chargement des solutions.

Friday, December 18, 2009 11:07:18 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Performance | Visual Studio
# Monday, December 14, 2009

Pour rappel, dans le premier lab je vous proposais de découvrir les bases d’Entity Framework. Mon objectif était de vous montrer qu’il est aujourd’hui très facile de démarrer un projet avec Entity Framework.

Dans ce second Lab, mon objectif premier reste le même, vous montrer qu’il est très facile de travailler avec Entity Framework 4.0. Ce lab met en évidence la puissance (et la stabilité…) du Designer d’EDMX qui, à ma connaissance, n’est égalée par aucun outil de mapping O/R actuellement. Attention je ne suis pas en train de dire qu’Entity Framework est le meilleur outil de mapping O/R devant NHibernate, EUSS, etc. Par contre c’est l’outil qui est le mieux intégré à Visual Studio grâce à l’éditeur de modèle, il permet ainsi d’être encore plus productif...

Dans ce 2ème atelier je vous propose de découvrir les notions suivantes :

  • la définition d’un ComplexType
  • l’héritage Table Per Type et Table Per Hierarchy
  • les relations Many to Many
  • le mapping de procédures stockées sur les opérations de persistance d’une entité
  • la récupération d’une liste d’entités en faisant appel à une procédure stockée
  • l’appel d’une fonction scalaire SQL
  • la notion de DefiningQuery

Pour les pré-requis logiciel, pas de changement, vous avez besoin de :

  • Visual Studio 2010 Beta 2
  • 1 SQL Server (Express ou Standard)

le zip avec les ressources de ce lab :

 

Bonne découverte!

Le screenshot ci-dessous illustre toutes les notions abordées dans ce lab :

image

Monday, December 14, 2009 2:28:25 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Entity Framework 4.0
# Tuesday, December 08, 2009

Si vous avez déjà fait de la Reflection alors vous connaissez surement la méthode GetCustomAttributes(bool inherit) de la classe MemberInfo qui permet de retrouver la liste des attributs d’un membre d’un type.

 

Comme vous vous en doutez le paramètre booléen inherit permet d’indiquer au framework s’il doit rechercher également dans les types de base (du style vous avez une propriété abstraite avec des attributs dans la classe de base, et cette propriété est « overridée » dans une classe fille).

Vous écrivez le code d’appel à la méthode GetCustomAttributes, vous exécutez et vous remarquez que l’attribut de la classe de base n’est pas trouvé.

 

Un petit tour sur la msdn : http://msdn.microsoft.com/en-us/library/kff8s254.aspx  

D’après la msdn voici à quoi sert le paramètre booléen inherit : 

 

image 

 

C’est donc bien ce que nous avions compris… le booléen permet d’indiquer que l’on veut également récupérer les attributs du membre des types de base.

L’exemple donné sur la msdn confirme bien l’utilisation de ce paramètre :

 

image 

 

Là je me pose la question : c’est quoi l’arnaque ? Qu’est-ce que j’ai pu louper dans l’utilisation de cette méthode ?

 

Comme d’habitude, qui vient à mon secours dans ces moments là ? Reflector!

Et là c’est l’hallu… Je vous laisse en juger par vous même :

 

clip_image001 

 

Eh oui vous voyez comme moi, le paramètre bool inherit n’est pas utilisé… en fait ici il ne sert à rien…

Certains diront que c’est un bug. Moi je préfère dire que ce n’en ai pas un, que c’est juste une méthode qui n’est pas tout à fait terminée… chez moi j’appelle ça un bug normal, mais peu importe.

 

Heureusement il y a toujours une solution !! Il suffit d’utiliser la méthode statique System.Attribute.GetCustomAttributes(MemberInfo m, bool inherit).  

Comme vous pouvez le voir ci-dessous celle-ci fait bien ce qu’on lui demande de faire :

 

clip_image005 

 

Ce genre d’oubli me rassure tout de même, car je me dis que finalement ce sont des hommes comme vous et moi qui codent le framework.

Tuesday, December 08, 2009 5:10:02 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
C# | Framework .Net
# Sunday, December 06, 2009

Depuis 1 mois je passe une grande partie de mon temps libre à découvrir Entity Framework 4.0. J’ai d’ailleurs proposé à mes collègues de chez Bewise de le découvrir par eux même en leur proposant 4 labs d’1 heure chacun environ.

Aujourd’hui je vous propose de le découvrir par vous-même en vous mettant ces labs à disposition.

Les labs se présentent de cette manière :

  • Un document de type “Pas à Pas”
  • Un starter + 1 base de données
  • Une solution

Dans le premier labs “Les Bases d’Entity Framework 4.0” je vous propose de découvrir :

  • la création d’un modèle d’Entity avec quelques customisations du modèle, comme par exemple l’héritage de type “Table Per Hierarchy”
  • l’utilisation du composant EntityDataSource, afin de lier les données à des contrôles ASP.NET
  • les bases de la persistance en mode déconnecté afin de comprendre comment rattacher un objet à l’ObjectContext

Concernant les pré-requis logiciel vous avez besoin de :

  • Visual Studio 2010 Beta 2
  • 1 SQL Server (Express ou Standard)

Et enfin pour aborder ce labs sereinement il est préférable d’avoir une expérience en développement ASP.NET et C#.

Pour ceux qui veulent seulement regarder la solution, n’oubliez pas d’éditer la chaine de connexion dans les fichiers de config.

Voici le zip contenant toutes les ressources :

Bon courage ;)

Sunday, December 06, 2009 11:44:32 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Entity Framework 4.0
# Sunday, November 08, 2009

VSTS Test Load Agent permet de répartir l’exécution de tests sur plusieurs agents fédérés par un contrôleur afin d’effectuer des tests de montée en charge.

J’ai récemment publié un article sur le site Tech Head Brothers que vous pouvez lire ici. Cet article traite de la mise en place de VSTS Test Load Agent, depuis l’installation jusqu’a l’exécution des tests, en passant par la configuration des agents et du contrôleur.

Sunday, November 08, 2009 2:13:19 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Tests | VSTS
Archive
<January 2010>
SunMonTueWedThuFriSat
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456
About the author/Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

© Copyright 2010
Benoît Laut
Sign In
All Content © 2010, Benoît Laut
DasBlog theme 'Business' created by Christoph De Baene (delarou)