2010-05-26 23 views
21

Esiste un modo per copiare una definizione di build? Lavoro in una metodologia di controllo del codice sorgente principale che utilizza molti rami diversi che vivono per periodi molto brevi (ad esempio da alcuni giorni a una settimana). Mi piacerebbe davvero copiare un modello di build e cambiare solo la soluzione da costruire. C'è un modo per fare questo?Come posso copiare una definizione di build TFS 2010?

risposta

12

È possibile scrivere un componente aggiuntivo per farlo. Ecco il codice per copiare una definizione di build esistente:

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

ottenuto questo lavoro in LINQPad, impressionante =) – Maslow

0

Dal messaggio non è chiaro quale modello è la definizione di build utilizzata (impostazione predefinita, aggiornamento o gestione lab). Se ho capito bene, ti piacerebbe impostare facilmente una definizione di build che costruisca la stessa soluzione ma da un ramo diverso.

Una cosa che potresti provare invece di copiare la definizione è modificarla. Quando il ramo muore, rinomina la definizione di build (potrebbe essere utile per la creazione di report), modifica la mappatura dell'area di lavoro della build e dovresti eseguirla.

Grazie, Ladislau

1

Ho appena avuto una necessità di copiare costruire le definizioni, e ho trovato la risposta di Jim sopra per essere utile. Tuttavia, essendo nuovo per l'API TFS, avevo bisogno di aiuto per la connessione al server e ottenere la definizione di build esistente attraverso il codice. Questi due collegamenti hanno contribuito a colmare le lacune:

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

ho finito per usare gli strumenti TFS Potere Sept 2010 che contiene Clone comando definizione di compilazione. – devlife

1

È possibile fare clic con il tasto destro del mouse sulla definizione di build e selezionare "clone build definition" per copiare il file di definizione. Puoi quindi modificarlo da lì.

1

Ecco la soltion se si desidera spostare la definizione di compilazione da un team di progetto per altro progetto Team.

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 

    } 
Problemi correlati