2011-11-30 11 views
20

estoy poniendo en marcha un Team Foundation Server 2010 y me encontré con un comportamiento muy extraño cuando se realiza una construcción:TFS2010 - conjunto de cambios incorrecto que aparece en SourceGetVersion

La situación explicó: Tenemos 2 Ramas

  • Desarrollo
  • principales

Todos los desarrolladores comprobar en el código en la rama de desarrollo solamente. Una vez por día, el administrador de compilación fusiona algunos conjuntos de cambios en la rama Principal. En Development Brach, se está ejecutando una compilación continua en cada check in. En la rama Principal, una vez por día (en la noche) se desencadena una construcción.

Supongamos ahora que los conjuntos de cambios 1-100 se combinan en la barra principal a las 5 p.m., dando el conjunto de cambios 101 como la operación de fusión. Algunos desarrolladores verifican los conjuntos de cambios 102-106 después de las 5 en punto en la rama Desarrollo. Ahora a las 11 p.m. la compilación diaria se desencadena automáticamente y se ejecuta en la rama principal. El último conjunto de cambios de la rama principal es de cambios 101. Sin embargo, los datos muestran Construir conjunto de cambios 106:

enter image description here

que podía imaginar que este comportamiento se pretende, ya que si se echa un vistazo de cambios 106 en la rama principal, de hecho, obtendrá el contenido del conjunto de cambios 101. Pero sería mucho más legible si este resumen de la compilación mostrara el número correcto.

Pregunta 1: ¿Hay alguna forma de manipular la salida de la información de SourceGetVersion? ¿Tal vez a través de la plantilla de proceso de compilación?

El segundo escenario, en el que el TFS se comporta extraño es aún peor: Cuando cola una nueva construcción, existe la opción de entrar en el parámetro "Comprar", como se muestra en la siguiente imagen:

enter image description here

Si ahora hago clic en "cola", la acumulación se activa y otra vez los detalles de construcción genera el conjunto de cambios 106, aunque me puse específicamente para obtener conjunto de cambios 76.

pregunta 2: ¿es esto un error? ¿Hay una revisión o algo para arreglar esto? ¿O hay alguna bandera de opción que deba establecerse?

Espero que alguien sepa más sobre esto. Realmente no creo que esto sea un error, porque es una funcionalidad tan vital que otras personas deben haberlo encontrado antes.

¡Gracias por cualquier ayuda! Cristiano

EDIT 1

La estructura de carpetas del proyecto de equipo es:

$ Nombre del Proyecto

  • BuildProcessTemplates
  • Documentación
  • Código Fuente
    • < Desarrollo - esto es una rama
      • 3RDPARTY
      • Fuente
    • principal < - esto es una rama
      • 3RDPARTY
      • Fuente

La construcción solo tira de la rama Principal y todo lo que está debajo.

EDIT 2

Aquí está una foto de la ficha de trabajo en la definición de construcción: enter image description here

+0

1) ¿Puede proporcionar más detalles sobre "manipular la propiedad SourceGetVersion"? ¿Qué quieres hacer? 2) No tengo acceso al código fuente en este momento para ver qué sucedió en este escenario, pero ¿la compilación obtiene la versión correcta y muestra el número de conjunto de cambios "incorrecto" o la compilación obtiene la versión incorrecta? –

+0

@DuatLe - Al manipular me refiero a cambiar el número que emite, es decir, reemplazar la "Copia activada de ... para el conjunto de cambios 106" por "... para el conjunto de cambios 101". El código fuente que realmente descarga parece ser correcto. Solo está mostrando el incorrecto. Dentro de la base de datos en el servidor TFS, también almacena la información incorrecta del conjunto de cambios. – Christian

+0

¿Tu construcción está tirando solo de la rama Principal del control de fuente o Main y Development? –

Respuesta

22

Finalmente descubrí lo que está pasando:

Básicamente el conjunto de cambios que pueden ser visto en mi imagen 1 es siempre el último conjunto de cambios de toda la Team Project Collection. Es la propiedad "SourceGetVersion" en el objeto "BuildDetails" de tipo "IBuildDetails".

Creo que este es un error que se puede solucionar: Si cambia BuildDetails.SourceGetVersion (que es una cadena) a algún otro valor, el resumen de compilación mostrará la cadena actualizada. Además, luego se guarda correctamente en la base de datos de recopilación.

Lo que he hecho para agregar el número correcto de conjunto de cambios es que he creado una actividad de compilación personalizada que toma la rama que debe construirse como parámetro de entrada. Emite el conjunto de cambios correcto. La actividad descubre el conjunto de cambios correcto al conectarse al TFS y descargar el Historial. Luego mira todos los elementos en el historial y genera el mayor número de conjunto de cambios. Aquí está el código de esa actividad:

using System.Activities; 
using System.Collections; 
using System.Net; 
using Microsoft.TeamFoundation.Client; 
using Microsoft.TeamFoundation.VersionControl.Client; 
using Microsoft.TeamFoundation.Build.Client; 

namespace SourceGetVersionActivity 
{ 
    [BuildActivity(HostEnvironmentOption.All)] 
    public sealed class SourceGetVersionActivity : CodeActivity<string> 
    { 
     // Define an activity input argument of type string 
     public InArgument<string> Branch { get; set; } 

     // If your activity returns a value, derive from CodeActivity<TResult> 
     // and return the value from the Execute method. 
     protected override string Execute(CodeActivityContext context) 
     { 
      // Obtain the runtime value of the Text input argument 
      string branch = context.GetValue(this.Branch); 

      ICredentials account = new NetworkCredential("Useranme", "password", "domain"); 

      // connect/authenticate with tfs 
      TeamFoundationServer tfs = new TeamFoundationServer("http://tfs:8080/tfs/CollectionName", account); 
      tfs.Authenticate(); 

      // get the version control service 
      VersionControlServer versionControl = (VersionControlServer)tfs.GetService(typeof(VersionControlServer)); 

      IEnumerable changesets = versionControl.QueryHistory(branch, VersionSpec.Latest, 0, RecursionType.Full, 
       null, null, null, int.MaxValue, false, false, false, false); 

      int maxVersion = 0; 

      foreach (Changeset c in changesets) 
      { 
       if (c.ChangesetId > maxVersion) 
       { 
        maxVersion = c.ChangesetId; 
       } 
      } 

      return string.Concat('C', maxVersion.ToString()); 
     } 
    } 
} 

que llamo esta actividad tan pronto como sea posible (después de la actividad GetBuild).

Básicamente en BuildProcessTemplate He agregado una Argument (string) "Branch" que debe rellenarse con una cadena que apunta a la carpeta superior que se está construyendo. La actividad personalizada lo toma como entrada y emite una cadena que es la id del conjunto de cambios correcto. El BuildDetail.La propiedad SourceGetVersion será reemplazada por la id del conjunto de cambios correcto.

Me parece realmente extraño que nadie más parece haber encontrado este problema. No pude encontrar a ninguna persona en Internet con el mismo problema. De todos modos, espero que esta respuesta también ayude a alguien más en el futuro.

EDITAR - Escribir el código directamente en Workflow Foundation:

Para obtener el conjunto de cambios correcta utilizando un código más compacto y evitando actividades personalizados, también es posible utilizar directamente Workflow Foundation. A continuación se muestra el "código" (haciendo exactamente lo que está hecho en código C# arriba):

enter image description here

(1) La actividad GetTeamProjectCollection tiene la colección actual. Lo guardo dentro de la variable TeamProjectCollection (ver la parte inferior de la imagen). Importante: la variable debe definirse dentro de esta secuencia, si la define en el ámbito externo, se producirá un error: "No se puede serializar el tipo 'Microsoft.TeamFoundation.Client.TfsTeamProjectCollection'. Verifique que el tipo sea público y que tenga un constructor por defecto o un descriptor de instancia ".

(2) Foreach "conjunto de cambios" en "TeamProjectCollection.GetService (De VersionControlServer) .QueryHistory (Rama, VersionSpec.Latest, 0, RecursionType.Full, nada, nada, nada, Integer.MaxValue, Falso, falso, falso) .Cast (Of Changeset)() " El TypeArgument del bucle Foreach es" Microsoft.TeamFoundation.VersionControl.Client.Changeset ". Esta expresión obtiene el objeto de control de versión de la colección, lo llama método "QueryHistory" que devuelve un IEnumerable con todos los conjuntos de cambios.

(3) Así que estamos iterando sobre todos los conjuntos de cambios y mirando el ChangesetId. A continuación, guardando el Maximum ChangesetId en la variable "maxId".

(4) Al final, BuildDetails.SourceGetVersion = "C" + maxId.ToString(). La "C" indica que la versión es un conjunto de cambios.

¡Espero que alguien encuentre útil esta pieza de "Código"!

Christian

+1

+1 Muy buena explicación de este problema no obvio. –

+2

Solución increíble (y sí, este es un comentario extraño, pero la solución lo garantiza ...) –

+2

Gran explicación del problema y buenas soluciones, aunque solo funcionarán para compilaciones del último código. No funcionarán para compilaciones de Check In controlado o para compilaciones personalizadas, donde la versión que se está creando no es la última. – Ivan

Cuestiones relacionadas