tfs - preguntas - tag del lector
TFS2010-Un conjunto de cambios incorrecto aparece en SourceGetVersion (1)
Actualmente estoy configurando un Team Foundation Server 2010 y encontré un comportamiento muy extraño al realizar una compilación:
La situación explicada: Tenemos 2 sucursales.
- Desarrollo
- Principal
Todos los desarrolladores ingresan 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 el brach de Desarrollo, se está ejecutando una compilación continua en cada registro. En la rama principal, una vez al día (en la noche) se activa una construcción.
Ahora suponga que los conjuntos de cambios 1-100 se están fusionando en el brazo principal a las 5 pm, dando el conjunto de cambios 101 como la operación de combinación. Algunos desarrolladores registran los conjuntos de cambios 102-106 después de las 5 en punto en la rama de Desarrollo. Ahora a las 11 pm, la compilación diaria se activa automáticamente y se ejecuta en la rama principal. El último conjunto de cambios de la rama principal es el conjunto de cambios 101. Sin embargo, los detalles de la compilación muestran el conjunto de cambios 106:
Podría imaginar que este comportamiento es intencional, porque si revisa el conjunto 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 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 construcción?
El segundo escenario, en el que el TFS se comporta de manera extraña, es aún peor: al poner en cola una nueva compilación, existe la opción de ingresar el parámetro "Obtener versión", como se muestra en la siguiente imagen:
Si ahora hago clic en "cola", la compilación se desencadena y OTRA VEZ el detalle de la compilación genera el conjunto de cambios 106, aunque específicamente lo configuré para obtener el conjunto de cambios 76.
Pregunta 2: ¿Es esto un error? ¿Hay una revisión o algo para solucionar este problema? ¿O hay alguna bandera de opción que deba ser establecida?
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
EDITAR 1
La estructura de carpetas del Proyecto de Equipo es:
$ ProjectName
- BuildProcessTemplates
- Documentación
- Código fuente
- Desarrollo <- esta es una rama
- Tercera parte
- Fuente
- Principal <- esta es una rama
- Tercera parte
- Fuente
- Desarrollo <- esta es una rama
La construcción solo tira de la rama principal y todo lo que hay debajo de ella.
Editar 2
Aquí hay una imagen de la pestaña Área de trabajo en la definición de compilación:
Finalmente me enteré de lo que está pasando:
Básicamente, el conjunto de cambios que se puede ver en mi imagen 1 es siempre el último conjunto de cambios de toda la Colección de proyectos del equipo . 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, entonces el resumen de compilación mostrará la cadena actualizada. Además, luego se guarda correctamente en la base de datos de la colección.
Lo que he hecho para agregar el número de conjunto de cambios correcto es que he creado una actividad de compilación personalizada que toma la rama que debe construirse como parámetro de entrada. Da salida al conjunto de cambios correcto. La actividad encuentra el conjunto de cambios correcto al conectarse al TFS y descargar el Historial. Luego examina 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());
}
}
}
Llamo a esta actividad lo antes posible (después de la actividad GetBuild).
Básicamente, en la BuildProcessTemplate he agregado un Argumento (cadena) "Rama" que debe rellenarse con una cadena que apunta a la carpeta superior que se está construyendo. La actividad personalizada toma eso como entrada y genera una cadena que es el id de conjunto de cambios correcto. La propiedad BuildDetail.SourceGetVersion será reemplazada por el id de conjunto de cambios correcto.
Me parece realmente extraño que nadie más haya encontrado este problema. No pude encontrar a ninguna persona en internet con el mismo problema. De todos modos, espero que esta respuesta ayude a alguien más en el futuro también.
EDITAR - Escribir el código anterior directamente en Workflow Foundation:
Para obtener el conjunto de cambios correcto utilizando un código más compacto y evitando actividades personalizadas, también es posible utilizar Workflow Foundation directamente. A continuación se muestra el "código" (haciendo exactamente lo que se hace en el código C # anterior):
(1) La actividad GetTeamProjectCollection obtiene la colección actual. Lo estoy guardando dentro de la variable TeamProjectCollection (vea 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 una constructor por defecto o un descriptor de instancia ".
(2) Foreach "changeset" en "TeamProjectCollection.GetService (Of VersionControlServer) .QueryHistory (Branch, VersionSpec.Latest, 0, RecursionType.Full, Nothing, Nothing, Nothing, Integer.MaxValue, False, False, False) .Cast ( De 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) Por lo tanto, estamos iterando sobre todos los conjuntos de cambios y mirando el ChangesetId. Luego guardando el ChangesetId máximo 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".
cristiano