2010-05-26 17 views
21

¿Hay alguna forma de copiar una definición de compilación? Trabajo en una metodología de control de fuente principal que utiliza muchas ramas diferentes que viven durante períodos muy cortos (es decir, unos pocos días a una semana). Realmente me gustaría copiar una plantilla de construcción y simplemente cambiar la solución para construir. ¿Hay alguna manera de hacer esto?¿Cómo puedo copiar una definición de compilación de TFS 2010?

Respuesta

12

Usted puede escribir un complemento para hacerlo. Aquí está el código para copiar una definición de build existente:

static IBuildDefinition CloneBuildDefinition(IBuildDefinition buildDefinition) 
{ 
    var buildDefinitionClone = buildDefinition.BuildServer.CreateBuildDefinition(
     buildDefinition.TeamProject); 

    buildDefinitionClone.BuildController = buildDefinition.BuildController; 
    buildDefinitionClone.ContinuousIntegrationType = buildDefinition.ContinuousIntegrationType; 
    buildDefinitionClone.ContinuousIntegrationQuietPeriod = buildDefinition.ContinuousIntegrationQuietPeriod; 
    buildDefinitionClone.DefaultDropLocation = buildDefinition.DefaultDropLocation; 
    buildDefinitionClone.Description = buildDefinition.Description; 
    buildDefinitionClone.Enabled = buildDefinition.Enabled; 
    buildDefinitionClone.Name = String.Format("Copy of {0}", buildDefinition.Name); 
    buildDefinitionClone.Process = buildDefinition.Process; 
    buildDefinitionClone.ProcessParameters = buildDefinition.ProcessParameters; 

    foreach (var schedule in buildDefinition.Schedules) 
    { 
     var newSchedule = buildDefinitionClone.AddSchedule(); 
     newSchedule.DaysToBuild = schedule.DaysToBuild; 
     newSchedule.StartTime = schedule.StartTime; 
     newSchedule.TimeZone = schedule.TimeZone; 
    } 

    foreach (var mapping in buildDefinition.Workspace.Mappings) 
    { 
     buildDefinitionClone.Workspace.AddMapping(
      mapping.ServerItem, mapping.LocalItem, mapping.MappingType, mapping.Depth); 
    } 

    buildDefinitionClone.RetentionPolicyList.Clear(); 

    foreach (var policy in buildDefinition.RetentionPolicyList) 
    { 
     buildDefinitionClone.AddRetentionPolicy(
      policy.BuildReason, policy.BuildStatus, policy.NumberToKeep, policy.DeleteOptions); 
    } 

    return buildDefinitionClone; 
} 
+0

tiene esta trabajando en LINQPad, impresionante =) – Maslow

0

De su mensaje no está claro qué plantilla está usando su definición de compilación (por defecto, actualización o gestión de laboratorio). Si entiendo correctamente, le gustaría configurar fácilmente una definición de compilación que construya la misma solución pero desde una rama diferente.

Una cosa que podrías intentar en lugar de copiar la definición es editarla. Cuando la ramificación muere, cambie el nombre de la definición de compilación (podría ayudar con la generación de informes), cambie la asignación del área de trabajo de la compilación y debe hacerlo.

Gracias, Ladislau

1

acabo de tener una necesidad de copiar construir definiciones, y encontré la respuesta de Jim arriba para ser útil. Sin embargo, al ser nuevo en la API de TFS, necesitaba ayuda para conectarme al servidor y obtener la definición de compilación existente a través del código. Estos dos enlaces ayudado a llenar los vacíos:

http://msdn.microsoft.com/en-us/library/bb286958.aspx

http://geekswithblogs.net/jakob/archive/2010/04/26/creating-a-build-definition-using-the-tfs-2010-api.aspx

+0

Terminé usando las herramientas eléctricas TFS Sept 2010, que contiene la copia de comando Definición de build. – devlife

1

Puede hacer clic con el botón derecho en la definición de compilación y seleccionar 'clonar definición de compilación' para copiar el archivo de definición. Luego puede editarlo desde allí.

1

Aquí es el Soltion si desea mover la definición de construcción de un proyecto de equipo de otro proyecto de equipo

public void MoveBuild(string fromTeamProject, string toTeamProject, string buildName, string newBuildName) 
    { 

     var _server = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new 

     Uri("http://Mytfs:8080/defaultcollection")); 

     IBuildServer _buildServer = _server.GetService<IBuildServer>(); 

     var buildDetails = _buildServer.QueryBuildDefinitions(fromTeamProject); 

     foreach (var fromBuild in buildDetails) 
     { 
      if (fromBuild.Name != buildName) continue; 
      var newBuildDefinition = _buildServer.CreateBuildDefinition(toTeamProject); 
      newBuildDefinition.Name = !string.IsNullOrEmpty(newBuildName) ? newBuildName : fromBuild.Name; 

      newBuildDefinition.BuildController = fromBuild.BuildController; 

      // This finds the template to use 
      foreach (var mapping in fromBuild.Workspace.Mappings) 
      { 
       newBuildDefinition.Workspace.AddMapping(
        mapping.ServerItem, mapping.LocalItem, mapping.MappingType, mapping.Depth); 
      } 
      newBuildDefinition.DefaultDropLocation = fromBuild.DefaultDropLocation; 
      newBuildDefinition.Description = fromBuild.Description; 
      // buildDefinition.Workspace.AddMapping(build.Workspace.); 
      newBuildDefinition.Process = _buildServer.QueryProcessTemplates(fromBuild)[2]; 

      newBuildDefinition.ProcessParameters = fromBuild.ProcessParameters; 
      newBuildDefinition.Enabled = false; 
      newBuildDefinition.Save(); 
     }//end of for each loop 

    } 
Cuestiones relacionadas