[TFSINTEGRATION] HowTo: Definir mapeos personalizados para las migraciones entre TFS2008 y TFS2010

image47dd1de4

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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.