dimanche 21 juillet 2013

Ajouter l'effort au bogue et le gérer dans le Web Access 2013

Je vais décrire comment intégrer le temps estimé, effectué et restant sur un bogue dans le modèle de processus Msf Agile 7.x en langue Fr-Fr et Team Foundation Server 2013. Les modifications permettront aussi de visualiser les bogues dans le tableau du Web Access, et gérer la capacité de l'équipe sur le travail restant des tâches et bogues. Enfin, les bogues seront directement utilisables dans la page "Mon travail" sous Visual Studio 2013.
Globalement, la démarche nécessite de modifier le type d’élément de travail Bogue afin de lui ajouter les champs de références, les états et transitions nécessaires. Puis, il faudra modifier le fichier de configuration du processus et les catégories. Pour effectuer ces mêmes opérations sur TFS 2012 (ou TFS en en-US), vous pouvez vous reporter à mes précédents messages Ajouter l'effort au type bogue et Afficher le bogue dans le Web Access

Modifier le fichier bogue

Exporter la définition du Bogue depuis votre projet d'équipe basé sur le processus Msf Agile 7.x :
$NomProjetEquipe = "TestProjMsfAgile7"
$UrlCollectionTfs = "http://VSTFS2013FR:8080/tfs/DefaultCollection"
$WitAdmin = "${env:ProgramFiles(x86)}\Microsoft Visual Studio 12.0\Common7\IDE\witadmin.exe"
$Reptemp = "C:\temp"
 
#Exporter le WIT Bogue
& $WitAdmin importwitd /collection:$UrlCollectionTfs /p:$NomProjetEquipe /f:"$Reptemp\Bogue.xml" /n:Bogue
Le type d'élément de travail Bogue n'a pas ou peu évolué dans cette version 7.x de Msf Agile. Les modifications à réaliser sont à peu près identiques aux précédentes versions à savoir :
  • ajouter les champs de référence Microsoft.VSTS.Scheduling.Xxxx et Microsoft.VSTS.Common.Activity
  • <FIELD name="Activité" refname="Microsoft.VSTS.Common.Activity" type="String" reportable="dimension">
     <HELPTEXT>Type de travail concerné</HELPTEXT>
     <SUGGESTEDVALUES expanditems="true">
      <LISTITEM value="Développement" />
      <LISTITEM value="Test en cours" />
      <LISTITEM value="Spécifications" />
      <LISTITEM value="Design" />
      <LISTITEM value="Déploiement" />
      <LISTITEM value="Documentation" />
     </SUGGESTEDVALUES>
    </FIELD>
    <FIELD name="Travail restant" refname="Microsoft.VSTS.Scheduling.RemainingWork" type="Double" reportable="measure" formula="sum">
     <HELPTEXT>Estimation du nombre d'unités de travail restantes pour terminer cette tâche</HELPTEXT>
    </FIELD>
    <FIELD name="Estimation d'origine" refname="Microsoft.VSTS.Scheduling.OriginalEstimate" type="Double" reportable="measure" formula="sum">
     <HELPTEXT>Valeur initiale du travail restant - à définir au début du travail</HELPTEXT>
    </FIELD>
    <FIELD name="Travail effectué" refname="Microsoft.VSTS.Scheduling.CompletedWork" type="Double" reportable="measure" formula="sum">
     <HELPTEXT>Nombre d'unités de travail consacrées à cette tâche</HELPTEXT>
    </FIELD>
  • ajouter les états Nouveau et Supprimé
  • <STATE value="Nouveau">
     <FIELDS>
      <FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
       <EMPTY />
      </FIELD>
      <FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
       <ALLOWEXISTINGVALUE />
       <EMPTY />
      </FIELD>
      <FIELD refname="Microsoft.VSTS.Common.ClosedDate">
       <EMPTY />
      </FIELD>
      <FIELD refname="Microsoft.VSTS.Common.ClosedBy">
       <ALLOWEXISTINGVALUE />
       <EMPTY />
      </FIELD>
      <FIELD refname="Microsoft.VSTS.Common.ResolvedReason">
       <EMPTY />
      </FIELD>
      <FIELD refname="Microsoft.VSTS.Common.ResolvedBy">
       <ALLOWEXISTINGVALUE />
       <EMPTY />
      </FIELD>
      <FIELD refname="Microsoft.VSTS.Common.ResolvedDate">
       <EMPTY />
      </FIELD>
     </FIELDS>
    </STATE>
    <STATE value="Supprimé" />
  • ajouter et modifier les transitions essentielles permettant de naviguer d'un état donné à un autre. Pour la lisibilité de ce message, vous les trouverez à la fin de celui-ci.
  • ajouter des contrôles dans l'interface correspondants aux champs de référence Microsoft.VSTS.Scheduling.Xxxx et Microsoft.VSTS.Common.Activity
  • <!-- interface ajouter dans le groupe avec la Planification et la Classification 
         et  Ajuster les pourcentages-->
    <Column PercentWidth="20">
     <Group Label="Effort (en heures)">
      <Column PercentWidth="100">
       <Control FieldName="Microsoft.VSTS.Scheduling.OriginalEstimate" Type="FieldControl" Label="Estimation d'origine" LabelPosition="Left" />
       <Control FieldName="Microsoft.VSTS.Scheduling.RemainingWork" Type="FieldControl" Label="Restant" LabelPosition="Left" />
       <Control FieldName="Microsoft.VSTS.Scheduling.CompletedWork" Type="FieldControl" Label="Terminé" LabelPosition="Left" />
      </Column>
     </Group>
    </Column>
    <!-- et activité dans la colonne Planification en dernière ligne + ajustement des pourcentages -->
    <Control FieldName="Microsoft.VSTS.Common.Activity" Type="FieldControl" Label="Activité" LabelPosition="Left" EmptyText="&lt;Aucun&gt;" />
Importer cette nouvelle définition du Bogue dans votre projet d'équipe basé sur le processus Msf Agile 7.x :
$NomProjetEquipe = "TestProjMsfAgile7"
$UrlCollectionTfs = "http://VSTFS2013FR:8080/tfs/DefaultCollection"
$WitAdmin = "${env:ProgramFiles(x86)}\Microsoft Visual Studio 12.0\Common7\IDE\witadmin.exe"
$Reptemp = "C:\temp"
 
#Exporter le WIT Bogue
& $WitAdmin importwitd /collection:$UrlCollectionTfs /p:$NomProjetEquipe /f:"$Reptemp\Bogue.xml"

Modifier les catégories et la configuration du processus

Exporter la configuration du processus et les catégories du projet d'équipe :
$NomProjetEquipe = "TestProjMsfAgile7"
$UrlCollectionTfs = "http://VSTFS2013FR:8080/tfs/DefaultCollection"
$WitAdmin = "${env:ProgramFiles(x86)}\Microsoft Visual Studio 12.0\Common7\IDE\witadmin.exe"
$Reptemp = "C:\temp"
 
#Exporter la configuration du processus et les catégories
& $WitAdmin exportprocessconfig /collection:$UrlCollectionTfs /p:$NomProjetEquipe /f:"$Reptemp\ProcessConfiguration.xml"
& $WitAdmin exportcategories /collection:$UrlCollectionTfs /p:$NomProjetEquipe /f:"$Reptemp\Categories.xml"
Modifier le fichier des catégories pour ajouter le Bogue dans la catégorie de tâche :
<CATEGORY refname="Microsoft.TaskCategory" name="Catégorie de tâche">
 <DEFAULTWORKITEMTYPE name="Tâche" />
 <WORKITEMTYPE name="Bogue" />
</CATEGORY>
Modifier le fichier de configuration du processus pour introduire les modifications réalisées :
<BugWorkItems category="Microsoft.BugCategory" pluralName="Bogues" singularName="Bogue">
 <States>
  <State type="Proposed" value="Nouveau" /> <!-- Ajouter l'état Nouveau -->
  <State type="InProgress" value="Actif" />
  <State type="Complete" value="Fermé" />
  <State type="Resolved" value="Résolu" />
 </States>
</BugWorkItems>
<!-- ... -->
<TaskBacklog>
  <!-- remplacer les éléments States du TaskBacklog par les suivants -->
  <States>
  <State type="Proposed" value="Nouveau" />
  <State type="InProgress" value="Actif" />
  <State type="Resolved" value="Résolu" />
  <State type="Complete" value="Fermé" />
 </States>
</TaskBacklog>
Importer les catégories puis la configuration du processus dans le projet d'équipe :
$NomProjetEquipe = "TestProjMsfAgile7"
$UrlCollectionTfs = "http://VSTFS2013FR:8080/tfs/DefaultCollection"
$WitAdmin = "${env:ProgramFiles(x86)}\Microsoft Visual Studio 12.0\Common7\IDE\witadmin.exe"
$Reptemp = "C:\temp"
 
#Importer les catégories et configuration du processus
& $WitAdmin importcategories /collection:$UrlCollectionTfs /p:$NomProjetEquipe /f:"$Reptemp\Categories.xml"
& $WitAdmin importprocessconfig /collection:$UrlCollectionTfs /p:$NomProjetEquipe /f:"$Reptemp\ProcessConfiguration.xml"
Vous pouvez maintenant profiter de votre tableau tout frais affichant les bogues et tâches associées aux récits utilisateurs de l'itération choisie. Un tableau est désormais disponible pour chaque itération (plus uniquement celle en cours). Notez que le lien a été déplacé en conséquence.

Quelques Réflexions

J'ai utilisé ici un script PowerShell pour l’exécution des commandes. Même si celles-ci restent très simple, j'ai trouvé cela plus facile qu'une invite de commandes sans compter les possibilités plus vastes disponibles.
La configuration du processus avec un seul fichier est une réelle avancée pour la personnalisation. Les changements sont plus faciles à réaliser et il n'est plus besoin de réfléchir à l'ordre d'importation des fichiers.

have a nice day.

Les transitions du type Bogue à ajouter ou à modifier dans le noeud TRANSITIONS :
<!-- transitions ajoutées -->
<TRANSITION from="" to="Nouveau">
 <REASONS>
  <DEFAULTREASON value="Nouveau" />
  <REASON value="Échec de la génération" />
 </REASONS>
</TRANSITION>
<TRANSITION from="Actif" to="Nouveau">
 <REASONS>
  <DEFAULTREASON value="Travail interrompu" />
 </REASONS>
 <ACTIONS>
  <ACTION value="Microsoft.VSTS.Actions.StopWork" />
 </ACTIONS>
</TRANSITION>
<TRANSITION from="Supprimé" to="Nouveau">
 <REASONS>
  <DEFAULTREASON value="Reconsidération du bogue" />
 </REASONS>
</TRANSITION>
<TRANSITION from="Actif" to="Supprimé">
 <REASONS>
  <DEFAULTREASON value="Supprimé du Backlog" />
 </REASONS>
</TRANSITION>
<TRANSITION from="Nouveau" to="Supprimé">
 <REASONS>
  <DEFAULTREASON value="Supprimé du Backlog" />
 </REASONS>
</TRANSITION>
<!-- et aussi -->
<TRANSITION from="Fermé" to="Résolu">
 <REASONS>
  <DEFAULTREASON value="Non vérifié" />
 </REASONS>
 <FIELDS>
  <FIELD refname="System.AssignedTo">
   <COPY from="field" field="Microsoft.VSTS.Common.ClosedBy" />
  </FIELD>
 </FIELDS>
</TRANSITION>
<TRANSITION from="Actif" to="Fermé">
 <REASONS>
  <DEFAULTREASON value="Corrigé">
   <FIELDS>
    <FIELD refname="Microsoft.VSTS.Common.ResolvedReason">
     <COPY from="value" value="Corrigé" />
     <ALLOWEDVALUES expanditems="true">
      <LISTITEM value="Corrigé" />
     </ALLOWEDVALUES>
    </FIELD>
   </FIELDS>
  </DEFAULTREASON>
  <REASON value="Correspond aux spécif.">
   <FIELDS>
    <FIELD refname="Microsoft.VSTS.Common.ResolvedReason">
     <COPY from="value" value="Correspond aux spécif." />
     <ALLOWEDVALUES expanditems="true">
      <LISTITEM value="Correspond aux spécif." />
     </ALLOWEDVALUES>
    </FIELD>
   </FIELDS>
  </REASON>
  <REASON value="Reproduction impossible">
   <FIELDS>
    <FIELD refname="Microsoft.VSTS.Common.ResolvedReason">
     <COPY from="value" value="Reproduction impossible" />
     <ALLOWEDVALUES expanditems="true">
      <LISTITEM value="Reproduction impossible" />
     </ALLOWEDVALUES>
    </FIELD>
   </FIELDS>
  </REASON>
  <REASON value="Différé">
   <FIELDS>
    <FIELD refname="Microsoft.VSTS.Common.ResolvedReason">
     <COPY from="value" value="Différé" />
     <ALLOWEDVALUES expanditems="true">
      <LISTITEM value="Différé" />
     </ALLOWEDVALUES>
    </FIELD>
   </FIELDS>
  </REASON>
  <REASON value="Dupliqué">
   <FIELDS>
    <FIELD refname="Microsoft.VSTS.Common.ResolvedReason">
     <COPY from="value" value="Dupliqué" />
     <ALLOWEDVALUES expanditems="true">
      <LISTITEM value="Dupliqué" />
     </ALLOWEDVALUES>
    </FIELD>
   </FIELDS>
  </REASON>
  <REASON value="Obsolète">
   <FIELDS>
    <FIELD refname="Microsoft.VSTS.Common.ResolvedReason">
     <COPY from="value" value="Obsolète" />
     <ALLOWEDVALUES expanditems="true">
      <LISTITEM value="Obsolète" />
     </ALLOWEDVALUES>
    </FIELD>
   </FIELDS>
  </REASON>
  <REASON value="Copié dans le Backlog">
   <FIELDS>
    <FIELD refname="Microsoft.VSTS.Common.ResolvedReason">
     <COPY from="value" value="Copié dans le Backlog" />
     <ALLOWEDVALUES expanditems="true">
      <LISTITEM value="Copié dans le Backlog" />
     </ALLOWEDVALUES>
    </FIELD>
   </FIELDS>
  </REASON>
 </REASONS>
 <FIELDS>
  <FIELD refname="Microsoft.VSTS.Common.ResolvedReason">
   <COPY from="value" value="Corrigé" />
  </FIELD>
  <FIELD refname="Microsoft.VSTS.Common.ResolvedBy">
   <ALLOWEXISTINGVALUE />
   <COPY from="currentuser" />
   <VALIDUSER />
   <REQUIRED />
  </FIELD>
  <FIELD refname="System.AssignedTo">
   <COPY from="field" field="System.CreatedBy" />
  </FIELD>
  <FIELD refname="Microsoft.VSTS.Common.ResolvedDate">
   <SERVERDEFAULT from="clock" />
  </FIELD>
  <FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
   <ALLOWEXISTINGVALUE />
   <READONLY />
  </FIELD>
  <FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
   <READONLY />
  </FIELD>
 </FIELDS>
</TRANSITION>
<TRANSITION from="Fermé" to="Actif">
 <REASONS>
  <DEFAULTREASON value="Régression" />
  <REASON value="Réactivé" />
 </REASONS>
 <FIELDS>
  <FIELD refname="System.AssignedTo">
   <COPY from="field" field="Microsoft.VSTS.Common.ResolvedBy" />
  </FIELD>
  <FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
   <ALLOWEXISTINGVALUE />
   <COPY from="currentuser" />
   <VALIDUSER />
   <REQUIRED />
  </FIELD>
  <FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
   <SERVERDEFAULT from="clock" />
  </FIELD>
 </FIELDS>
</TRANSITION>
<!-- transition modifiée -->
<!-- from="" to="Actif" remplacée par -->
<TRANSITION from="Nouveau" to="Actif">
 <REASONS>
  <DEFAULTREASON value="Travail démarré" />
 </REASONS>
 <FIELDS>
  <FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
   <ALLOWEXISTINGVALUE />
   <COPY from="currentuser" />
   <VALIDUSER />
   <REQUIRED />
  </FIELD>
  <FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
   <SERVERDEFAULT from="clock" />
  </FIELD>
  <FIELD refname="System.AssignedTo">
   <DEFAULT from="currentuser" />
  </FIELD>
 </FIELDS>
 <ACTIONS>
  <ACTION value="Microsoft.VSTS.Actions.StartWork" />
 </ACTIONS>
</TRANSITION>

Aucun commentaire:

Enregistrer un commentaire