Muy buenas,

No tenía pensado comentar nada al respecto, pero después de aprender a usar la herramienta, detectar algunos bugs y un poco de trabajo de “chinos”, creo que es una pequeña ayuda para que podáis entender la migración entre distintos “Team Projects” con distintas plantillas de procesos:

Antes de nada, para el que no conozca “TFS Integration Tool (o, TFS Integration Platform)” es un herramienta de CodePlex, que facilita la migración/integración entre diferentes versiones de Work Items, Bug Tracking, etc.

Aunque está en beta, siempre que no se haya “customizado” complicadamente algún work item, cosa que no es de extrañar en algún caso, Risa), la herramienta funciona bastante bien, salvo algunas limitaciones en cuanto a items que no son migrados a día de hoy:

  • Check-in notes
  • Labels
  • Permissions
  • Workspaces
  • Pending Changes
  • Shelvesets
  • File encodings
  • Subscriptions
  • Test Cases
  • Check-in policies
  • Reports
  • Team Portal / SharePoint
  • Process Templates
  • Work item queries
  • Builds
  • Warehouse data

Hasta donde he podido llegar, los “Labels” si los migra, Risa.

Aunque podemos encontrarnos casos más complejos, entre otros, que el TeamProject destino exista y ya tenga bastante código, Work Items, changesets, etc, por el momento, os dejo un resumen de mi caso en concreto (desde “MSF for CMMI Process Improvement v4.2” a “MSF for CMMI Process Improvement CMMI5”) donde el TeamProject destino está recién creado:

  • Crea el “TeamProject” destino basado en la Platilla “MSF for CMMI Process Improvement v5.0
  • Abre la consola de administración de TFS y asignar el usuario con el que se vaya a lanzar la migración desde el “TFS Integration” dentro del grupo “Team Foundation Services Account”. Como en la mayoría de los casos seremos nosotros mismos, los que lancemos la migración, pues bastará con seguir los pasos (1) y (2) según indico en la siguiente figura, y si ya apareces como “Administrator Console Users”, haz click en “Reaply” para que se puedan aplicar los permisos oportunos y, todo listo.     Si quieres conocer más información al respecto de este punto, echa un vistazo a este post de “Willy’s Cave”.

image

  • Abre el “TFS Integration”, crea una nueva configuración(“Create new”) y elige “VersionControlAndWorkItemTracking.xml
  • Selecciona el “Workflow Type” “Custom(el resto, en la versión “2.1.10324.0” no parece que vayan del todo bien, no se guardan las reglas, tienes que aplicar de  nuevo la migración y finalmente la esta nunca se produce !!!)

image

  • Utiliza los siguientes valores para realizar tu configuración de Mapeo/Migración:

image

  • En el paso (2) aparecerá una nueva ventana donde tendrás que indicar los mapeos entre los distintos Work Items y sus campos.

image

  • Este mapeo está listo para los Work Items de tipo “Requirement” y “Task”, el resto podrás crearlos tu mismo sin mayor esfuerzo una vez que entiendas estos, eso si, tendrás que conocer las diferencias de campos y poder hacer así el mapeo.
 1: <SettingXml>

 

 2:   <WITSessionCustomSetting>

 

 3:     <Settings />

 

 4:     <WorkItemTypes>

 

 5:       <WorkItemType LeftWorkItemTypeName="Task" RightWorkItemTypeName="Task" fieldMap="Migrate2Tasks" />

 

 6:       <WorkItemType LeftWorkItemTypeName="Requirement" RightWorkItemTypeName="Requirement" fieldMap="Migrate2Requirements" />

 

 7:       <WorkItemType LeftWorkItemTypeName="Bug" RightWorkItemTypeName="Bug" fieldMap="*" />

 

 8:       <WorkItemType LeftWorkItemTypeName="Issue" RightWorkItemTypeName="Issue" fieldMap="*" />

 

 9:       <WorkItemType LeftWorkItemTypeName="Change Request" RightWorkItemTypeName="Issue" fieldMap="*" />

 

 10:     </WorkItemTypes>

 

 11:     <FieldMaps>

 

 12:

 

 13:       <FieldMap name="Migrate2Tasks">

 

 14:         <MappedFields>

 

 15:

 

 16:           <!-- Mapeo de todos los campos -->

 

 17:           <MappedField LeftName="*" RightName="*" MapFromSide="Left" />

 

 18:

 

 19:           <!--- Excepciones a los mapeos -->

 

 20:           <!-- Mapeos sin destino -->

 

 21:           <MappedField LeftName="Severity" RightName="" MapFromSide="Left" valueMap="" />

 

 22:           <MappedField LeftName="Issue" RightName="" MapFromSide="Left" valueMap="" />

 

 23:           <MappedField LeftName="Start Change Date" RightName="" MapFromSide="Left" valueMap="" />

 

 24:           <MappedField LeftName="Exit Criteria" RightName="" MapFromSide="Left" valueMap="" />

 

 25:           <MappedField LeftName="Test Id" RightName="" MapFromSide="Left" valueMap="" />

 

 26:           <MappedField LeftName="Test Name" RightName="" MapFromSide="Left" valueMap="" />

 

 27:           <MappedField LeftName="Test Path" RightName="" MapFromSide="Left" valueMap="" />

 

 28:           <MappedField LeftName="Estimate" RightName="Microsoft.VSTS.Scheduling.OriginalEstimate" MapFromSide="Left" valueMap="" />

 

 29:           <!-- Mapeos con cambio en el destino -->

 

 30:           <MappedField LeftName="Triage" RightName="Microsoft.VSTS.Common.Triage" MapFromSide="Left" valueMap="TriageMap" />

 

 31:           <MappedField LeftName="Priority" RightName="Microsoft.VSTS.Common.Priority" MapFromSide="Left" valueMap="PriorityMap" />

 

 32:           <MappedField LeftName="Discipline" RightName="Microsoft.VSTS.Common.Discipline" MapFromSide="Left" valueMap="DisciplineMap" />

 

 33:           <MappedField LeftName="Task Type" RightName="Microsoft.VSTS.Common.TaskType" MapFromSide="Left" valueMap="TaskTypeMap" />

 

 34:

 

 35:         </MappedFields>

 

 36:       </FieldMap>

 

 37:

 

 38:       <FieldMap name="Migrate2Requirements">

 

 39:         <MappedFields>

 

 40:

 

 41:           <MappedField LeftName="*" RightName="*" MapFromSide="Left" />

 

 42:

 

 43:           <MappedField LeftName="Issue" RightName="" MapFromSide="Left" valueMap="" />

 

 44:

 

 45:           <MappedField LeftName="Rank" RightName="Microsoft.VSTS.Common.StackRank" MapFromSide="Left" valueMap="" />

 

 46:           <MappedField LeftName="Estimate" RightName="Microsoft.VSTS.Scheduling.OriginalEstimate" MapFromSide="Left" valueMap="" />

 

 47:

 

 48:           <MappedField LeftName="Requirement Type" RightName="Microsoft.VSTS.CMMI.RequirementType" MapFromSide="Left" valueMap="RequirementType2Map" />

 

 49:           <MappedField LeftName="Priority" RightName="Microsoft.VSTS.Common.Priority" MapFromSide="Left" valueMap="PriorityMap" />

 

 50:           <MappedField LeftName="Triage" RightName="Microsoft.VSTS.Common.Triage" MapFromSide="Left" valueMap="TriageMap" />

 

 51:

 

 52:           <!-- These are not exist on target -->

 

 53:           <!--<MappedField LeftName="Start Date" RightName="Microsoft.VSTS.Scheduling.StartDate" MapFromSide="Left" valueMap="" />

 

 54:  <MappedField LeftName="Finish Date" RightName="Microsoft.VSTS.Scheduling.FinishDate" MapFromSide="Left" valueMap="" />-->

 

 55:

 

 56:         </MappedFields>

 

 57:       </FieldMap>

 

 58:     </FieldMaps>

 

 59:

 

 60:     <ValueMaps>

 

 61:       <!-- Tasks values -->

 

 62:       <ValueMap name="TriageMap">

 

 63:         <Value LeftValue="Pending" RightValue="Pending"/>

 

 64:         <Value LeftValue="More Info" RightValue="More Info"/>

 

 65:         <Value LeftValue="Info Recv" RightValue="Info Received"/>

 

 66:         <Value LeftValue="Triaged" RightValue="Triaged"/>

 

 67:       </ValueMap>

 

 68:

 

 69:       <ValueMap name="PriorityMap">

 

 70:         <Value LeftValue="1" RightValue="1" />

 

 71:         <Value LeftValue="2" RightValue="2" />

 

 72:         <Value LeftValue="3" RightValue="3" />

 

 73:         <!--<Value LeftValue="" RightValue="4" />-->

 

 74:       </ValueMap>

 

 75:

 

 76:       <ValueMap name="DisciplineMap">

 

 77:         <Value LeftValue="Analysis" RightValue="Analysis" />

 

 78:         <Value LeftValue="User Experience" RightValue="User Experience" />

 

 79:         <Value LeftValue="User Education" RightValue="User Education" />

 

 80:         <Value LeftValue="Test" RightValue="Test" />

 

 81:       </ValueMap>

 

 82:

 

 83:       <ValueMap name="TaskTypeMap">

 

 84:         <Value LeftValue="Analysis" RightValue="Corrective Action" />

 

 85:         <Value LeftValue="User Experience" RightValue="Mitigation Action" />

 

 86:         <!--<Value LeftValue="" RightValue="Planned" />-->

 

 87:       </ValueMap>

 

 88:

 

 89:       <ValueMap name="RequirementType2Map">

 

 90:         <Value LeftValue="Scenario" RightValue="Scenario"/>

 

 91:         <Value LeftValue="Quality of Service" RightValue="Quality of Service"/>

 

 92:         <Value LeftValue="Functional" RightValue="Functional"/>

 

 93:         <Value LeftValue="Operational" RightValue="Operational"/>

 

 94:         <Value LeftValue="Interface" RightValue="Interface"/>

 

 95:         <Value LeftValue="Security" RightValue="Security"/>

 

 96:         <Value LeftValue="Safety" RightValue="Safety"/>

 

 97:         <!--<Value LeftValue="" RigthValue="Business Objective"/>

 

 98:  <Value LeftValue="" RigthValue="Feature"/>-->

 

 99:       </ValueMap>

 

 100:     </ValueMaps>

 

 101:   </WITSessionCustomSetting>

 

 102: </SettingXml>

 

 103: <SettingXmlSchema />

 

  • Algunas notas aclaratorias sobre el mapeo:
    • Las líneas de la 5 a la 9, indican los Work Items a mapear.
    • Las líneas 5 y 6 incluyen el atributo “fieldMap” cuyo valor indica el mapeo en particular, que se corresponden con las líneas 17 y 38 respectivamente.
    • Adicionalmente en este código hago algunas aclaraciones al respecto, así que no habrá problema en entenderlo.
    • Las líneas de la 60 a la 100, indican los diferentes valores para las opciones posibles de ciertos campos.
    • Las líneas comentadas se corresponden principalmente con aquellos mapeos de campos que no existen en origen pero si en el destino (en el nuevo TeamProject), por tanto no las mapeo, puesto que no son requeridas.

Nota: Para completar el resto de mapeos, haz uso de los fichero “XML” de las distintas plantillas, así podrás conocer el detalle de los mapeos a realizar.

  • Guarda los cambios “Save to Database.
  • Y comienza con la integración/migración “Current Migration” – “Start

image

  • Una vez finalizado el proceso, podrás comprobar que el nuevo TeamProject contiene todo el código; Work Items, labels, Branching (sin “Trak Changeset” !), changeset asociados, etc., y si estableces como parámetro de configuración,  el “Workflow Type”, “Custom” para un “Frecuency”,  “ContinousAutomatic”, podrás comprobar que a medida que cambias código, haces “CheckIn”, etc., todo se verá reflejado en el nuevo como si se tratara del mismo TeamProject.

De la misma manera que este proceso de integración entre dos TeamProject ha sido un éxito, también podrás hacerlo para distintas “Queries” de origen y por tanto, “Area Path”, etc. El peso principal recae sobre cada uno de los mapeos según he comentado antes, y podrás hacerlo, para distintas plantillas de proceso, Scrum, MSF Agile, etc., e incluso entre distintas  plantillas origen y destino.

Mucha suerte y espero que sirva de ayuda/aclaración, Guiño

Saludos @TFS

Juanlu, elGuerre