Buenas,
cuando trabajas con TFS Integration Platform un escenario muy probable es:
Migrar los contenidos de un Team Project desde Team Foundation Server 2008 a Team Foundation Server 2010.
Si bien los conceptos básicos de Source Control y WorkItem Tracking siguen siendo similares entre ambas versiones, las plantillas de proceso han cambiado bastante y la migración de WorkItems puede traernos bastante dolores de cabeza. Si los has personalizado o extendido, pues mucho más. En estos casos, tendremos que modificar la definición de un proyecto de migración para en el mismo, definir mapeos personalizados para dar solución a estos casos.
Definir un tipo de WorkItem diferente
El siguiente Xml define una configuración donde todos los elementos del WorkItem Type [Error] se migrarán al WorkItem Type [Bug]. En este mapeo los campos de ambos WorkItem Types deben coincidir para que funcione el proceso de migración.
1: <SettingXml>
2: <WITSessionCustomSetting>
3: <WorkItemTypes>
4: <WorkItemType LeftWorkItemTypeName="Error" RightWorkItemTypeName="Bug" fieldMap="@@ALL@@" />
5: </WorkItemTypes>
6: </WITSessionCustomSetting>
7: </SettingXml>
8: <SettingXmlSchema />
Definir un tipo de WorkItem diferente con mapeo de campos personalizado
El siguiente Xml define una configuración donde todos los elementos del WorkItem Type [Error] se migrarán al WorkItem Type [Bug], utilizando un mapeo especial de campos para los campos diferentes en ambas definiciones. En este caso el mapeo especial se denomina [Error2BugFieldMap] y en el mismo se definen los nombres de los campos y los mapeos correspondiente entre los mismos.
1: <SettingXml>
2: <WITSessionCustomSetting>
3: <WorkItemTypes>
4: <WorkItemType LeftWorkItemTypeName="Error" RightWorkItemTypeName="Bug" fieldMap="Error2BugFieldMap" />
5: </WorkItemTypes>
6: <FieldMaps>
7: <FieldMap name="Error2BugFieldMap">
8: <MappedFields>
9: <MappedField LeftName="Headline" RightName="System.Title" MapFromSide="Left" valueMap="" />
10: <MappedField LeftName="Headline" RightName="System.Title" MapFromSide="Right" valueMap="" />
11: <MappedField LeftName="State" RightName="System.State" MapFromSide="Left" valueMap="" />
12: <MappedField LeftName="State" RightName="System.State" MapFromSide="Right" valueMap="" />
13: <MappedField LeftName="Description" RightName="System.Description" MapFromSide="Left" valueMap="" />
14: <MappedField LeftName="Description" RightName="System.Description" MapFromSide="Right" valueMap="" />
15: </MappedFields>
16: </FieldMap>
17: </FieldMaps>
18: </WITSessionCustomSetting>
19: </SettingXml>
20: <SettingXmlSchema />
Definir un tipo de WorkItem diferente con mapeo de campos personalizado y valores personalizados
El siguiente ejemplo extiende el escenario anterior ya que para los mapeos de campos, además define una serie de diccionarios donde se realizan los mapeos de los valores personalizados entre los campos de cada tipo de WorkItem (ejemplos en las líneas 11 y 19).
1: <SettingXml>
2: <WITSessionCustomSetting>
3: <WorkItemTypes>
4: <WorkItemType LeftWorkItemTypeName="Error" RightWorkItemTypeName="Bug" fieldMap="Error2BugFieldMap" />
5: </WorkItemTypes>
6: <FieldMaps>
7: <FieldMap name="Error2BugFieldMap">
8: <MappedFields>
9: <MappedField LeftName="Headline" RightName="System.Title" MapFromSide="Left" valueMap="" />
10: <MappedField LeftName="Headline" RightName="System.Title" MapFromSide="Right" valueMap="" />
11: <MappedField LeftName="State" RightName="System.State" MapFromSide="Left" valueMap="StateMapCQ2TFS" />
12: <MappedField LeftName="State" RightName="System.State" MapFromSide="Right" valueMap="StateMapTFS2CQ" />
13: <MappedField LeftName="Description" RightName="System.Description" MapFromSide="Left" valueMap="" />
14: <MappedField LeftName="Description" RightName="System.Description" MapFromSide="Right" valueMap="" />
15: </MappedFields>
16: </FieldMap>
17: </FieldMaps>
18: <ValueMaps>
19: <ValueMap name="StateMapCQ2TFS">
20: <Value RightValue="Active" LeftValue="Assigned" />
21: <Value RightValue="Active" LeftValue="Duplicate" />
22: <Value RightValue="Active" LeftValue="Opened" />
23: <Value RightValue="Active" LeftValue="Submitted" />
24: <Value RightValue="Resolved" LeftValue="Postponed" />
25: <Value RightValue="Resolved" LeftValue="Resolved" />
26: <Value RightValue="Closed" LeftValue="Closed" />
27: </ValueMap>
28: <ValueMap name="StateMapTFS2CQ">
29: <Value RightValue="Active" LeftValue="Assigned" />
30: <Value RightValue="Resolved" LeftValue="Resolved" />
31: <Value RightValue="Closed" LeftValue="Closed" />
32: </ValueMap>
33:
34: </WITSessionCustomSetting>
35: </SettingXml>
36: <SettingXmlSchema />
He tomado como referencia los ejemplos que plantea Willy Peter Shaub en este post, para los elementos completos de migracion TFS2008 hacia TFS2010 pues consultar con El Bruno.
Saludos @ Home
El Bruno
One thought on “[TFSINTEGRATION] HowTo: Definir mapeos personalizados para las migraciones entre TFS2008 y TFS2010”